swap检查脚本
2025-08-11 / shell / 219 次围观 / 0 次吐槽 /#!/bin/bash
# 检查 Swap 使用及回收原因
# Author: Cheug
# 用法: bash swap_check.sh
echo "=== 1. 当前内存和Swap使用情况 ==="
free -m
echo "-------------------------------"
grep -E 'Mem|Swap' /proc/meminfo
echo -e "\n=== 2. 查看 Swapiness 参数(0-100,越低越不易使用swap) ==="
sysctl vm.swappiness
echo -e "\n=== 3. 查看是否有swap分区或文件 ==="
swapon --show
echo -e "\n=== 4. 检查内核版本(低版本内核在回收swap上有差异) ==="
uname -r
echo -e "\n=== 5. 检查是否有长时间占用swap的进程 ==="
if command -v smem &>/dev/null; then
smem -rs swap | head -n 20
else
echo "(提示: smem 未安装, 使用 ps + grep VmSwap 方式)"
for pid in $(ls /proc | grep '^[0-9]'); do
if [ -r /proc/$pid/status ]; then
swap_kb=$(grep VmSwap /proc/$pid/status | awk '{print $2}')
if [ "$swap_kb" != "" ] && [ "$swap_kb" -gt 0 ]; then
cmd=$(tr -d '\0' < /proc/$pid/cmdline | cut -c1-50)
printf "%-10s %-10s %s\n" "$pid" "${swap_kb} KB" "$cmd"
fi
fi
done | sort -k2 -n -r | head -n 20
fi
echo -e "\n=== 6. 检查内存碎片信息 ==="
grep -A5 "Node 0" /proc/buddyinfo
echo -e "\n=== 7. 检查内存是否足够回收swap ==="
avail=$(grep MemAvailable /proc/meminfo | awk '{print $2}')
total_swap=$(grep SwapTotal /proc/meminfo | awk '{print $2}')
used_swap=$(grep SwapFree /proc/meminfo | awk '{print $2}')
echo "可用内存: $((avail/1024)) MB"
echo "Swap总量: $((total_swap/1024)) MB, 已使用: $(((total_swap-used_swap)/1024)) MB"
echo -e "\n=== 8. 如果想手动回收swap,可以执行 ==="
echo "sync #同步数据到磁盘,防止数据丢失"
echo "swapoff -a && swapon -a #闭swap再开启swap"
echo "===== 分析提示 ====="
swap_used_kb=$(grep SwapTotal /proc/meminfo | awk '{print $2}')
swap_free_kb=$(grep SwapFree /proc/meminfo | awk '{print $2}')
swap_used_now=$((swap_used_kb - swap_free_kb))
if [ "$swap_used_now" -ne 0 ]; then
echo -e "\n[警告] Swap 仍然有 ${swap_used_now} KB 未释放."
echo "[可能原因]"
echo " 1. 某些进程锁定了内存页(mlock),导致 swap 无法回收"
echo " 2. 系统中某些 swap 分区或文件未被正确关闭"
echo " 3. 有内核线程占用 swap"
echo " 4. 适当调低 vm.swappiness,可减少 swap 使用"
echo " 5. 如果 swapoff 无法执行,可能内存不足或进程锁定页面"
echo " 6. 如果 swap 使用量不变,可能是内存碎片或内核 bug"
fiPowered By Cheug's Blog
Copyright Cheug Rights Reserved.