MySQL的CPU使用率飙升到179%的解决过程记录

 

查看线程、连接数

SHOW GLOBAL STATUS like 'Threads_%';

 

发现 Threads_connected | 6 连接数很小,说明不是连接太多的问题

 

查看innodb_buffer_pool_size

SHOW GLOBAL STATUS LIKE 'innodb_buffer_pool_pages_%';

 

Innodb_buffer_pool_pages_free    | 0
发现 Innodb_buffer_pool_pages_free 为 0,则说明 buffer pool 已经被用光,需要增大 innodb_buffer_pool_size

mysql5.7可以动态修改
mysql> set global innodb_buffer_pool_size=268435456;
记得把my.cnf也修改了,避免重启服务器之后之前的设置失效
在mysqld下增加
innodb_buffer_pool_size=268435456

 

查询thread_cache_size设置

show variables like 'thread_cache_size';

 

发现:thread_cache_size 是16

优化方法:
1、mysql> set global thread_cache_size=64
2、编辑/etc/my.cnf 更改/添加
thread_concurrency = 64


做了上面这些优化后,cpu还是飙到170 180 190,没有效果

 

show processlist

show processlist多次后,发现了某些sql语句,最后发现是play表没有加索引,加了索引后,cpu恢复正常

 

附录

--查看MySQL本次启动后的运行时间(单位:秒)
show status like 'uptime';

--查看select语句的执行数
show [global] status like 'com_select';

--查看insert语句的执行数
show [global] status like 'com_insert';

--查看update语句的执行数
show [global] status like 'com_update';

--查看delete语句的执行数
show [global] status like 'com_delete';

--查看试图连接到MySQL(不管是否连接成功)的连接数
show status like 'connections';

--查看线程缓存内的线程的数量。
show status like 'threads_cached';

--查看当前打开的连接的数量。
show status like 'threads_connected';

--查看创建用来处理连接的线程数。如果Threads_created较大,你可能要增加thread_cache_size值。
show status like 'threads_created';

--查看激活的(非睡眠状态)线程数。
show status like 'threads_running';

--查看立即获得的表的锁的次数。
show status like 'table_locks_immediate';

--查看不能立即获得的表的锁的次数。如果该值较高,并且有性能问题,你应首先优化查询,然后拆分表或使用复制。
show status like 'table_locks_waited';

--查看创建时间超过slow_launch_time秒的线程数。
show status like 'slow_launch_threads';

--查看查询时间超过long_query_time秒的查询的个数。
show status like 'slow_queries';