进程阻塞了哪些调用?

On what call(s) the process is blocking?

我有一个程序应该 CPU 绑定,但它的使用率远低于 100% CPU,并且没有尽可能快地消耗输入。这意味着我的进程在某处阻塞或休眠。

如何找到最长时间阻塞我进程的调用?是否有工具或调试程序可以测量每次阻塞系统调用时进程休眠的时间?

strace是一个选项:

$ strace -wc sleep 1
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 99.96    1.000146     1000146         1           nanosleep
  0.01    0.000131         131         1           execve
  0.01    0.000082          10         8           mmap
[...]