当我运行时top -bi
,参数 -i 表示“忽略空闲进程”,结果进程列表(见下文)是 R 或 D,尽管当时有 S 进程。
那么,为什么不间断睡眠不被算作“空闲”呢?而且,“平均负载”似乎等于 R 进程数加上 D 进程数?
top - 17:47:44 up 141 days, 14:29, 2 users, load average: 4.10, 4.18, 4.17
Tasks: 224 total, 1 running, 223 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.1%us, 0.4%sy, 0.0%ni, 87.2%id, 12.3%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 16432240k total, 16345816k used, 86424k free, 4934652k buffers
Swap: 16386292k total, 6996k used, 16379296k free, 71432k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
7479 root 18 0 1357m 1.1g 904 D 1 7.0 10:27.86 rsync
7463 root 18 0 1315m 1.0g 840 D 1 6.6 9:45.83 rsync
7469 root 18 0 1088m 889m 840 D 0 5.5 8:10.20 rsync
7524 root 18 0 1106m 895m 840 D 0 5.6 8:13.60 rsync
30958 root 15 0 12720 1148 788 R 0 0.0 0:01.07 top
答案1
因为“不间断的睡眠”并不意味着空闲或睡觉。手册ps
页已经对此进行了解释:通常是 IO,在 rsync 的情况下这并不奇怪。
答案2
当进程处于可中断睡眠状态时,这意味着内核正在执行进程请求的某些操作(主要是输入/输出)。当内核处理请求时,该进程正在休眠。当进程本身空闲时,内核代表进程忙,所以进程是通过代理忙的。用户模式代码 (R) 和内核模式代码 (D) 都算作忙。