注册 登录
  • 欢迎访问"运维那点事",推荐使用Google浏览器访问,可以扫码关注本站的"微信公众号"。
  • 如果您觉得本站对你有帮助,那么可以扫码捐助以帮助本站更好地发展。

MySQL主机CPU负载太高解决思路

MySQL FAQ 彭东稳 455次浏览 已收录 0个评论

首先考虑,CPU为什么会占用过高?答案是CPU很忙,那么什么会导致CPU很忙呢?

1. 频繁的上下文切换

2. 计算量巨大

3. 磁盘访问等待严重

4. 死循环

5. 等等,还有我不知道的

遵循上面的分析,可以推导,在MySQL服务器上,如果看到CPU过高,该怎么解决问题?

频繁的上下文切换包括:锁很多,等待处理的线程特别多。这种情况在MySQL服务器上该如何解决呢?

1)锁很多

要减少锁的数量,可以改变隔离级别,MySQL默认隔离级别是read_repeatable,根据需要,如果设置成read_commited,对应内部的锁会减少很多,就会减少CPU使用量,增大TPS。

2)同时工作的线程特别多,CPU的使用率会下降,也会使得CPU占用过高

这时可能想到了thread_concorrency参数,但是这个参数只为Solaris 8以下服务,所以基本用不上 。但是我们可以在Innodb引擎中设置innodb_thread_concurrency来限制正在工作的Innodb引擎内的线程数。其它解决办法,我暂时没用到,不过思想上应该就是如此。

计算量巨大的情况包括:全表扫描,连接过多,SQL语句子查询多,union,排序,function使用不正确等问题。

针对上面的情况就要优化SQL语句,这个问题之后的博文会讲到,这里不做过多的介绍。

死循环不太会有,这里就不提了。

内存碎片会导致CPU过高的问题

公司的一款产品在运行一段时间后会CPU占用很高,后来找原因发现时malloc出现了问题,由于malloc会产生内存碎片,导致CPU使用率过高。

解决办法jemalloc,tcmalloc等,MariaDB不是也用jemalloc了么。


如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。
喜欢 (1)or分享 (0)
关于作者:

您必须 登录 才能发表评论!