一、应急解决办法
在MySQL数据库连接数很多,而且大多属于活跃的状态时MySQL机器基本上负载很高,属于基本上快要死去的状态了. 这时怎么办呢?
有可能两个办法.
第一: 先限制Innodb的并发处理.如果innodb_thread_concurrency = 0 可以先改成 16或是64 看机器压力,如果 非常大,先改成16让机器的压力下来,然后慢慢增达,适应自已的业务. 处理方法:
set global innodb_thread_concurrency=16;
第二: 对于连接数已经超过600或是更多的情况,可以考虑适当的限制一下连接数,让前端报一下错,也别让DB挂了. DB在了,总是可以用来加载一下数据,当数据加载到了nosql里了,慢慢的DB压力也会降下来的. 限制单用户连接数在500以下. 如:
set global max_user_connections=500;
(MySQL随着连接数的增加性能会是下降的,这也是thread_pool出现的原因) 另外对于有的监控程序会读取information_schema下面的表的程序可以考虑关闭下面的参数 innodb_stats_on_metadata=0
set global innodb_stats_on_metadata=0;
这个参数主要防止对读取information_schema时造成大量读取磁盘进行信息统计(如果慢查询中出现关于information_schema中表时,也可以考虑禁用该参数)
二、问题分析
思路:
1、确定高负载的类型 htop,dstat命令看负载高是CPU还是IO
2、监控具体的sql语句,是insert update 还是 delete导致高负载
3、检查mysql日志
4、检查硬件问题
dstat
可以看到具体是哪个用户哪个进程占用了相关系统资源,当前CPU、内存谁在使用
[root@cc ~]# dstat -l -m -r
-c --top-io --top-mem --top-cpu --io/total-
------memory-usage----- --most-expensive- ----most-expensive----
-most-expensive- read writ| used buff cach free| memory
process | i/o process | cpu process 1.90 267 |3399M 178M 3892M 400M|php-fpm:
poo 372M|init 1682k 647k|flush-202:0 0.1 0 72.0 |3399M 178M 3892M 400M|php-fpm:
poo 372M|php-fpm: po 10k 143k|php-fpm:
pool2.0 0 8.00 |3399M 178M 3892M 399M|php-fpm:
poo 372M|nginx: work 228k 229k|php-fpm:
pool0.5 0 88.0 |3399M 178M 3892M 399M|php-fpm:
poo 372M|nginx: work 102k 166k|php-fpm:
pool 11 0 38.0 |3399M 178M 3892M 399M|php-fpm:
poo 372M|php-fpm: po 787k 650B|php-fpm:
pool4.8 0 0 |3399M 178M 3892M 399M|php-fpm:
poo 372M|php-fpm: po 788k 723B|php-fpm:
pool1.8 0 140 |3400M 178M 3892M 399M|php-fpm:
poo 372M|nginx: work 38k 1