周行文 2026-01-06 19:15 采纳率: 98%
浏览 0
已采纳

Swap占用过高如何排查和优化?

服务器运行缓慢,发现Swap使用率持续超过90%,但物理内存仍有部分未被充分利用。如何判断是内存泄漏、应用配置不当还是系统Swappiness设置不合理导致的Swap过度占用?应通过哪些关键命令(如free、top、vmstat、sar)分析内存与Swap使用趋势,并结合/proc/meminfo定位根源?优化时应调整vm.swappiness参数,还是优先扩容物理内存或限制单个进程内存使用?
  • 写回答

1条回答 默认 最新

  • kylin小鸡内裤 2026-01-06 19:16
    关注

    服务器Swap高使用率问题深度排查与优化策略

    一、现象描述与初步诊断

    当服务器出现运行缓慢,且监控显示Swap使用率持续超过90%,而物理内存仍有部分未被充分利用时,这通常表明系统存在“非最优”内存管理行为。这种反常现象可能源于内存泄漏、应用配置不当或内核参数vm.swappiness设置不合理。

    首要任务是确认是否为真实内存压力导致的Swap启用,还是系统过早地将可用内存页交换至磁盘。

    二、关键命令分析流程

    1. free -h:查看整体内存与Swap使用情况。
    2. tophtop:观察各进程的RES(常驻内存)和%MEM占用,识别异常进程。
    3. vmstat 1 5:监控si(swap in)、so(swap out)值,判断是否存在频繁换入换出。
    4. sar -rsar -S(需sysstat包):分析历史内存与Swap趋势。
    5. cat /proc/meminfo:深入查看MemAvailable、SwapCached、Dirty等关键指标。
    6. ps aux --sort=-%mem | head -10:列出内存消耗最高的前10个进程。
    7. smem -t -k:统计PSS(Proportional Set Size),更精确评估共享内存下的实际占用。
    8. dmesg | grep -i "oom\|kill":检查是否有进程因OOM被终止。
    9. journalctl -u your-app.service:定位特定服务日志中的内存异常信息。
    10. perf topvalgrind --tool=memcheck:用于开发环境检测内存泄漏。

    三、数据表格对比:典型内存状态指标

    指标正常范围异常表现可能原因
    MemAvailable> 20% 总内存< 10%内存紧张或缓存未释放
    SwapUsed< 10%> 90%swappiness过高或内存泄漏
    si/so (vmstat)0> 0 持续频繁Swap I/O,性能下降
    PageFaults (major)低频高频增长缺页严重,影响响应
    MemFree较低但非零极低但MemAvailable尚可缓存机制正常
    Shmem合理大小异常增大共享内存泄露
    Mapped与应用匹配远超预期内存映射文件过多
    AnonPages随负载变化持续上升不降疑似内存泄漏
    Dirty< dirty_background_ratio接近上限写回延迟
    Slab< 30% RAM> 50%内核对象泄漏

    四、根源定位路径图

    graph TD
        A[Swap使用率 > 90%] --> B{物理内存是否充足?}
        B -- 是 --> C[检查vm.swappiness值]
        B -- 否 --> D[检查应用内存使用趋势]
        C --> E[若swappiness > 60, 调整至10~30]
        D --> F[top/smem分析进程PSS]
        F --> G{是否存在进程持续增长?}
        G -- 是 --> H[怀疑内存泄漏]
        G -- 否 --> I[检查缓存与Buffer使用]
        H --> J[valgrind/gdb/perf进一步验证]
        I --> K[分析/proc/meminfo中Cached/SReclaimable]
        K --> L[考虑调整vfs_cache_pressure]
    

    五、深入分析/proc/meminfo关键字段

    • MemTotal: 系统总物理内存。
    • MemFree: 完全空闲内存,通常较小属正常。
    • MemAvailable: 可供新进程使用的预估内存,比MemFree更具参考价值。
    • Buffers & Cached: 文件系统缓存,可回收。
    • SwapCached: 已从Swap读取但仍保留在内存中的页,重复访问时不需再次I/O。
    • Active(anon)/Inactive(anon): 匿名内存页活跃度,若Inactive过高说明大量内存被Swap。
    • SReclaimable: Slab中可回收部分,过高可能表示dentry/inode缓存积压。
    • PageTables: 页表占用内存,虚拟机多时易升高。
    • KReclaimable: 内核动态分配的可回收内存。
    • CommitLimit: 当前允许的最大提交内存,受overcommit策略影响。

    六、优化策略选择:优先级建议

    面对Swap过度使用问题,应遵循以下优先顺序进行优化:

    1. 第一步:调整vm.swappiness
      默认值通常为60,在有足够RAM的情况下应降低至10~30,甚至0(仅紧急时用)。
      sysctl vm.swappiness=10
      永久生效:echo 'vm.swappiness=10' >> /etc/sysctl.conf
    2. 第二步:限制单个进程内存使用
      使用cgroups v1/v2或systemd的MemoryMax限制关键服务内存上限。
      示例(systemd):
      [Service]
      MemoryMax=4G
      Restart=on-failure
            
    3. 第三步:排查并修复内存泄漏
      利用pprof(Go)、jmap/jvisualvm(Java)、Valgrind(C/C++)等工具定位泄漏点。
      长期运行服务应定期重启或实现内存池清理机制。
    4. 第四步:扩容物理内存
      若业务确实需要大内存且无法压缩,增加RAM是最根本解决方案。
      特别适用于数据库、大数据处理、缓存服务器等场景。
    5. 第五步:优化文件缓存策略
      调整vm.vfs_cache_pressure控制inode/dentry回收频率,默认100,可设为50以保留更多缓存。
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 1月7日
  • 创建了问题 1月6日