Mysql占用CPU过高如何优化

Mysql占用CPU过高如何优化,第1张

CPU占用过高诊断思路

mpstat -P ALL 1,查看cpu使用情况,主要消耗在sys即os系统调用上

perf top,cpu主要消耗在_spin_lock

生成perf report查看详细情况

CPU主要消耗在mutex争用上,说明有锁热点。

采用pt-pmp跟踪mysqld执行情况,热点主要集中在mem_heap_alloc和mem_heap_free上。

Pstack提供更详细的API调用栈

Innodb在读取数据记录时的API路径为

row_search_for_mysql --》row_vers_build_for_consistent_read --》mem_heap_create_block_func --》mem_area_alloc --》malloc --》  _L_unlock_10151 --》__lll_unlock_wait_private

row_vers_build_for_consistent_read会陷入一个死循环,跳出条件是该条记录不需要快照读或者已经从undo中找出对应的快照版本,每次循环都会调用mem_heap_alloc/free。

而该表的记录更改很频繁,导致其undo history list比较长,搜索快照版本的代价更大,就会频繁的申请和释放堆内存

Linux原生的内存库函数为ptmalloc,malloc/free调用过多时很容易产生锁热点。

当多条 SQL 并发执行时,会最终触发os层面的spinlock,导致上述情形。

解决方案

将mysqld的内存库函数替换成tcmalloc,相比ptmalloc,tcmalloc可以更好的支持高并发调用。

修改my.cnf,添加如下参数并重启

[mysqld_safe]malloc-lib=tcmalloc

上周五早上7点执行的 *** 作,到现在超过72小时,期间该实例没有再出现cpu长期飙高的情形。

以下是修改前后cpu使用率对比

cpu占用过高解决方法如下:

1、同时按住键盘上Ctrl+Alt+Delete,点击“启用任务管理器(T)”就可以看到CPU使用率是多少了。(这里只有27%,因为没有运行游戏,后台程序也没有打开很多。)

2、按组合键Win+R进入运行窗口输入“msconfig”点击“启动”,把不需要的程序禁用掉,程序不要打开太多,就可以减少CPU的使用率了。

生产环境中,MySQL 不经意间吃掉全部的内容,然后开始吃掉 SWAP,性能一降再降,怎么办?

可以从下面三点查看原因:

MySQL 使用内存,有两个途径。

永久占用的内容

比如全局缓冲区(Global Buffer)类别,是在服务器启动期间从 *** 作系统获得的,不会释放到任何一个别的进程。

动态请求的内存

线程缓冲区由MySQL使用,它是在处理新查询时从 *** 作系统请求的内存。在执行查询之后,该内存被释放回 *** 作系统。

这意味着 MySQL 的内存使用,是 全局缓冲区 加上 线程缓冲区 以及 允许的最大连接数

对于专用数据库服务器,该值需要保持在服务器内存的90%以下。在共享服务器的情况下,它应该保持在服务器内存的50%以下。

检查一下 MySQL 设置,有助于确定内存使用情况,从而为 MySQL 分配合适的值。

一个近似的公式:

当网站受到攻击时,有可能在短时间内建立异常高的连接数量。MySQL 中的 PROCESSLIST 可用于检测顶级用户并阻止对滥用连接的访问。

找出查询需要很长时间才能执行的语句,因为这些查询需要进一步优化服务器才能更好地执行,可以通过服务器查询日志进行识别。由于查询速度慢,导致磁盘读取较多,导致内存和CPU使用率较高,影响服务器性能。

最后,到了加内存条的时候了。虽然在优化数据库设置之后,服务器会不断地路由到使用交换内存,但也必须增加内存。俗话说:“巧妇难为无米之炊”,就是这个意思。

上面说的这些方向,大家可以在实际 *** 作中验证体会,希望大家在数据库优化的路上,麻溜顺畅,砥砺前行。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/8314370.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-15
下一篇 2023-04-15

发表评论

登录后才能评论

评论列表(0条)

保存