Что означают "реальный", "пользователь" и " sys " на выходе времени(1)?

$ time foo
real        0m0.003s
user        0m0.000s
sys         0m0.004s
$

Что означают "реальный", "пользователь" и " sys " в выходных данных времени?

какой из них имеет значение при бенчмаркинге моего приложения?

4 ответов


Real, Пользователь и Sys статистика времени процесса

одна из этих вещей не похожа на другие. Real относится к фактическому истекшему времени; пользователь и Sys относятся к используемому времени процессора только процесс.

  • реальные время настенных часов-время от начала до конца вызова. Это все истекшее время, включая временные срезы, используемые другими процессами, и время, которое процесс проводит заблокированным (например, если это ожидание завершения ввода-вывода).

  • пользователей - это количество времени процессора, затраченное в коде пользовательского режима (вне ядра)внутри процесс. Это только фактическое время процессора, используемое при выполнении процесса. Другие процессы и время, которое процесс тратит на блокировку, не учитываются в этой цифре.

  • Sys - это количество времени процессора, затраченного в ядре в процессе. Это означает выполнение CPU время, проведенное в системных вызовах внутри ядра в отличие от библиотеки, которая работает в пользовательском пространстве. Как и "пользователь", это только время процессора, используемое процессом. Ниже приводится краткое описание режима ядра (также известного как режим "супервизор") и механизма системных вызовов.

User+Sys расскажет вам, сколько фактического времени процессора ваш процесс использовал. Обратите внимание, что это во всех процессорах, поэтому, если процесс имеет несколько потоков (и это процесс выполняется на компьютере с более чем одним процессором) он потенциально может превышать время настенных часов, сообщенное Real (что обычно происходит). Обратите внимание, что в выходных данных эти цифры включают User и Sys время всех дочерних процессов (и их потомков), а также когда они могли быть собраны, например,wait(2) или waitpid(2), хотя базовые системные вызовы возвращают статистику для процесса и его дочерних элементов отдельно.

истоки статистика сообщает time (1)

статистика сообщает time собраны из различных системных вызовов. 'User' и 'Сыс с wait (2) или times (2) в зависимости от конкретной системы. "Real" рассчитывается с начала и до конца времени, собранного из gettimeofday (2) звонок. В зависимости от версии системы, различные другие статистические данные, такие как количество переключателей контекста, также могут быть собраны time.

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

краткое руководство по ядра и пользователя режим

в Unix или любой операционной системе с защищенной памятью, 'Kernel' или 'Supervisor' режим относится к привилегированный режим что процессор может работать. Определенные привилегированные действия, которые могут повлиять на безопасность или стабильность, могут выполняться только при работе ЦП в этом режиме; эти действия недоступны для кода приложения. Примером такого действия может быть манипуляция ММУ получить доступ к адресу пространство другого процесса. Как правило, режим пользователя код не может этого сделать (по уважительной причине), хотя он может запросить общий из ядра, которое мог бы быть прочитанным или написанным более чем одним процессом. В этом случае общая память явно запрашивается у ядра через безопасный механизм, и оба процесса должны явно присоединяться к нему, чтобы использовать его.

привилегированный режим обычно называют "ядром" режим, потому что ядро выполняется процессором, работающим в этом режиме. Чтобы переключиться в режим ядра, вы должны выдать конкретную инструкцию (часто называемую ловушка), который переключает процессор на работу в режиме ядра и запускает код из определенного места, содержащегося в таблице перехода. по соображениям безопасности, вы не можете переключиться в режим ядра и выполнить произвольный код - ловушки осуществляется через таблицу адресов, которые не могут быть записаны, если процессор работает в режиме супервизора. Вы ловите с явным номером ловушки, и адрес просматривается в таблице перехода; ядро имеет конечное число контролируемых точек входа.

системные вызовы в библиотеке C (особенно описанные в разделе 2 man-страниц) имеют компонент пользовательского режима, который вы фактически вызываете из своей программы C. За кулисами они могут выдавать один или несколько системных вызовов ядру для выполнения определенных служб, таких как ввод-вывод, но у них также есть код, работающий в пользовательском режиме. Также вполне возможно напрямую выпустить ловушку в режим ядра из любого пользовательского кода пространства, если это необходимо, хотя вам может потребоваться написать фрагмент ассемблера, чтобы правильно настроить регистры для вызова. Страница, описывающая системные вызовы, предоставляемые ядром Linux, и соглашения по настройке регистров, можно найти здесь.

подробнее о 'sys'

есть то, что ваш код не может делать в пользовательском режиме - например, выделение памяти или доступ к оборудованию (HDD, сеть и т. д.). Они находятся под наблюдением ядра, и только оно может сделать их. Некоторые операции, которые вы делаете (например,malloc илиfread/fwrite) вызовет эти функции ядра, и это будет считаться временем "sys". К сожалению, это не так просто, как "каждый вызов malloc будет подсчитываться во времени"sys"". Вызов malloc сделает некоторую обработку самостоятельно (все еще подсчитано в "пользовательском" времени), а затем где-то по пути он может вызвать функцию в ядре (подсчитано в " sys " времени). После возврата из вызова ядра в "user" будет еще некоторое время, а затем malloc вернется к вашему коду. Что касается того, когда происходит переключение, и сколько он провел в режиме ядра... вы не можете сказать. Это зависит от реализации библиотеки. Кроме того, другие, казалось бы, невинные функции также могут использовать malloc и тому подобное в фоновом режиме, который будет снова у вас есть некоторое время в " sys " тогда.


для расширения на принято отвечать, Я просто хотел предоставить еще одну причину, почему realuser + sys.

имейте в виду, что real представляет фактическое прошедшее время, в то время как user и sys значения представляют время выполнения процессора. В результате в многоядерной системе user и/или sys время (а также их сумма) может на самом деле до в режиме реального времени. Например, в Java-приложении, которое я запускаю для класса, я получаю этот набор значения:

real    1m47.363s
user    2m41.318s
sys     0m4.013s

Real показывает общее время поворота для процесса; в то время как пользователь показывает время выполнения пользовательских инструкций и Sys - это время для выполнения системных вызовов!

Реальное время включает время ожидания также (время ожидания для ввода / вывода и т. д.)


реальные: фактическое время, затраченное на запуск процесса от начала до конца, как если бы оно было измерено человеком с секундомером

пользователей: кумулятивное время, затраченное всеми процессорами во время вычисления

sys: совокупное время, затраченное всеми процессорами во время системных задач, таких как выделение памяти.

обратите внимание, что иногда user + sys может быть больше, чем real, как множественный процессоры могут работать параллельно.