一土水丰色今口 2026-02-28 18:05 采纳率: 98.5%
浏览 0
已采纳

Linux中如何查看当前swap使用情况?

在Linux系统中,如何准确、实时地查看当前Swap的使用情况?常见误区是仅依赖`free -h`命令,却忽略了其输出中“available”字段不包含Swap、“used”列可能被缓存干扰等问题;或误用`swapon --show`仅显示启用设备而无用量。此外,当系统存在多个Swap分区或Swap文件时,`cat /proc/swaps`虽能列出各设备及其优先级与大小,但缺乏动态使用率(如已用/总大小百分比);而`vmstat 1`虽可观察si/so(swap in/out)活动,却不直接反映占用量。运维人员还常困惑于`top`或`htop`中Swap相关字段含义模糊(如htop的“SWAP”列是否含压缩内存?),以及`/sys/fs/cgroup/memory/memory.memsw.usage_in_bytes`等cgroup指标是否应纳入全局Swap统计。如何综合多种命令,区分瞬时快照与持续监控,并识别异常Swap频繁换入换出(表明内存严重不足)?
  • 写回答

1条回答 默认 最新

  • 小小浏 2026-02-28 18:05
    关注
    ```html

    一、基础快照:理解 Swap 的本质与 free 的局限性

    Swap 是内核为应对物理内存(RAM)不足而启用的虚拟内存后备机制,其本质是将不活跃的匿名页(anon pages)写入块设备(分区或文件)。free -h 显示的 Used 列 = RAM 中实际被进程/内核占用的内存(不含 Page Cache),而 Available 仅估算可立即回收的内存(含可回收缓存),完全不包含 Swap 容量或使用量。更关键的是:freeSwap 行中 used 值来自 /proc/meminfoSwapUsed,该值虽准确,但无法区分多 Swap 设备的个体负载——这是初级误判的根源。

    二、设备级透视:解析 /proc/swapsswapon --show 的语义差异

    • swapon --show 仅输出已激活的 Swap 设备路径、类型、优先级及大小(size),无 usage 字段
    • cat /proc/swaps 输出相同字段,但额外提供 priorityfilename,且每行末尾的数字为当前已用页数(单位:pages),需换算:used_kb = pages × 4
    • 当存在多个 Swap 文件(如 /swapfile1, /swapfile2)时,必须逐行计算百分比:usage% = (used_kb / size_kb) × 100

    三、实时动态监控:vmstatpidstat -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_bytesnode_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 或优化应用内存泄漏。

    ```
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 3月1日
  • 创建了问题 2月28日