Linux中如何查看当前swap使用情况?
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
1条回答 默认 最新
小小浏 2026-02-28 18:05关注```html一、基础快照:理解 Swap 的本质与
free的局限性Swap 是内核为应对物理内存(RAM)不足而启用的虚拟内存后备机制,其本质是将不活跃的匿名页(anon pages)写入块设备(分区或文件)。
free -h显示的Used列 = RAM 中实际被进程/内核占用的内存(不含 Page Cache),而Available仅估算可立即回收的内存(含可回收缓存),完全不包含 Swap 容量或使用量。更关键的是:free的Swap行中used值来自/proc/meminfo的SwapUsed,该值虽准确,但无法区分多 Swap 设备的个体负载——这是初级误判的根源。二、设备级透视:解析
/proc/swaps与swapon --show的语义差异swapon --show仅输出已激活的 Swap 设备路径、类型、优先级及大小(size),无 usage 字段;cat /proc/swaps输出相同字段,但额外提供priority和filename,且每行末尾的数字为当前已用页数(单位:pages),需换算:used_kb = pages × 4;- 当存在多个 Swap 文件(如
/swapfile1,/swapfile2)时,必须逐行计算百分比:usage% = (used_kb / size_kb) × 100。
三、实时动态监控:
vmstat与pidstat -r的协同解读执行
vmstat 1 5可捕获连续采样:字段 含义 健康阈值 si每秒从 Swap 读入内存的 KB 数(swap-in) < 10 KB/s(持续 >50 KB/s 表明严重压力) so每秒写入 Swap 的 KB 数(swap-out) < 5 KB/s(突发 >100 KB/s 需告警) 注意:
si/so非累计值,而是瞬时速率;若so持续高位而SwapUsed不增,可能因页面被重复换出未换入(thrashing 征兆)。四、进程级归因:定位 Swap 消耗元凶
使用
smem(需安装)获取精确的 Swap 使用进程排名:smem -s swap -r | head -10 # 按 swap_usage 排序,显示前10进程关键列说明:
Swap= 该进程独占的 Swap 页(不含共享);USS(Unique Set Size)越接近Swap,说明其内存不可回收性越强。替代方案:ps -eo pid,comm,vsize,rss,vsz,swp --sort=-swp | head -10(需内核支持CONFIG_PROC_PAGE_MONITOR)。五、现代内核增强:cgroup v2 与 zram 的统计边界澄清
对于启用了 cgroup v2 的系统:
/sys/fs/cgroup/memory.max和/sys/fs/cgroup/memory.current仅管控 RAM;/sys/fs/cgroup/memory.swap.current才是该 cgroup 实际使用的 Swap 量(单位 bytes);memory.memsw.usage_in_bytes(cgroup v1)已被废弃,不应纳入全局 Swap 统计,因其含 RAM+Swap 总和且受memsw.limit_in_bytes限制,非真实系统用量。
zram 设备(压缩内存)在
/proc/swaps中列为partition类型,其used值反映压缩后数据大小,非原始内存体积——需用cat /sys/block/zram0/mm_stat解析原始/压缩比。六、综合诊断工作流:构建可信的 Swap 健康评估
graph TD A[启动诊断] --> B{是否存在多 Swap?} B -->|是| C[解析 /proc/swaps 计算各设备 %used] B -->|否| D[直接读取 /proc/meminfo SwapTotal/SwapFree] C --> E[运行 vmstat 1 30 捕获 si/so 趋势] D --> E E --> F{si/so 均值 > 20KB/s?} F -->|是| G[触发 thrashing 疑似告警] F -->|否| H[检查 smem top10 进程] G --> I[结合 dmesg | grep -i "out of memory\|kill"] H --> J[确认是否由 Java -Xmx 或容器 memory limit 导致]七、生产级建议:自动化监控与基线建模
在 Prometheus + Node Exporter 环境中,应采集以下指标:
node_memory_SwapTotal_bytes与node_memory_SwapFree_bytes→ 计算全局使用率;node_vmstat_pgpgin/pgpgout→ 派生rate(node_vmstat_pgpgin[5m]) * 4(KB/s);- 对每个 Swap 设备,通过
textfile_collector动态生成node_swap_device_used_percent{device="/dev/sda2"}。
建立基线:正常业务下 SwapUsed 应长期 < 5%,且
```so峰值 < 10 KB/s;若连续 15 分钟si> 50 KB/s,必须扩容 RAM 或优化应用内存泄漏。本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报