【发布时间】:2019-02-08 16:43:31
【问题描述】:
我正在寻找方法来了解哪些系统调用或哪些子系统进程或线程花费时间等待,即被阻塞且未安排在 CPU 上运行。
具体来说,如果我有一些未知的过程,或者我们所知道的“它很慢”的过程,我希望能够学习以下内容:
- “它将 80% 的时间花在
sys_write()上的 fd 13 上,即 /some/file” - “它花费大量时间等待从网络套接字读取()”
- “它正在 epoll_wait() 中休眠,用于 fds [4,5,6] 上的活动,它们是 [file /boo]、[socket 10.1.1.:42]、[notifyfd blah]”
换句话说当我的程序不在 CPU 上运行时,它在做什么?
这令人惊讶地很难用 perf 回答,因为它似乎没有任何方法可以记录 从 sys_enter 到 sys_exit 的系统调用的持续时间或以其他方式保留跟踪事件的多长时间。大概是因为它的采样性质。
我知道一些针对 Linux 4.6 及更高版本的 eBPF 的实验性工作可能会有所帮助,Brendan Gregg 的 off-cpu work。但在悲惨的运营和支持 4.6 内核的世界中,这是一个难得的值得珍惜的独角兽。
现实世界的选择是什么?
ftrace、systemtap 等是否在这里提供任何见解?
【问题讨论】:
标签: linux performance blocking perf systemtap