swappiness调至1可显著减少非必要换入换出,0仅在内存严重不足时兜底启用swap;多swap设备按-p指定优先级(数值越大越高),ssd应设更高优先级;swap文件性能接近分区,但需fallocate预分配并禁用cow;高swap activity主因是内存泄漏或工作集过大,非swappiness设置问题。

swapiness参数怎么调才有效?
swappiness 控制内核倾向使用Swap的强度,取值0–100。它不是“启用/禁用Swap”的开关,而是影响页面回收策略的权重——值越低,内核越倾向于丢弃缓存页而非换出匿名页。
- 值设为
0不代表完全不用Swap(内核仍会在内存严重不足时换出,这是保障系统存活的兜底行为) - 值设为
1是实际可用的最低保守值,能显著减少非必要换入换出 - 默认值
60在桌面环境合理,但对数据库、Redis、Java服务等内存敏感型负载往往导致频繁swapin/swapout,表现为高si/so(/proc/stat)和延迟毛刺
临时生效:
sudo sysctl vm.swappiness=1
永久生效:在
/etc/sysctl.conf中添加vm.swappiness=1,然后运行sudo sysctl -p多个Swap设备的优先级怎么排序?
Linux允许同时启用多个Swap分区或文件,通过swapon -p指定优先级(-p后跟0–32767整数),数值越大优先级越高。内核按优先级从高到低依次填满,同优先级则轮询使用。
- 优先级相同时,新启用的Swap设备不会自动抢占已占用空间;旧Swap仍会持续被访问,直到其使用率下降
- SSD Swap应设更高优先级(如
swapon -p 100 /swap_ssd),HDD Swap设低(如swapon -p 10 /swap_hdd),避免慢盘拖累I/O - Swap文件默认优先级为
-2,Swap分区为-1,不显式指定就容易出现“明明挂了SSD Swap却还在刷HDD”的情况
查看当前状态:
swapon --show=NAME,TYPE,SIZE,PRIO
调整已有Swap优先级需先
swapoff再重新swapon -pSwap文件 vs Swap分区,性能差多少?
核心差异不在“文件”或“分区”本身,而在于底层I/O路径与碎片控制:
- Swap分区绕过VFS和页缓存,直接走块层,随机写开销略低;但现代ext4/xfs对大文件的连续分配已很成熟,差距通常
- Swap文件更灵活(可建在LVM、Btrfs、加密卷上),但必须用
fallocate预分配(dd易产生碎片),且挂载时需加chattr +C禁用COW(对Btrfs)或chattr +j(对ext3/4日志优化) - 关键限制:Swap文件不能位于tmpfs、overlayfs或某些FUSE文件系统上,否则
swapon会报错swapon: /swapfile: swapon failed: Invalid argument
创建安全Swap文件的标准流程:
fallocate -l 4G /swapfile chmod 600 /swapfile mkswap /swapfile swapon -p 50 /swapfile
为什么调了swappiness还是看到大量swap activity?
swappiness只影响“匿名页 vs 文件页缓存”的回收倾向,不控制以下行为:
- 内存泄漏进程持续申请匿名页,最终必然触发Swap(此时看
cat /proc/*/status | grep VmSwap定位进程) - 内核为避免OOM killer粗暴杀进程,会在剩余内存低于
vm.lowmem_reserve_ratio阈值时提前换出,该行为不受swappiness约束 - 使用
mlock()或MAP_LOCKED的程序(如某些实时音频服务、DPDK应用)会绕过Swap机制,但它们占的内存仍计入MemAvailable统计,可能误导判断
排查真实诱因:
- 运行
sudo slabtop -o查slab缓存是否异常膨胀 - 检查
/proc/meminfo中Inactive(anon)和Active(anon)比例,若前者远高于后者,说明换出页未被及时重用,可能是工作集过大或swappiness仍偏高 - 确认是否启用了
zram或zswap——它们会拦截并压缩换出页,使si/so降低,但pgpgin/pgpgout仍高,容易误判
Swap不是性能补丁,而是内存压力的体温计。真正要盯的,是为什么匿名内存长期居高不下。











