Я в настоящее время анализирую команду на Солярисе, который читает из файла и имеет очень низкую эффективность. 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
не делает... Кто-либо может объяснить, что точно имеет то значение? Что делается в остающееся время "вне" системного вызова?
На основании процитированной вами документации я нахожу совершенно очевидным, что один охватывает всю продолжительность от одного системного вызова до следующего, а другой охватывает только время в рамках системного вызова.
Процент времени, потраченного на системные вызовы, по сравнению с процентом времени, потраченного на внешние системные вызовы, примерно скажет вам, привязан ли процесс к процессору.
Связанный с процессором процесс проводит большую часть своего времени вне системных вызовов. Это состояние, в котором будет находиться процесс во время выполнения вычислений. Для процесса, привязанного к ЦП, разница между двумя числами будет большой и, вероятно, по крайней мере на порядок.
Процесс, не привязанный к ЦП, большую часть времени будет заблокирован в ожидании событий. Поскольку блокировка может происходить только внутри системных вызовов. Для процесса, который не привязан к ЦП, числа будут примерно одинаковыми (вероятно, отличаться только одной цифрой в процентах).
Это было простое объяснение, на самом деле необходимо рассмотреть еще несколько аспектов. Из-за отображения памяти и подкачки процесс может фактически блокироваться, не выполняя системные вызовы. Кроме того, ядро может предлагать функции, которые включают вычисления внутри кода ядра. Это может привести к тому, что процесс будет проводить большую часть времени внутри системных вызовов и по-прежнему будет зависеть от ЦП. Последнее, например, могло произойти при использовании зашифрованных файловых систем.
Время вне системного вызова - это время, потраченное на выполнение кода вашей программы до того, как он перейдет к следующему системному вызову.