【问题标题】:How to find out which process is consuming "wait CPU" (i.e. I/O blocked)如何找出哪个进程正在消耗“等待 CPU”(即 I/O 阻塞)
【发布时间】:2009-03-20 16:01:00
【问题描述】:

使用top,很容易找出每个作业使用多少 CPU。但是,我想寻找一个导致高等待 CPU 的工作。有没有办法找出哪些作业在 I/O 上被阻止?

【问题讨论】:

    标签: linux command-line


    【解决方案1】:

    iotoplatencytop 可能会有所帮助。两者都没有给出确切的“由进程引起的 CPU 等待时间”——我不确定它是否有意义,因为 CPU 可以并且确实在等待 IO 时为其他进程提供服务——但这两个工具概述了(分别)系统 I/O 流量和调度延迟。

    【讨论】:

    • 这两个工具看起来都不错,但我所在的服务器无法轻松修补或升级到 >2.6.20,因此它们不适合我。但我会保留它们以供将来参考:)
    • 到 LatencyTOP.org 的链接已失效 - 没有根 DNS 记录。该项目似乎已经死了,自 2009 年以来没有提交。
    【解决方案2】:

    执行一次 top,然后 shift F ,然后选择 m 或 n,将按 CPU 使用时间对进程列表进行排序。

    【讨论】:

      【解决方案3】:

      在 IO 上阻塞的进程是状态列中标记为D 的进程(顶部为S 列)。

      【讨论】:

      • 这应该是这里公认的答案,因为它更容易帮助找到罪魁祸首。
      【解决方案4】:

      更准确地说,使用这个命令可以很容易地找出哪些进程正在“吃掉”你的 CPU 周期:

      while true; do date; ps auxf | awk '{if($8=="D") print $0;}'; sleep 1; done

      此网址可能会有所帮助:Linux Wait IO Problem

      【讨论】:

      • D : 不间断睡眠(通常是 IO)
      • watch -n 1 "(ps aux | awk '\$8 ~ /D/ { print \$0 }')"
      • @abkrim:很好!我喜欢 watch 的 '-d' 选项,让你的解决方案: watch -d -n 1 "(ps aux | awk '\$8 ~ /D/ { print \$0 }')"
      • 只是想插话说我喜欢使用正常运行时间而不是日期,因为这会给你时间和负载。这非常有用,因为它允许您查看前导/尾随负载以及 ps 输出。
      猜你喜欢
      • 1970-01-01
      • 2010-10-02
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多