如果 iostat 显示 100% 忙等待但 CPU 完全空闲,这意味着什么?我的应用程序运行了一段时间,然后定期进入此状态约 10-20 秒。
它是 Solaris 10 上的事务处理 C++ 应用程序。
IO stat output:
extended device statistics cpu
device r/s w/s kr/s kw/s wait actv svc_t %w %b us sy wt id
c0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0 0 0 0 100
sd1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0
sd2 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0
sd3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0
sd4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0
c1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0
sd0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0
c6 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0 100
sd19 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0
sd19.fp2 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0
sd19.fp4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0
sd20 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0
sd21 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0
sd22 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0
sd23 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0 100
sd24 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0
sd25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0
sd26 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0
sd27 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0
nfs1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0
vmstat 输出:
kthr memory page disk faults cpu
r b w swap free re mf pi po fr de sr s0 s1 s2 s3 in sy cs us sy id
0 0 0 10842364 33093436 30 188 0 0 0 0 65 -0 2 3 -0 1327 843 709 0 1 99
0 0 0 3406728 28181464 71 3601 0 0 0 0 0 0 0 0 0 1372 23009 1584 4 0 96
0 0 0 2702996 28030080 0 740 0 0 0 0 0 0 0 0 0 1414 15002 2065 6 0 93
0 0 0 2699448 28016628 0 3 0 0 0 0 0 0 0 0 0 1747 3012 2193 9 1 90
0 0 0 2691728 28009844 0 1 0 0 0 0 0 0 10 10 0 2315 1300 2877 2 0 97
0 1 0 2679788 27957836 0 5033 0 0 0 0 0 0 1 1 0 1895 1945 2658 10 0 90
0 2 0 2654188 27907196 0 0 0 0 0 0 0 0 1 1 0 3566 3788 5495 2 0 98
答案1
这意味着负载是由于 IO 等待而不是 CPU 争用造成的。因此,访问硬盘、访问 NFS 共享、访问交换空间(因此(通常)是本地硬盘...我不确定纯网络访问是否会导致这种情况,但我的直觉告诉我不会。NFS 只是增加了这种情况,因为它使用了 FS 层。“top”通常有一个“wait”或“iowait”百分比,通常会显示这种情况。
答案2
IO Stat 不应该是 100%。如果磁盘 IO 量很大,该值可能会很高,超过 50%,但恰好 100% 通常意味着 IO 子系统出了问题。当我的硬盘处于故障的早期阶段时,这种情况就发生在我身上,此时磁盘响应请求的时间越来越长,但仍然有响应。
或者它可能只是一个非常编写糟糕的应用程序。一个简单的 DTrace 脚本应该可以告诉您这是哪一种情况。
答案3
有一件事会导致 IO 负载非常高,那就是分页。您的应用程序是否消耗了所有物理内存并导致机器分页困难?
vmstat 5
如果si
和so
列显示除之外的任何内容0
,则表明您的机器正在进行分页(可能很多)。