桁架-D 和桁架-E 有什么区别?

桁架-D 和桁架-E 有什么区别?

我目前正在分析 Solaris 上的一个命令,该命令从文件中读取数据,性能非常低。该truss -D命令显示read系统调用最多需要 0.03 秒,但当我使用时truss -E,它们总是 0.0000 或 0.0001(比使用该-D选项低两个数量级)。在man页面中,它显示:

 -D
     Includes a time delta on each line of trace output.  The
     value appears as a field containing seconds.fraction and
     represents the elapsed time for the  LWP  that  incurred
     the event since the last reported event incurred by that
     LWP. Specifically, for system calls,  this  is  not  the
     time spent within the system call.

 -E
     Includes a time delta on each line of trace output.  The
     value appears as a field containing seconds.fraction and
     represents the difference in time  elapsed  between  the
     beginning and end of a system call.

     In contrast to  the -D option, this  is  the  amount  of
     time spent within the system call.

因此,该-E选项测量系统调用中实际花费的时间,而-D没有... 有人能解释一下到底是什么造成了这种差异吗?系统调用“之外”的剩余时间里做了什么?

答案1

根据您引用的文档,我发现一个很清楚地涵盖了从一个系统调用到下一个系统调用的整个持续时间,而另一个仅涵盖系统调用内的时间。

系统调用内部所花费的时间百分比与系统调用外部所花费的时间百分比可以粗略地告诉您某个进程是否受 CPU 限制。

CPU 受限的进程大部分时间都花在系统调用之外。这是进程在执行计算时所处的状态。对于 CPU 受限的进程,这两个数字之间的差异会很大,可能至少相差一个数量级。

不受 CPU 限制的进程大多数时间都会被阻塞,等待事件。因为阻塞只能在系统调用内部发生。对于不受 CPU 限制的进程,数字将大致相同(可能只相差一位数的百分比)。

以上只是简单的解释,实际上还有几个方面需要考虑。由于内存映射和交换,进程实际上可以在不进行系统调用的情况下阻塞。此外,内核可以提供涉及内核代码内计算的功能。这可能导致进程大部分时间都花在系统调用上,但仍然受到 CPU 限制。例如,在使用加密文件系统时可能会发生后者。

答案2

系统调用之外的时间是指在进入下一个系统调用之前运行程序代码所花费的时间。

相关内容