我在 Linux Kernel 2.6.27.45 的嵌入式系统上运行了一个守护进程。其中一个进程没有按预期执行,我尝试使用strace进行进一步分析。(我添加了一些功能以将附加进程的堆栈跟踪打印到 strace,遵循网上的一些帖子)。使用的命令是:
enter code here
strace -T -i -r -tt -q -O 1 -o /tmp/syscallsM -p $tpid
我得到如下输出(在第 1 列排序后):
0.966638 [088cea24: 360eead8 08f9e71c ]089985d4 ]08998e20 ]12c9352c ]1058e71c ]10551388 ]1054e120 ]10517f40 ]105143e0 ]10514c1c ]write(33, "x", 1) = 1 <0.028588>
0.417500 [088d625c: 3b3e1878 121576e8 ]12163e1c ]1216473c ]12b6e75c ]112bc3e0 ]112d7880 ]112d7aa0 ]112d6b00 ]112d9aec ]112fd000 ]ioctl(29, 0x20004c01, 0) = 0 <0.000032>
0.282577 [1019e878: 30766c98 1374a008 ]1374a1f0 ]10198854 ]10198b0c ]1019908c ]10195cb4 ]10195e08 ]1019611c ]1019a810 ]10191fa0 ]--- SIGVTALRM (Virtual timer expired) @ 0 (0) ---
0.252104 [082f4808: 35a55a08 0899e314 ]1217ecb8 ]11c47918 ]1219a614 ]12bfeee4 ]1058e71c ]105c51f0 ]105c5980 ]10578674 ]105bfa4c ]futex(0x89ba380, FUTEX_LOCK_PI, 1) = 0 <0.000033>
我的问题是:
(1) 如果我们以 0.252104 开头的行为例,这是否意味着 252ms 包括先前在堆栈上的所有函数(1019e878,...10191fa0) 和执行到调用 futex( ) 在当前堆栈 (082f4808...1219a614,..10578674) 加上任务被调度的时间加上执行 futex() 调用(即 33us)?
(2) 有没有办法确定 futex() 调用是否真的导致进程等待?
(3) 内核在进行系统调用时是否会调度该任务?
(4) 以0.282577开头的行中,SIGALARM时间是否会导致283ms的延迟?(5) 在以 0.417500 开头的行中,调用 ioctl() 会导致 418ms 的延迟吗?(虽然 ioctl() 本身是在 32us 内完成的)。谢谢并恭祝安康。