Linux 虚拟内存参数调优指南

详解 Linux 虚拟内存参数调优,设置 vm.swappiness=10、vm.dirty_ratio、vm.dirty_background_ratio 以减少不必要的 Swap 使用,覆盖参数含义、计算与持久化配置,含 Ubuntu 22.04 实测回显。

Linux性能优化与调优虚拟内存内核参数2026/09/29

Linux 虚拟内存参数调优指南

目标:调优 Linux 虚拟内存(VM)内核参数,将 vm.swappiness 设为 10、合理配置 vm.dirty_ratio 与 vm.dirty_background_ratio,减少不必要的磁盘 Swap 使用,改善交互延迟与磁盘写放大。本文命令在 Ubuntu 22.04(内核 6.8.0-generic)实测。

环境信息

  • 操作系统:Ubuntu 22.04.5 LTS;内核:6.8.0-138-generic
  • 实测默认值:
    • vm.swappiness = 60
    • vm.dirty_ratio = 20
    • vm.dirty_background_ratio = 10
    • vm.min_free_kbytes = 67584
  • 查看内存:free -h 显示 Mem 15Gi / Swap 2.0Gi

前置条件

  • root 权限。
  • 理解服务器内存模型:物理内存 → 页缓存(page cache)→ 匿名页 → SWAP。

参数原理

vm.swappiness(Swap 倾向度)

控制内核将匿名内存页换出到 Swap 的倾向。范围 0-100:

  • 0:尽可能不换出匿名页(仅内存极度不足才换出)。
  • 60:Ubuntu 默认,较积极使用 swap。
  • 100:非常激进换出。

数据库 / 高可用服务建议调到 10(内存优先,避免把频繁访问的热数据换到磁盘导致抖动)。

# 查看
sysctl vm.swappiness
# vm.swappiness = 60

# 临时设置
sysctl -w vm.swappiness=10
# vm.swappiness = 10

💡 说明:swappiness 越小,越倾向于保留匿名页在内存、优先回收页缓存;swappiness 越大,越倾向于把匿名页换到 swap 以释放内存装更多页缓存。

vm.dirty_ratio 与 vm.dirty_background_ratio(脏页回写)

脏页(dirty pages)是进程已写入但尚未落盘的内存页。两个比例上限默认为物理内存的百分比:

  • vm.dirty_background_ratio(默认 10):脏页占比达到该值时,内核在后台异步把脏页刷盘(不阻塞应用)。
  • vm.dirty_ratio(默认 20):当脏页占比达到该值时,发起同步刷盘,应用写入会阻塞直到落盘。
sysctl vm.dirty_ratio vm.dirty_background_ratio
# vm.dirty_ratio = 20
# vm.dirty_background_ratio = 10

# 临时调整
sysctl -w vm.dirty_background_ratio=5
sysctl -w vm.dirty_ratio=10

⚠️ 注意:dirty_ratio 调小会在磁盘繁忙时更早触发同步刷盘,牺牲突发写吞吐换写盘平稳;写入密集场景需权衡 IOPS 余量,避免频繁阻塞。

生产持久化配置

写入 /etc/sysctl.d/99-vm-tune.conf:

# 99-vm-tune.conf —— 虚拟内存与脏页优化
# 减少 Swap 使用:内存优先,适合数据库/应用服务
vm.swappiness = 10
# 后台刷盘阈值(脏页占物理内存百分比)
vm.dirty_background_ratio = 5
# 同步刷盘触发阈值
vm.dirty_ratio = 10
# 预留最小空闲内存(单位 KB),防止内存耗尽时申请失败
vm.min_free_kbytes = 67584
# 尽力立即释放未被使用的页缓存,减少 swap 抖动(可选)
# vm.vfs_cache_pressure = 50

加载与验证:

sysctl -p /etc/sysctl.d/99-vm-tune.conf
sysctl vm.swappiness vm.dirty_ratio vm.dirty_background_ratio

💡 说明:vm.vfs_cache_pressure(默认 100)控制内核回收目录/索引节点的倾向,调低到 50 可以让内核更倾向保留这些缓存,减少文件访问延迟,可按需启用。

常见问题

Q:swappiness=10 会不会导致内存高占用? A:不会导致泄漏;它只是降低换出倾向。若物理内存充足,应用可充分使用内存;压力过大时仍会换出。

Q:调整脏页比例后写性能下降? A:dirty_ratio 过小会在写盘速度跟不上时频繁同步阻塞。建议结合 iostat 观察 %util 决定合适阈值,或改用 vm.dirty_bytes/vm.dirty_background_bytes 精确控制字节数。

Q:数据库适合禁止 swap 吗? A:业内常见做法是把 swappiness 调到 0~10 并为 swap 保留少量容量作内存压力缓冲,而不是完全禁用(部分发行版支持 swapoff 但风险较高)。

卸载方式

删除 /etc/sysctl.d/99-vm-tune.conf 并 sysctl --system 恢复默认。

参考链接

  • 内核文档:Documentation/admin-guide/sysctl/vm.rst
  • man 5 proc(/proc/sys/vm/ 各项说明)