当麒麟操作系统运行流畅度下降,而物理内存占用率显示正常时,问题根源往往指向Swap交换空间。持续的页面交换操作或Swap空间被异常进程占用,都可能成为系统性能的隐形瓶颈。要精准诊断此类问题,需要一套多维度的监控策略。以下五种方法,从实时状态捕捉到历史数据分析,从系统全局概览到具体进程定位,能帮助您全面掌握Swap的动态,有效排查麒麟系统性能问题。

一、使用vmstat周期性采样观察Swap I/O活动
要快速判断系统当前是否正在进行页面交换,vmstat命令是首选工具。它系统开销极低,能够提供实时的页面换入(si)和换出(so)速率数据,是监测内存压力的灵敏指标。
执行命令 vmstat 1 5,表示每秒采样一次,连续采样5次。请重点关注输出结果中的si(swap in)和so(swap out)两列,其单位为KB/s。如果连续多行数据显示这两个值均不为零,则表明Swap空间正在被活跃使用,系统物理内存可能已面临压力。
如需获取更宏观的统计数据,可运行 vmstat -s | grep -E "(swap|page)",此命令将显示与交换页面相关的累计统计信息,有助于把握整体状况。
二、通过sar命令记录历史Swap使用率曲线
进行事后分析时,历史数据至关重要。sar命令的强大功能在于能够按时间序列记录Swap使用率(%swpused)以及页面交换活动(pgpgin/pgpgout),形成可视化的历史趋势曲线。这对于诊断周期性或偶发性内存不足问题具有关键价值。
首先,请确保sysstat数据收集服务已处于运行状态:sudo systemctl is-active sysstat。
随后,可立即开始采集Swap相关数据:执行 sar -W 10 6 表示每10秒采样一次,共采样6次,专门用于观察Swap统计信息。若希望同时监控页面换入换出的吞吐量,可使用 sar -B 10 6,并重点关注pgpgin和pgpgout字段的数值变化。
为便于后续对比分析,可将数据直接导出至日志文件:sar -W 10 6 > /tmp/swap_usage_$(date +%s).log。
三、解析/proc/swaps与/proc/meminfo动态追踪Swap状态
要获取最底层的系统状态信息,需要查询内核提供的/proc文件系统。其中的/proc/swaps和/proc/meminfo文件是追踪Swap使用情况的核心。
执行 cat /proc/swaps 可以列出所有已启用的Swap分区或文件的详细信息,包括总大小和当前使用量,一目了然。
运行 grep -E "^(Swap|Pg)" /proc/meminfo 则能提取出一系列关键内存指标:包括SwapTotal(交换区总量)、SwapFree(空闲交换区)、SwapCached(缓存交换区),以及页面交换相关的 Pgpgin、Pgpgout、Pswpin、Pswpout。综合这些数据,可以交叉验证Swap空间是已被实际占用,还是仅处于挂载待用状态。
结合watch命令可实现动态监控:watch -n 2 'grep -E "^(Swap|Pg)" /proc/meminfo',该命令会每2秒刷新一次显示上述信息。
四、使用free命令结合时间戳生成趋势快照
在未安装sysstat工具的环境中,或需要进行快速简易诊断时,利用free命令配合简单的Shell脚本,即可构建一个轻量级的Swap使用趋势日志。
核心思路是:循环执行free命令,并为每次的输出结果添加精确的时间戳。
例如,可以创建一个日志文件,并运行如下循环脚本:
for i in $(seq 1 20); do
echo "$(date '+%H:%M:%S') $(free -h | awk '/Swap:/ {print $3\"/\"$2}')" >> /tmp/swap_trend.log
sleep 3
done
该脚本会每3秒记录一次Swap的已用空间和总量(以人类可读格式),共记录20次。记录完成后,使用cat命令查看日志,或借助sort等命令快速定位Swap使用率出现峰值的时间点,这些峰值往往是问题排查的重要线索。
五、利用top命令实时定位高Swap占用进程
当发现系统Swap使用率偏高时,下一步是定位具体是哪些进程占用了大量交换空间。虽然top命令默认不直接显示进程的Swap占用,但我们可以通过它筛选出内存消耗大的可疑进程,再进一步深入探查。
首先,运行top命令,然后按下M键,使进程列表按照内存使用率(RES)进行降序排列。记录下排名靠前的几个进程的PID(进程ID)。
接着,针对每个可疑的PID执行命令:grep -i "swap" /proc/[PID]/status 2>/dev/null | awk '{print $2}',即可查询到该进程具体的Swap使用量(单位为KB)。
如果想一次性找出系统中Swap占用最高的十个进程,可以使用以下组合命令:
for pid in $(ps -eo pid --no-headers); do
swap=$(grep -i "swap" /proc/$pid/status 2>/dev/null | awk '{print $2}')
if [ -n "$swap" ]; then
echo "$pid $swap"
fi
done | sort -k2 -nr | head -10
通过这种方法,占用大量Swap空间的进程将无处遁形,为后续的性能调优或问题处理提供明确目标。
