调优vm.swappiness不能消除Shell大脚本并发时的内存挤压,但能使其更可控;需按内存容量与并发规模设5–30,配合vfs_cache_pressure、min_free_kbytes和overcommit_memory协同优化。

调优 vm.swappiness 不能“消除”Shell大脚本并发执行时的内存挤压,但能显著改变内核在压力下如何权衡物理内存与swap的使用策略——关键不是阻止换出,而是让换出更可控、更少干扰核心任务。
理解大脚本并发的真实内存行为
多个Shell脚本(尤其含awk、sort、sed -i或子shell管道)并发运行时,常表现出以下特征:
- 进程数量多、RSS增长快,但单个进程驻留内存未必很大;
- 大量临时文件/缓冲区占用page cache(如
cat large.log | grep ...会缓存整个文件); - 脚本退出后,其匿名页(堆栈)立即释放,但page cache可能滞留较久;
- 若系统同时运行Java服务、数据库或容器,它们对匿名页驻留敏感,而Shell脚本更依赖cache可用性。
swappiness值选择:按内存余量和脚本特性匹配
不建议一刀切设为0或100。需结合当前物理内存总量与并发规模动态判断:
-
RAM ≥ 16GB,且并发脚本 ≤ 20个:设为 5~10。保留极低换出倾向,优先压缩page cache(通过
vm.vfs_cache_pressure=150辅助),避免挤占数据库/服务的匿名页空间; -
RAM 4–8GB,脚本并发 30–50+:设为 20~30。允许适度换出部分休眠脚本的匿名页(如后台
sleep循环),腾出内存给活跃管道处理,减少OOM风险; -
RAM ≤ 2GB 或无swap分区:设为 0,并确保
vm.min_free_kbytes设为≥65536。此时swap不可用,内核只能回收cache或触发OOM,必须靠ulimit -v或cgroup限制单脚本虚拟内存上限。
配套必须调整的三个参数
单独改swappiness效果有限,需协同优化:
-
vm.vfs_cache_pressure = 140–180:提高dentry/inode缓存回收优先级,缓解大量find、ls类脚本造成的cache堆积; -
vm.min_free_kbytes = 总内存的1.5%(如16GB设为245760):防止脚本突发申请内存时直接触达OOM边界; -
vm.overcommit_memory = 2:配合vm.overcommit_ratio(建议设为80),避免脚本fork大量子进程时因过度承诺内存而被误杀。
验证是否真正改善挤压现象
不要只看free -h,重点监控三项实时指标:
- 执行
watch -n 1 'grep -E "pgpgin|pgpgout|pgmajfault" /proc/vmstat':观察pgpgout(每秒换出页数)是否稳定在低位(如<50),且无脉冲式飙升; - 运行
slabtop -o | head -10:确认slab_reclaimable不再持续上涨后突然暴跌(说明cache回收已跟上脚本节奏); - 用
ps aux --sort=-%mem | head -5对比调优前后:若高内存占用进程从Java/DB变为bash或sort,说明匿名页挤压缓解,cache策略生效。


















