当前位置: 首页
数据库
mysql如何处理由于Swap导致的性能下降_调整内核参数vm.swappiness

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

热心网友 时间: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在分布式系统中实现mysql事务一致性_架构设计思考

mysql在分布式系统中实现mysql事务一致性_架构设计思考

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

时间:2026-04-18 12:10
MySQL怎样利用触发器自动维护库存余量_实现库存加减逻辑自动化

MySQL怎样利用触发器自动维护库存余量_实现库存加减逻辑自动化

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

时间:2026-04-18 12:05
MySQL中如何使用SUBSTRING截取字符串_MySQL常用文本函数

MySQL中如何使用SUBSTRING截取字符串_MySQL常用文本函数

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

时间:2026-04-18 11:15
oracletrigger 是什么?基础说明与使用场景

oracletrigger 是什么?基础说明与使用场景

数据库中的自动化哨兵:初识触发器在数据库管理系统中,触发器是一种特殊类型的存储过程,它被设计为在特定事件发生时自动执行。可以将其想象为数据库中的一个自动化哨兵或规则引擎,它时刻监控着数据表的状态。当预定义的数据修改操作发生时,触发器便会自动触发,执行其中封装的一系列SQL语句或业务逻辑。这种机制的核

时间:2026-04-18 10:47
oracletrigger 教程:常见用法与操作步骤

oracletrigger 教程:常见用法与操作步骤

Oracle触发器的基础概念在Oracle数据库系统中,触发器是一种特殊类型的存储程序,它与特定的表或视图相关联,并在指定的事件发生时自动执行。这些事件通常包括对表数据的插入、更新或删除操作。触发器的主要作用在于增强数据完整性、实施复杂的业务规则、自动记录审计信息以及同步相关数据。与应用程序中编写的

时间:2026-04-18 10:45
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 日榜
  • 周榜
  • 月榜
热门教程
更多
  • 游戏攻略
  • 安卓教程
  • 苹果教程
  • 电脑教程