【环境介绍】
系统环境:CentOS Linux 7 (Core) + 5.7.26 MySQL Community Server - GPL
【情况描述】
业务侧反应使用应用跟查询数据库很慢,需要查看是什么原因
【情况分析】
第一次简单分析
使用top查看数据库资源情况:查看数据库kswapd0占用很高的CPU,根据进程名字怀疑主机由于swap导致,调整/proc/sys/vm/swappiness后,重启数据库恢复正常;
第二次分析
没过几天又反馈同样的问题,使用缓慢,仍然查看到kswapd0占用CPU高;
查看swap情况:使用vmstat -s | grep -i page命令观察到并没有使用到swap
同时查看到磁盘的io:观察到性能达到瓶颈,且该磁盘是操作系统盘
同时观察到主机的错误日志:查看到MySQL数据库的内存OOM
查看数据库内存使用情况:初步怀疑是申请内存空间导致缓慢,于是调整数据库内存,同时观察到数据库层面开启了query cache,调整内存同时关闭query cache,同时建议主机测增加内存,重启数据库后恢复正常
由于数据库没有开启performance参数,无法使用SELECT * FROM sys.memory_global_total查看内存,使用参数方式大概查看内存占用,数据库占用5.1G内存
查看数据库日志:
page_cleaner: 1000ms intended loop took **ms. The settings might not be optimal.((flushed="**" , during the time.)
这个警告一般是IO能力不足,或者参数不够优化的结果,从top,iostat查看的磁盘压力一致
第三次分析
过了大概几天,应用侧又反馈数据库使用缓慢:
查看数据库资源,仍然是看到kswapd0占用高的CPU,同时主机磁盘的IO性能跟第二次的一致,查看主机错误日志,这次没有发现MySQL数据库OOM的情况;
查看数据库的占用内存情况,占用了主机的80%,按照这个比例数据库使用不应该这么缓慢,于是查看涉及数据库的配置文件
查看到/etc/sysctl.conf文件中的vm.min_free_kbytes=1048576参数配置是没有在方案中的,于是查看这个参数说明,调整为默认值,使用sysctl -p 生效
这时候主机马上运行正常,最终定位为vm.min_free_kbytes=1048576参数导致主机kswapd0占用CPU高
查看该参数记录
查看操作系统日志没有发现记录
查看history查看到记录信息,咨询主机侧是他们进行了修改
查看官方文档参数解释:
Sysctl vm.min_free_kbytes为内核内存分配保留的内存量。 默认情况下,此值为?67MB
查看Oracle数据库官方建议:
【总结】
1,建议初始化时候关闭query cache;
2,根据实际情况调整主机参数;