Ubuntu 出现 Swap 占用持续增长的处理步骤
一、先判断是真泄漏还是正常换出
free -h,关注 available 是否持续下降、Swap 是否被动增长。journalctl -k | grep -i oom,若出现 “Out of memory: Kill process …”,说明内存压力已触发内核 oom‑killer。vmstat 1 10,若 si/so(swap in/out)持续不为 0,说明系统正在频繁换页。free -h 中 available 充足而 Swap 占用高,常见于“进程把不活跃页换出”或“部分进程占用 Swap 较多”。二、定位占用 Swap 的进程
sudo sh -c 'for i in /proc/[0-9]*; do pid=${i##*/}; if [ "$pid" -gt 100 ]; then awk -v pid="$pid" "/Swap:/{a+=$2} END {if (a>0) print pid, a/1024 \"M\"}" /proc/"$pid"/smaps 2>/dev/null; fi; done | sort -k2nr | head -n 10'watch -n 1 "ps aux | grep <PID>"。pmap -x <PID>,关注 RSS 与 [ anon ] 段是否持续增长。slabtop -o 与 cat /proc/meminfo 观察 Slab 等内核缓存是否异常增长。smem -P <进程名> 按 PSS 聚合更直观;lsof -p <PID> 辅助排查文件映射与资源占用关联。三、应急处理与止损
sync 落盘,再 echo 3 | sudo tee /proc/sys/vm/drop_caches 清理页缓存,随后执行 sudo swapoff -a && sudo swapon -a。若 swapoff 报 “Cannot allocate memory”,说明空闲内存不足以回收 Swap,先停占用最高的进程或扩容内存/增加 Swap 后再执行。sudo sysctl -w vm.swappiness=10(范围 0–100,默认多为 60;数值越低越倾向少用 Swap)。sudo fallocate -l 16G /swapfile && sudo chmod 600 /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile,并在 /etc/fstab 加入 /swapfile none swap sw 0 0 持久化。四、根因修复与长期优化
valgrind --leak-check=full ./your_app;编译时建议带 -g 便于定位。pmap/smem)交叉验证。echo never > /sys/kernel/mm/transparent_hugepage/enabled 与 defrag),并按需配置 vm.nr_hugepages。