问题现象:
客户反馈早上8.30-8.45业务推流期间,数据库夯住。其他时间数据库正常。
登录排查发现存现很多的慢sql,且存在死锁信息。
执行查看慢sql的执行计划,发现sql并不慢,而且执行计划也很好。
由于监控信息不全,通过sar -A -f /var/log/sa/sa07查看到io问题明显,等待队列高达19,一次io需要50ms左右
继而排查发现高并发时,同一个sql大量执行,存在的状态为sending data和copying to tmp table,查看对应的执行计划中使用了filesort,故问题很清晰。
继续查看sa07日志,发现出现问题时,swap使用完了
问题解决:
重启数据库,swap并发释放,后续通过重启服务器,问题解决。
后续优化:
1、配置sawp回收参数
登录系统vi /etc/sysctl.conf 配置文件
vm.swappiness=10
vm.dirty_background_ratio=5
vm.dirty_ratio=40
vm.dirty_writeback_centisecs= 100
vm.dirty_expire_centisecs= 500
保存退出执行sysctl -p 立即生效
2、注释掉innodb_thread_concurrency=16和thread_concurrency=8参数;
3、简易性能收集脚本
#/bin/bash nohup vmstat 1 1000 >> /tmp/cpu.log & nohup iostat -dxk 1 1000 >> /tmp/io.log & nohup top -bn 1000 >> /tmp/top.log & nohup iotop -obn 1000 >> /tmp/iostat.log & nohup sar -n DEV 1 1000 >> /tmp/bond.log & USER=root PASSWORD=root SOCKET=/tmp/mysql.sock for((i=1;i<=500;i++)); do netstat -i >> /tmp/nt.log /usr/local/mysql/bin/mysql -u$USER -p$PASSWORD -S $SOCKET -e "tee /tmp/mysqlprocess.log;show processlist;select '\n';" /usr/local/mysql/bin/mysql -u$USER -p$PASSWORD -S $SOCKET -e "tee /tmp/engine.log;show engine innodb status \G;select '\n'" #/usr/local/mysql/bin/mysql -u$USER -p$PASSWORD -S $SOCKET -e "tee /tmp/mysqltrx.log;select now(),(UNIX_TIMESTAMP(now()) - UNIX_TIMESTAMP(a.trx_started)) diff_sec,b.id,b.user,b.host,b.db,d.SQL_TEXT from information_schema.innodb_trx a inner join information_schema.PROCESSLIST b on a.TRX_MYSQL_THREAD_ID=b.id and b.command = 'Sleep' inner join performance_schema.threads c ON b.id = c.PROCESSLIST_ID inner join performance_schema.events_statements_current d ON d.THREAD_ID = c.THREAD_ID;select '\n'" sql/bin/mysql -u$USER -p$PASSWORD -S $SOCKET -e "tee /tmp/mysqltrx.log;select now();select * from information_schema.innodb_trx;select '\n'" sleep 5 done |