首先考虑,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了么。