Назад | Перейти на главную страницу

В чем разница между фермой -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 не ... Может ли кто-нибудь объяснить, в чем именно заключается эта разница? Что делается в оставшееся время «вне» системного вызова?

Время вне системного вызова - это время, потраченное на выполнение кода вашей программы до того, как он перейдет к следующему системному вызову.

Основываясь на процитированной вами документации, я нахожу совершенно ясным, что один охватывает всю продолжительность от одного системного вызова до следующего, а другой охватывает только время внутри системного вызова.

Процент времени, потраченного на системные вызовы, по сравнению с процентом времени, потраченного на внешние системные вызовы, примерно скажет вам, ограничен ли процесс процессором.

Процесс, связанный с процессором, большую часть времени проводит вне системных вызовов. Это состояние, в котором будет находиться процесс во время выполнения вычислений. Для процесса, связанного с процессором, разница между двумя числами будет большой и, вероятно, по крайней мере на порядок.

Процесс, не связанный с ЦП, большую часть времени будет заблокирован в ожидании событий. Поскольку блокировка может происходить только внутри системных вызовов. Для процесса, не связанного с ЦП, числа будут примерно одинаковыми (вероятно, отличаться только процентным соотношением).

Это было простое объяснение, на самом деле нужно рассмотреть еще несколько аспектов. Из-за отображения и подкачки памяти процесс может фактически блокироваться, не выполняя системные вызовы. Кроме того, ядро ​​может предлагать функции, которые включают вычисления внутри кода ядра. Это может привести к тому, что процесс будет проводить большую часть времени внутри системных вызовов и по-прежнему будет зависеть от ЦП. Последнее, например, могло произойти при использовании зашифрованных файловых систем.