前段时间有个Mysql内存问题: swappiness值设置的是10, 内存剩余充足(使用70%), 但swap使用都90+%了. 产生了相关告警. 而这样现象的系统不止一两个. 这就很奇怪了. 明明内存充足, 却非要一个劲的使用swap, 难道是swappiness参数未生效?
有些更极端的例子, 内存使用不到20%, swap都快使用完了, 这种通常是物理内存很大, swap相对低一些.
摇来了原厂咨询, 发现确实是内核BUG, 不止该系统有,其它相同内核(4.x)的系统也都有. 有的厂商已经发布了修复补丁.
BUG原因: 为了更细的控制资源, 用户进程也有swappiness值了, 而这个值可能和全局的swappiness不一样,测试发现会是默认的60(即使全局的swappiness是10) 毕竟为了更好的控制资源嘛.
我们可以使用如下命令查看:
find /sys/fs/cgroup/ -name "*swappiness*" | xargs -t -i cat {}解决方法:升级os,或者设置上面查询到的每个swappiness的值为需要的值.
提供的解决办法可能不被允许, 对后续swap升高的处理方法是:重启数据库 (还能顺便释放下内存). 看起来也是一切正常. 直到发现有个系统:
重启前: 内存使用70%, swap使用95%
重启后: 内存使用90%, swap使用15%

注: 采数是以"周"为单位的,横坐标是相对的"周"
啊, swap是降了, 但内存为啥涨了呢? 再次使用之前查看各服务/用户的swappiness命令发现: 这个系统竟然存在一个 /sys/fs/cgroup/memory/user.slice/user-uid.slice/memory.swappiness之类的swapiness值. 查看发起该值为10, 和系统的swappiness值一样.
啊, 这和之前测试的咋不一样了呢? 为啥多了个用户级的swappiness呢? 难道是因为是mysql账号启动的mysqld_safe? 使用ps -ef查看发现这套系统是使用mysql启动的mysqld_safe,而其它swap高的系统是使用root启动的mysqld_safe(开机自启)
再抽查了其它几套系统, 发现确实如此, 故得出结论(mysqld均为mysql用户启动):
也就是使用普通账号启动的时候会去继承全局的swappiness; 使用root账号启动的无法继承全局的swappiness,而是使用默认的60.
没有去看具体的代码, 这些均为猜测.
操作系统: kylin/rhel8
内核:4.x
mysql: 5.7.44
使用脚本启动mysql,而非服务.
没得相关资源, 未能复现.
总结:
建议:
如果能升级os/内核的话, 当然很好. 不行的话. 保持使用mysql账号启动mysqld也行, 内存使用高也挺好的, 就是告警比较麻烦(也可以调告警线-_-),也可以扩内存.
也可以稍微调高一点swappiness值,然后使用mysql启动. 这样内存和swap使用都不会太高.
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。