如何初略判断一个进程是计算密集型还是IO密集型
也是从 https://blogs.oracle.com/linux/solving-problems-with-proc-v2 中学到的.
一般来说计算密集型的进程会有较多的非自愿上下文切换(nonvoluntary context switch),而IO密集型的进程会有较多的自愿上下文切换(voluntary context switch).
那么如何查看某个进程遭遇到的上下文切换数量呢?
原来在 /proc/$PID/status
中有 voluntary_ctxt_switches
和 nonvoluntary_ctxt_switches
两个标签分别标示了自愿上下文切换和非自愿上下文切换的次数.
比如我们来看看Emacs是计算密集型还是IO密集型呢?
grep ctxt_switches /proc/$(pgrep emacs)/status
voluntary_ctxt_switches: 74840 nonvoluntary_ctxt_switches: 21080
可以看到自愿上下文切换次数比较多,因此可以 初步 推测为IO密集型.
再比如我们自己写一个计算密集型的程序测试一下
int main() { while (1) { } }
可以看到如下测试结果
lujun9972:UO/ $ /tmp/loop & [1] 13247 lujun9972:UO/ $ cat /proc/13247/status |grep ctxt_switches voluntary_ctxt_switches: 0 nonvoluntary_ctxt_switches: 401 lujun9972:UO/ $ cat /proc/13247/status |grep ctxt_switches voluntary_ctxt_switches: 0 nonvoluntary_ctxt_switches: 470 lujun9972:UO/ $ cat /proc/13247/status |grep ctxt_switches voluntary_ctxt_switches: 0 nonvoluntary_ctxt_switches: 519 lujun9972:UO/ $ cat /proc/13247/status |grep ctxt_switches voluntary_ctxt_switches: 0 nonvoluntary_ctxt_switches: 1930
可以看到全都是非自愿上下文切换,符合预想的结果