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