多次数据库主机由于vm.min_free_kbytes参数导致kswapd0占用CPU高问题分析

【环境介绍】
  系统环境: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,根据实际情况调整主机参数;

 

posted @ 2020-08-24 17:04  zetan·chen  阅读(1237)  评论(0编辑  收藏  举报