Linux 内核内存调优不是盲目修改参数,而是先监控定位瓶颈,再针对 swap、缓存或分配策略做微调,最后验证稳定性。
先说结论:内存优化必须先确认是否存在交换频繁、缓存积压或分配失败,再调整内核参数,切忌直接套用生产配置。
- 先定位:使用 free、vmstat 确认是物理内存不足还是 swap 频繁读写
- 先做:优先调整 vm.swappiness 降低交换倾向,谨慎使用 drop_caches
- 再验证:观察 vmstat 的 si/so 列及 dmesg 日志,确认无 OOM 且延迟降低
调整前的必要准备
在生产环境修改内核参数前,务必备份当前配置,并确保拥有 root 权限。所有涉及内核参数的命令均需使用 sudo 执行。
# 备份当前 sysctl 配置 sudo cp /etc/sysctl.conf /etc/sysctl.conf.bak.$(date +%F) # 查看内存整体使用情况 sudo free -h # 实时监控内存交换情况(关注 si/so 列) sudo vmstat 1 5 # 查看当前内核内存相关参数 sudo sysctl -a | grep vm.
关键参数与场景建议
不同业务场景对内存行为的容忍度不同,以下是常见场景的参数推荐参考值,请根据实际业务压力测试后调整。
| 场景类型 | vm.swappiness | vm.overcommit_memory | 说明 |
|---|---|---|---|
| 数据库 (MySQL/Oracle) | 1-10 | 2 (需谨慎) | 尽量避免 swap,防止抖动 |
| Web 应用/通用服务 | 30-60 | 0 或 1 | 平衡缓存与交换 |
| Java 应用 (JVM) | 10-30 | 1 | 配合 Xmx 限制,避免 OOM Killer |
配置修改与生效
临时修改立即生效但重启失效,永久修改需写入配置文件。建议先在测试环境验证临时命令,确认无误后再写入配置。
# 临时降低 swap 使用倾向(默认通常为 60) sudo sysctl -w vm.swappiness=10 # 永久配置示例:编辑 /etc/sysctl.conf # 在文件末尾添加以下内容 vm.swappiness = 10 vm.overcommit_memory = 1 # 使配置生效 sudo sysctl -p
验证与监控
调整后需持续观察系统状态,确认无副作用。
- 监控交换:运行
sudo vmstat 1,观察 si/so 列是否归零或显著减少。 - 检查 OOM:执行
dmesg -T | grep -i oom,确认没有发生内存溢出杀死进程的情况。 - 业务指标:对于数据库应用,观察业务延迟指标是否平稳。
- 服务重启:若调整了大页或调度策略,需重启相关服务使配置完全生效。
高风险操作警示
以下操作存在较高风险,请务必理解后果后再执行。
1. 慎用 drop_caches
执行echo 3 | sudo tee /proc/sys/vm/drop_caches会强制释放缓存,可能导致瞬间 IO 飙升,严重影响业务性能。仅建议在测试环境或明确知道后果且业务低峰期使用。
2. overcommit_memory=2 的启动风险
设置为 2 可禁止过度分配虚拟内存,防止进程申请内存成功但实际使用时因物理内存不足被 OOM Killer 杀死。警告:若配合严格的限制,可能导致正常进程因无法分配内存而启动失败,需预留足够缓冲,生产环境建议先设为 1 观察。
3. 透明大页(THP)争议
虽然 THP 可减少页表项,但对于延迟敏感型应用(如 Redis、Oracle),公开资料建议关闭透明大页以避免内存碎片和分配延迟。可通过cat /sys/kernel/mm/transparent_hugepage/enabled查看状态。
4. 忽略 NUMA 架构
在多路 CPU 服务器上,跨 NUMA 节点访问内存会增加延迟,建议结合 numactl 绑定进程到特定节点,避免跨节点访问。