linux swap使用过高通常因系统策略或应用行为导致,并非内存不足;需区分必要交换与异常交换,通过检查内存状态、调整swappiness、优化缓存回收及约束异常进程来精准调优。

Linux Swap使用过高,通常不是因为内存真的不够,而是系统策略或应用行为导致的过度交换。关键要区分是“必要交换”还是“异常交换”,再针对性调整。
检查Swap高占用的真实原因
先确认是不是内存真的吃紧,还是内核在“过度积极”地换出内存页:
- 运行 free -h 和 swapon --show 查看Swap总量与已用比例
- 用 cat /proc/meminfo | grep -i "swap\|commit" 关注
Committed_AS(已承诺内存)和SwapCached(缓存中可回收的Swap页) - 执行 vmstat 1 5 观察
si(swap in)和so(swap out)是否持续偏高;若so高但si极低,说明只是“换出未回收”,未必影响性能 - 用 smem -s swap -r | head -10 查看哪些进程占用了最多Swap空间(注意:该值反映的是RSS中被换出的部分,非总内存占用)
调整swappiness控制交换倾向
swappiness(取值0–100)决定内核倾向于保留匿名页(如堆内存)还是优先回收文件页。默认值60常导致过早交换:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 临时调低:sudo sysctl vm.swappiness=10(适合内存充足、强调响应延迟的场景,如数据库服务器)
- 永久生效:在
/etc/sysctl.conf中添加vm.swappiness=10,然后运行 sudo sysctl -p - 设为0不等于禁用Swap——它只禁止主动换出匿名页,OOM发生时仍可能触发;设为1表示仅在内存严重不足时才交换
优化内存回收与缓存行为
Swap升高有时源于内核对page cache(页缓存)回收过于保守,导致可用内存下降后被迫换出进程内存:
- 适当降低
vm.vfs_cache_pressure(默认100),比如设为50,让内核更愿意保留dentry/inode缓存,减少因缓存膨胀挤占内存 - 增大
vm.min_free_kbytes(如设为物理内存的1%~2%),确保系统始终保有足够“紧急内存池”,避免内存紧张时调度卡顿 - 若应用频繁读写临时文件,考虑挂载tmpfs到
/tmp(需预留足够内存),减少磁盘IO压力及间接引发的Swap活动
排查并约束异常内存行为
Swap飙升也可能是某进程内存泄漏、配置失当或容器资源限制缺失所致:
- 检查是否有Java进程未设置
-Xmx,或Python程序加载超大对象后未释放(用pmap -x PID看RSS与Size差异) - Docker容器未设
--memory限制时,宿主机OOM Killer可能先杀进程,也可能先触发大量Swap;建议明确配置内存上限 - 禁用不必要的服务(如bluetooth、cups),减少后台内存驻留;对长期空闲但占内存的服务,可考虑按需启动(socket-activated)
Swap本身不是敌人,它是内存管理的安全阀。调优目标不是消灭Swap,而是让它只在真正需要时启用,且不影响关键业务延迟。不复杂但容易忽略。










