首页 游戏 软件 资讯 排行榜 专题
首页
数据库
mysql如何处理由于Swap导致的性能下降_调整内核参数vm.swappiness

mysql如何处理由于Swap导致的性能下降_调整内核参数vm.swappiness

热心网友
51
转载
2026-04-18

MySQL响应慢但CPU占用不高?Swap交换分区可能是罪魁祸首,别急着修改my.cnf

你是否遇到过MySQL数据库查询变慢,但查看监控时CPU使用率却不高的情况?这很常见。许多人的第一反应是去调整my.cnf中的缓存参数,但实际上,一个更隐蔽的“性能杀手”常常被忽视——Swap(交换分区)。在绝大多数类似场景下,问题根源都指向它。

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

mysql如何处理由于Swap导致的性能下降_调整内核参数vm.swappiness

核心诊断思路:当MySQL出现卡顿而CPU利用率低时,90%的可能性是Swap交换在影响性能。首要步骤不是直接禁用Swap,而是检查一个关键的内核参数:vm.swappiness,确认其是否被设置为像60这样的“高风险”默认值。

第一步:诊断你的vm.swappiness值是否处于危险区间

打开服务器终端,运行以下命令进行查看:

sysctl vm.swappiness

如果输出结果是60或更高,那么你的数据库服务器很可能已经踩中了一个常见的性能配置陷阱。这个值对于个人桌面系统或许可以接受,但对于MySQL这类极度依赖内存速度的数据库服务而言,vm.swappiness=60意味着什么?它指示内核:当系统内存使用率超过40%时,就可以开始积极地将内存中的匿名页(例如InnoDB缓冲池中至关重要的数据页)转移到Swap分区。要知道,磁盘I/O的速度比内存慢3到4个数量级,由此带来的性能损失是巨大的。

这里需要明确一个关键概念:vm.swappiness这个参数值本身并不表示Swap当前是否正在被使用,它只代表内核“倾向于”使用Swap的积极程度。因此,即使你使用free -h命令看到SwapUsed显示为0,只要这个倾向值仍然是60,一旦系统内存压力增大,Swap这个“阀门”随时可能被打开。

  • 安全阈值是多少? 对于生产环境的MySQL数据库服务器,建议将vm.swappiness设置在110之间。1最为激进,表示尽可能避免交换;10则相对稳妥,为系统保留一点弹性空间。
  • 误区澄清:设置为0就一劳永逸? 并非如此。vm.swappiness=0并不会完全禁止Swap,它只是告诉内核“除非内存即将耗尽(触发OOM之前),否则不要考虑使用Swap”。Swap设备本身依然存在,一旦触发交换,swpd(已用交换区)非零、si/so(每秒换入/换出)指标飙升的情况仍然会发生。
  • 云服务器特别注意: 例如在Ubuntu 20.04及之后的版本中,默认会创建一个/swap.img文件作为交换分区。仅仅修改sysctl参数可能不够彻底,建议使用swapon --show命令进行确认,如果输出为空,才表示Swap确实未被激活。

第二步:临时调低vm.swappiness,快速验证优化效果

线上环境通常无法等待重启,我们需要立即调整参数并观察效果。执行以下命令,将倾向值降至最低:

sudo sysctl vm.swappiness=1

执行后,请立即打开另一个终端窗口,运行vmstat 1命令,重点观察si(每秒从磁盘换入的内存量)和so(每秒换出到磁盘的内存量)这两列数据。如果调整前这两项数值持续高于1000 KB/s,调整后迅速下降至0或个位数,那么基本可以断定,Swap就是导致数据库性能卡顿的根本原因。

  • 为什么推荐使用sysctl命令? 虽然直接执行echo 1 > /proc/sys/vm/swappiness也能生效,但sysctl命令会进行参数取值范围的校验,可以避免因输入错误导致内核静默失败。
  • 调整后没有变化? 请检查MySQL是否运行在容器内。如果MySQL部署在Docker容器中,启动时若未添加--memory-swappiness=1参数,宿主机上的设置对容器是无效的。
  • 防止参数回滚: 调整后,可以使用watch -n1 'cat /proc/sys/vm/swappiness'命令监控几秒钟,防止一些自动化运维脚本或配置将参数改回原值。

第三步:固化配置,让修改永久生效

临时生效仅用于测试,要彻底解决问题,必须修改系统配置文件。编辑系统参数配置文件:

sudo nano /etc/sysctl.conf

在文件末尾添加如下一行配置:

vm.swappiness=1

保存并退出后,务必执行以下命令使配置立即生效:

sudo sysctl -p

这一步至关重要,不可遗漏!许多运维团队修改了配置文件却忘记执行重载命令,导致服务器重启后参数恢复为默认值60,问题依旧存在。

  • 关于配置文件路径: 不建议随意在/etc/sysctl.d/目录下创建新的.conf文件,因为不同Linux发行版的配置加载顺序可能不确定,sysctl -p命令可能不会读取这些文件。
  • 双重验证: 修改完成后,使用sysctl vm.swappiness确认输出为1,同时使用cat /etc/sysctl.conf | grep swappiness确保配置行已正确写入。
  • 自动化部署注意事项: 使用Ansible、SaltStack或Puppet等自动化运维工具进行批量部署时,任务中必须包含sysctl reload或等效的步骤,不能仅仅复制配置文件了事。

终极解决方案:调整参数后仍卡顿?说明内存尚未被真正“锁定”

调低vm.swappiness只是降低了内核交换内存的“倾向性”,并不等同于MySQL进程的内存就绝对安全了。要根治Swap导致的数据库性能问题,通常需要三管齐下,采取组合策略:

  • 1. 配置内存锁定: 编辑/etc/security/limits.conf文件,添加以下两行,允许MySQL进程锁定内存,防止其被交换到磁盘:
    mysql soft memlock unlimited
    mysql hard memlock unlimited
  • 2. 修改InnoDB刷盘策略: 在MySQL配置文件my.cnf[mysqld]配置段中,增加一行:
    innodb_flush_method=O_DIRECT
    这可以绕过操作系统的页面缓存,避免双缓冲,从而减轻对系统缓存的压力。
  • 3. 验证内存锁定是否生效: 重启MySQL服务后,立即执行以下命令进行检查:
    prlimit -p $(pgrep mysqld) | grep memlock
    输出结果中的memlock值必须是unlimited,否则说明内存锁配置未能成功生效。

这里存在一个最容易被忽略的“坑”:即使配置了memlock,但如果my.cnf中的innodb_buffer_pool_size设置过大(例如超过了物理内存的85%),MySQL服务可能会启动失败。而且,这种失败有时是“静默”的——通过systemctl status mysql命令可能看到服务状态为“active (running)”,但实际上需要查看系统日志(使用journalctl -u mysql)才能发现类似Cannot allocate memory的错误信息。因此,在调整InnoDB缓冲池大小时,务必为操作系统内核及其他关键进程预留充足的内存空间。

来源:https://www.php.cn/faq/2347289.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

mysql如何为CI/CD流水线创建账号_分配自动化部署专用权限
数据库
mysql如何为CI/CD流水线创建账号_分配自动化部署专用权限

MySQL CI CD 自动化部署账号权限配置最佳实践:遵循最小权限原则,保障数据库安全 MySQL 创建最小权限部署账号要避开 root 和 ALL PRIVILEGES 为 CI CD 流水线直接分配 root 账号或使用 GRANT ALL PRIVILEGES 授权,等同于将数据库最高控制权

热心网友
04.18
mysql在分布式系统中实现mysql事务一致性_架构设计思考
数据库
mysql在分布式系统中实现mysql事务一致性_架构设计思考

MySQL分布式事务一致性架构设计:核心挑战与解决方案 首先需要明确一个核心观点:MySQL数据库本身并不原生支持跨数据库或跨服务器实例的分布式事务一致性保障。这并非简单的配置调整可以解决的问题,而是源于其架构设计上的根本性限制——MySQL没有内置的全局事务协调器(如XA协议协调器),也不直接参与

热心网友
04.18
MySQL怎样利用触发器自动维护库存余量_实现库存加减逻辑自动化
数据库
MySQL怎样利用触发器自动维护库存余量_实现库存加减逻辑自动化

MySQL触发器:如何优雅地实现库存自动加减逻辑 你是否正在寻找一种可靠的数据库方案来实现库存自动管理?MySQL的AFTER INSERT和AFTER DELETE触发器正是构建这一“自动化流水线”的核心技术。其关键在于:必须通过NEW或OLD关键字动态引用行数据,绝对避免在触发器代码中硬编码商品

热心网友
04.18
MySQL中如何使用SUBSTRING截取字符串_MySQL常用文本函数
数据库
MySQL中如何使用SUBSTRING截取字符串_MySQL常用文本函数

MySQL字符串截取:SUBSTRING SUBSTR MID函数详解与中文乱码解决方案 SUBSTRING函数的三种等价形式与核心语法规则 在MySQL数据库操作中,字符串截取功能主要通过SUBSTRING()函数实现,该函数还有两个完全等价的别名:SUBSTR()和MID()。这三种写法在功能上

热心网友
04.18
mysql如何处理由于Swap导致的性能下降_调整内核参数vm.swappiness
数据库
mysql如何处理由于Swap导致的性能下降_调整内核参数vm.swappiness

MySQL响应慢但CPU占用不高?Swap交换分区可能是罪魁祸首,别急着修改my cnf 你是否遇到过MySQL数据库查询变慢,但查看监控时CPU使用率却不高的情况?这很常见。许多人的第一反应是去调整my cnf中的缓存参数,但实际上,一个更隐蔽的“性能杀手”常常被忽视——Swap(交换分区)。在绝

热心网友
04.18

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

领主契约死亡恢复机制是什么-领主契约死亡恢复机制介绍
游戏攻略
领主契约死亡恢复机制是什么-领主契约死亡恢复机制介绍

《领主契约》死亡恢复机制全解析:掌握复活技巧,提升游戏生存率 死亡恢复基础规则详解 在《领主契约》中,角色死亡并非冒险的终点,而是一个战术调整的契机。游戏设定了明确的复活机制:角色倒下后,通常会在最近的安全区域——如城镇的复活祭坛——自动重生。复活后,系统将为角色恢复一定比例的生命值与基础状态,确保

热心网友
04.18
美国加强港口封锁,伊朗威胁发动袭击,谈判前景黯淡
web3.0
美国加强港口封锁,伊朗威胁发动袭击,谈判前景黯淡

美国实施港口封锁,伊朗威胁发动空袭,这使得双边会谈的希望变得渺茫。 你猜怎么着?伊朗在4月30日前停止铀浓缩的可能性,目前来到了 39 2%。没错,比起昨天的21%,这个数字确实有显著上升。 市场的反应总是最直接的。封锁的消息一出,伊朗铀浓缩相关的预测市场一度飙升了16个百分点,冲高至46%,随后才

热心网友
04.18
VectorArt AI
AI
VectorArt AI

VectorArt AI是什么 说到把创意想法快速变成清晰的矢量图形,有一款工具正在引起设计师们的注意:VectorArt AI。它由VectorArt团队打造,专为艺术家、设计师以及所有需要高质量矢量图像的创意人士服务。其核心能力非常直接——你只需用文字描述或简单勾勒草图,它就能在短时间内生成高质

热心网友
04.18
全链网:油价会跌回之前的水平,可能更低
web3.0
全链网:油价会跌回之前的水平,可能更低

全链网报道 4月15日消息,国际原油市场传来新动向。美国总统特朗普公开表示,油价不仅会跌回之前的水平,甚至可能更低。这一表态,无疑给近期波动的能源市场投下了一颗石子。 与此同时,另一则关键信息也浮出水面:沙特方面并未对封锁霍尔木兹海峡的潜在可能性表示反对。霍尔木兹海峡作为全球能源运输的咽喉要道,其任

热心网友
04.18
AnotherPixel ArtAI
AI
AnotherPixel ArtAI

AnotherPixel ArtAI是什么 如果说数字艺术的门槛一直让许多人望而却步,那么AnotherPixel ArtAI的出现,或许就是那把降低门槛的钥匙。这个由开发者Xinshuai Lyu打造的在线工具,巧妙地将前沿的人工智能技术与艺术创作融为一体。它的目标很明确:为艺术家、设计师乃至普通

热心网友
04.18