首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >[MYSQL] 内存与swap的两极反转

[MYSQL] 内存与swap的两极反转

原创
作者头像
大大刺猬
发布2025-05-09 15:18:45
发布2025-05-09 15:18:45
1380
举报
文章被收录于专栏:大大刺猬大大刺猬

问题现象与分析

起初

前段时间有个Mysql内存问题: swappiness值设置的是10, 内存剩余充足(使用70%), 但swap使用都90+%了. 产生了相关告警. 而这样现象的系统不止一两个. 这就很奇怪了. 明明内存充足, 却非要一个劲的使用swap, 难道是swappiness参数未生效?

有些更极端的例子, 内存使用不到20%, swap都快使用完了, 这种通常是物理内存很大, swap相对低一些.

摇来了原厂咨询, 发现确实是内核BUG, 不止该系统有,其它相同内核(4.x)的系统也都有. 有的厂商已经发布了修复补丁.

BUG原因: 为了更细的控制资源, 用户进程也有swappiness值了, 而这个值可能和全局的swappiness不一样,测试发现会是默认的60(即使全局的swappiness是10) 毕竟为了更好的控制资源嘛.

我们可以使用如下命令查看:

代码语言:shell
复制
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用户启动):

  1. 使用mysql账号启动的mysqld_safe, 内存使用较高, 但swap使用较低.
  2. 使用root账号启动的mysqld_safe, 内存使用不算高, 但swap使用会很高.

也就是使用普通账号启动的时候会去继承全局的swappiness; 使用root账号启动的无法继承全局的swappiness,而是使用默认的60.

没有去看具体的代码, 这些均为猜测.

测试环境说明

操作系统: kylin/rhel8

内核:4.x

mysql: 5.7.44

使用脚本启动mysql,而非服务.

复现过程

没得相关资源, 未能复现.

总结和建议

总结:

  1. 使用root账号启动的进程无法继承全局的swappiness参数,而是使用默认的60
  2. 使用非root账号启动的进程能够继承全局的swappiness参数.

建议:

如果能升级os/内核的话, 当然很好. 不行的话. 保持使用mysql账号启动mysqld也行, 内存使用高也挺好的, 就是告警比较麻烦(也可以调告警线-_-),也可以扩内存.

也可以稍微调高一点swappiness值,然后使用mysql启动. 这样内存和swap使用都不会太高.

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题现象与分析
    • 起初
    • 后来
    • 测试环境说明
  • 复现过程
  • 总结和建议
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档