如果 runqueue 是等待开启 CPU 的进程数 + 当前正在运行的进程数,而 waitqueue 是等待 I/O 的进程数,那么 vmstat 输出中的 B 大于 R 是否意味着存在I/O 限制,而不是 CPU 限制?我很困惑,因为下面的链接说的是相反的......来自http://nonfunctiontestingtools.blogspot.com/2013/03/vmstat-output-explained.html?m=1
“如果可运行线程 (r) 除以 CPU 数量大于 1 -> 可能的 CPU 瓶颈(如果我们有足够的 CPU 或我们有,则 (r) 应该与 CPU 数量(正常运行时间中的逻辑 CPU)进行比较)更多线程。)阻塞进程列 (b) 中的数字较大表示磁盘速度较慢。 (r) 应始终高于 (b);如果不是,通常意味着您有 CPU 瓶颈”
答案1
in 的数字高于b
inr
意味着 CPU 经常处于空闲状态,因此您会感到困惑。该文档应该是“意味着您有 I/O 瓶颈”。
请注意,该页面表示r
永远不应高于 CPU 数量,并且在 12 个 CPU 系统上 r=16 是一个“严重”问题。这是相当夸张的。这仅仅意味着 CPU 已被充分利用,并且一些线程正在等待。通常没什么大不了的。
最后,不要混淆线程和进程,就像链接文档有时也会这样做一样。r
和列b
显示线程数,而不是进程数。并非所有进程都是单线程的。
答案2
我认为这句话完全是混乱的。
当 时r > num_cpus
,将整个系统视为受 CPU 限制(在该时刻)是有意义的。
不过我觉得并没有r > b
什么特别的意义。
另一个消息来源建议“如果 [the] 列中不断出现非零数字b
,您可以使用 进一步调查iostat
。”将这种情况视为建议 IO 绑定系统可能更有意义,除非您知道正在使用多个 IO 队列。
iostat
包括%util
每个磁盘设备的一列。即,如果%util
为 100,则表明该设备上始终至少有一个进程正在等待。 avgqu-sz
将显示有多少个不同的请求正在等待。
使用 AIO 的程序可以一次提交多个请求。这主要由数据库使用,例如 MySQL InnoDB。大多数程序不使用Linux AIO,因为它不支持缓存。