强大的力量strace
让我失望了。这怎么可能?
time foo
显示foo
运行需要几秒钟(“真实”),但在用户空间(“用户”)和内核(“ sys”)中使用的CPU时间都可以忽略不计。对于好奇,foo
定义如下。
因此,它花费大部分时间等待其他事情,而不是执行CPU指令。正常情况下,我可以看到它的等待状态strace
-即哪个系统调用长时间处于阻塞状态。不幸的是,这种方法行不通。
strace -ttt -T -C -w foo
显示系统调用,时间戳和系统调用所花费的(实际)时间的摘要。但是,此特定过程显示出在系统调用内花费的总(实际)时间微不足道。
foo
实际上是journalctl -b -u dev-hugepages.mount
。除非我每次都必须将最后一个参数更改为一个不同的systemd单元,以便重现此参数。换句话说,我正在调查的延迟是在我第一次尝试获取任何一个systemd单元的日志时发生的。 编辑:在回答了主要问题之后,我还意识到我遇到这个问题会导致延迟的原因。
此过程花费的时间是一个特定的问题,显然并非在所有系统上都发生。https://github.com/systemd/systemd/issues/7963
journalctl
只运行一个过程。我有一种journalctl
出于某种原因使用一个额外的线程的感觉-iirc有一个clone()调用。我认为这意味着您在技术上是正确的,但在技术上也与该问题无关。 time
着眼于整个过程,并表明整个过程相当困(阻塞某物)。 strace
睡眠不足。第二个线程是否正在休眠并不重要,主线程也必须非常困倦才能解释time
结果。