如何解释strace报告的系统调用时间?

问题描述

我有一个程序,根据 time ./program,它运行了 389 秒,其中 96.64 秒是“系统”时间。

然而,如果我运行 strace -c -f ./program,我观察到两个现象:

  • poll 系统调用就总共花费了 708 秒(20145us/call),更不用说 futex,它花费了惊人的 5945s(1239us/call)。这远远超过 96.64 秒。
  • pollfutex 外,所有其他系统调用加起来只用了 17 秒。

我对这种现象有 2 种解释,我需要一些帮助才能知道哪个是正确的(或者,如果两者都不正确,什么是正确的)。

  1. 我正在 72 核机器上运行一个大型多线程程序。

    在这种情况下,5945 秒可能是每个内核上系统调用间的总和。 time 出于某种原因,似乎并不关心内核。

  2. strace 报告的系统调用时间可能包括我的线程处于阻塞状态的时间,而 time 没有。 futexpoll 都是可能阻塞线程的系统调用

    在这种情况下,如果我有 6000 个线程,每个线程阻塞 1s,strace 将记录 6000s,即使这些 1s 间隔可能重叠。 time 可能不包括阻塞时间。

    但是,在这种情况下,由于所有其他系统调用仅花费了 17 秒,那么 time 报告的 96.64 来自哪里?也许它来自调度程序?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)