Linux 内核虚拟内存管理:Dirty Ratio 与 Swapiness 生产调优
【摘要】 一、Linux 脏页回写与内存回收机制当 Linux 系统中的进程执行磁盘写入操作时,数据首先被写入内核内存的 Page Cache(页面缓存)中,变为“脏页”(Dirty Pages)。内核依靠 kswapd 与 flush 守护线程在后台将脏页平稳刷新至物理磁盘。若参数配置不当,写入高峰期可能触发内核强制前台刷盘(Synchronous Write),导致整个系统的 I/O 线程出现长达...
一、Linux 脏页回写与内存回收机制
当 Linux 系统中的进程执行磁盘写入操作时,数据首先被写入内核内存的 Page Cache(页面缓存)中,变为“脏页”(Dirty Pages)。内核依靠 kswapd 与 flush 守护线程在后台将脏页平稳刷新至物理磁盘。若参数配置不当,写入高峰期可能触发内核强制前台刷盘(Synchronous Write),导致整个系统的 I/O 线程出现长达数十秒的卡顿停滞。
二、核心虚拟内存参数剖析
# /etc/sysctl.d/99-vm-tuning.conf
# 脏页占用物理内存达到 10% 时,后台线程开始异步回写
vm.dirty_background_ratio = 10
# 脏页占用物理内存达到 20% 时,进程自身必须阻塞并强制执行同步写入
vm.dirty_ratio = 20
# 脏页在内存中最长保留 30 秒(单位厘秒:3000)
vm.dirty_expire_centisecs = 3000
# 内核唤醒回写线程的周期为 5 秒
vm.dirty_writeback_centisecs = 500
# 优化内存换页积极性(swappiness)
# 在生产数据库服务器上建议设为 1~10,优先回收页缓存而非换出进程匿名内存
vm.swappiness = 10
# 控制内核内存过度分配策略 (0: 启发式过度分配)
vm.overcommit_memory = 1
三、大内存服务器下的绝对字节阈值配置
在配备 64GB~256GB 物理内存的云服务器上,直接使用比例参数可能导致单个阈值过大(例如 256GB 的 10% 为 25.6GB,单次刷入磁盘可能引发严重 I/O 阻塞)。此时应改用基于字节的精确配置:
# 设定后台刷盘阈值为 2GB,强制同步刷盘阈值为 4GB
vm.dirty_background_bytes = 2147483648
vm.dirty_bytes = 4294967296
四、验证与监控实战
利用 grep -i dirty /proc/meminfo 实时查看当前系统脏页总量,配合 vmstat 1 观察 bi(块读出)与 bo(块写入)指标,确保磁盘 I/O 维持在平稳状态,彻底告别写入爆发期系统无响应隐患。
本文发布于 2026-11-04,由自动化系统自动调优发布。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)