- How can I measure the execution time of a terminal process?
- 8 Answers 8
- Команда time в Linux
- Синтаксис и опции time
- Опции форматирования вывода
- Как узнать время выполнения команды Linux
- 1. Вывод времени выполнения в терминал
- 3. Вывод с форматированием
- Выводы
- Засекаем время выполнения команды/скрипта в Linux
- Примеры использования
- Форматирование вывода
How can I measure the execution time of a terminal process?
I’m trying to measure the execution time of a process that I call via the command line (i.e., I want to find out how long it takes to for the process to finish). Is there any command that I can add to the command calling the process that will achieve this?
8 Answers 8
Add time before the command you want to measure. For example: time ls .
The output will look like:
real 0m0.606s user 0m0.000s sys 0m0.002s
Explanation on real , user and sys (from man time ):
- real : Elapsed real (wall clock) time used by the process, in seconds.
- user : Total number of CPU-seconds that the process used directly (in user mode), in seconds.
- sys : Total number of CPU-seconds used by the system on behalf of the process (in kernel mode), in seconds.
@ninjalj, can you provide more information on what the real , user , and sys times are that this command returns?
Note that you may need sudo apt-get install time if you are using a shell where time is not a builtin.
Note that this is the output from Bash’s time builtin, but man time would be about an executable (like /usr/bin/time , from the time package), and its output would look different. Also in Bash, you can run help time for help with the builtin.
Note that the process end does not mean all the work is finished. A copy may take additional minutes after the «time» returns for flushing system bufffers (therefor with unallocated sys time also).
For a line-by-line delta measurement, try gnomon.
It is a command line utility, a bit like moreutils’s ts, to prepend timestamp information to the standard output of another command. Useful for long-running processes where you’d like a historical record of what’s taking so long.
Piping anything to gnomon will prepend a timestamp to each line, indicating how long that line was the last line in the buffer—that is, how long it took the next line to appear. By default, gnomon will display the seconds elapsed between each line, but that is configurable.
Команда time в Linux
В некоторых случаях при работе с терминалом Linux нужно знать время выполнения тех или иных команд, например, для отслеживания проблем. Для этой задачи существует утилита time. Конкретно про нее и пойдет речь в нашей статье.
Мы расскажем, как работает команда time Linux и какой у неё синтаксис. Затем перейдем к описанию доступных опций. А в конце упомянем несколько популярных сценариев использования.
Синтаксис и опции time
Утилита запускает заданную пользователем команду и после этого выводит информацию о времени ее выполнения. У нее достаточно удобный синтаксис. Сначала нужно указать опции для time, затем – выполняемую команду, а в конце – аргументы к ней:
$ time опции команда_для_выполнения аргументы
Рассмотрим список доступных опций:
- -o, —output – сохранять данные в выбранный файл вместо стандартного вывода в терминале. При этом старые данные в файле будут перезаписаны.
- -a, —append – добавлять в файл новую информацию, а не перезаписывает старую. Опция полезна только в сочетании с -o.
- -f, —format – выбрать определенный формат вывода. Подробности о форматировании описаны в следующем разделе статьи.
- -p, —profitably – использовать формат вывода данных для соответствия со стандартом POSIX 1003.2.
- -v, —verbose – выводить подробную информацию о выполнении программы.
- -V, —version – вывести версию утилиты time.
В этом списке представлены только основные опции. Получить подробную информацию можно командой:
Опции форматирования вывода
По умолчанию time может выводить информацию в не комфортном для чтения виде.
По этой причине для нее желательно задавать опции форматирования вывода, о которых и пойдет сейчас речь. Всего их три штуки. В качестве примера для их рассмотрения возьмем команду apt-get update.
Опция -v используется для вывода подробной информации:
sudo time -v apt-get update
Опция -p нужна для вывода данных в формате, соответствующем стандарту POSIX 1003.2:
sudo time -p apt-get update
А с помощью опции -f или —format детально задается форматирование вывода. Этот момент стоит рассмотреть более детально.
Строка с данными о форматировании, как правило, включает в себя спецификаторы ресурсов и обычный текст. Знак % обозначает, что следующий после него символ следует воспринимать как спецификатор ресурсов.
С помощью знака \ задается разделительный символ. Есть три доступных варианта: \t – табуляция, \n – новая строка, \\ – обратная косая черта. Если после \ указать любой другой символ, то в терминале появится вопросительный знак (?), который говорит об ошибке ввода.
Остальной текст в строке формата полностью копируется в поле вывода. При этом time всегда начинает вывод данных с новой строки после информации о выполнении самой команды.
Рассмотрим доступные спецификаторы ресурсов:
- % – литерал %. То есть для вывода знака процента нужно в команде указать %%.
- С – имя команды и использованные аргументы.
- D – средний размер неразделенной области данных. Отображается в килобайтах.
- E – реальное время выполнения команды в привычном часовом формате. Выводится в виде [часы:]минуты:секунды.
- N – количество мажорных ошибок или ошибок, связанных с вводом-выводом, возникших при выполнении процесса.
- I – количество входов в файловую систему.
- K – среднее значение задействованной памяти для кода (text), инициализированных данных (data) и стека (stack). Отображается в килобайтах.
- M – максимальный размер резидентного множества во время выполнения процесса в килобайтах.
- O – количество выходов из файловой системы.
- P – процент загруженности CPU (центрального процессора).
- R – количество минорных ошибок.
- S – время в секундах, в течении которого CPU использовался системой от имени процесса в режиме супервизора (kernel mode).
- U – время в секундах, в течении которого CPU использовался процессом напрямую в пользовательском режиме (user mode).
- W – сколько раз процесс был выгружен из оперативной памяти.
- X – тут не понял.
- Z – размер системной страницы. Это значение – константа, но она различается между системами.
- c – количество невольных переключений контекста при выполнении процесса.
- e – реальное время выполнения команды в привычном часовом формате. Выводится в секундах.
- k – количество сигналов, дошедших до процесса.
- p – средний размер неразделенного стека процесса, в килобайтах.
- r – количество полученных сокетных сообщений.
- s – количество отправленных сокетных сообщений.
- t – средний размер резидентного множества процесса, в килобайтах.
- w – количество добровольных переключений контекста при выполнении процесса.
- x – код возврата для команды.
Это были все спецификаторы ресурсов, использующиеся при выборе форматирования для time. Теперь перейдем к сценариям использования команды.
Как узнать время выполнения команды Linux
Мы рассмотрим три основных примера, которые довольно часто используются: вывод данных в терминал, вывод в отдельный файл и вывод с форматированием.
1. Вывод времени выполнения в терминал
В качестве примера мы возьмем команду sleep, которая делает паузу на указанное время. Это будет очень наглядный пример, ведь время паузы будет совпадать с временем выполнения команды в time:
Еще хотелось бы упомянуть ситуацию, когда выполнение команды переводит окно терминала в другой режим, например, при запуске редактора nano для изменения файла /home/root-user/script.txt:
time nano /home/root-user/scripts/main_script.txt
После завершения работы редактора вы увидите общее время, в течение которого вы работали с файлом.
Информацию о результатах работы команды time можно сохранить в отдельный файл с помощью опции -o. В таком случае в окне терминала они выводиться не будут. Возьмем для примера извлечение содержимого архива ~/data/data.tar.gz с помощью утилиты tar. Информацию о времени выполнения сохраним в новом файле ~/data/data_time.txt. Еще добавим к команде опцию -v, чтобы получить подробные сведения:
sudo time -v -o ~/data/data_time.txt tar -xvf ~/data/data.tar.gz -C ~/data
3. Вывод с форматированием
Исходный вариант форматирования данных подходит далеко не во всех случаях. В качестве примера мы возьмем ранее использованную команду для извлечения архива, но не станем сохранять данные в файл. При ее выполнении нам интересно:
- Информация о самой команде и заданных опциях – это спецификатор %C.
- Загруженность CPU – спецификатор %P.
- Общее время выполнения в секундах – спецификатор %e.
Для комфортного восприятия каждый пункт будет выводиться в отдельной строке с помощью разделителя \n. При этом они все будут подписаны понятным образом.
Вот как выглядит итоговый вариант команды:
sudo time -f «Информация о команде:\n%C\nЗагруженность CPU: %P\nВремя выполнения: %e сек» tar -xvf ~/data/data.tar.gz -C ~/data
Обратите внимание, что весь текст, кроме символов после % и \, полностью отображается в терминале. Это удобный способ разметки
Выводы
В рамках данной статьи вы узнали как работает команда time Linux, которая следит за выполнением заданной команды и выдает подробную информацию о времени выполнения и т. д. Основная сложность при ее использовании – понимание опций для форматирования вывода. Но если в них разобраться, то больше никаких проблем не возникнет. Для вашего удобства мы упомянули конкретные примеры использования.
Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.
Засекаем время выполнения команды/скрипта в Linux
Замеряем длительность выполнения и расход ресурсов (память, проц) запущенной команды или скрипта с помощью замечательной Unix-утилиты — time.
Примеры использования
Например, засекаем время выгрузки дампа БД:
time mysql -uroot -p database < database.sql
Форматируем вывод нагрузки на проц и расход памяти:
/usr/bin/time -f '(%e %P %M)' php script.php /usr/bin/time -f '%em %Pcpu %Mkb' php script.php
Форматирование вывода
The resource specifiers, which are a superset of those recognized by the tcsh(1) builtin `time' command, are: % A literal `%'. C Name and command line arguments of the command being timed. D Average size of the process's unshared data area, in Kilobytes E Elapsed real (wall clock) time used by the process, in [H:]M:S.mcsec F Number of major, or I/O-requiring, page faults that occurred while the process was running. These are faults where the page has actually migrated out of primary memory. I Number of file system inputs by the process. K Average total (data+stack+text) memory use of the process, in Kilobytes. M Maximum resident set size of the process during its lifetime, in Kilobytes. O Number of file system outputs by the process. P Percentage of the CPU that this job got. This is just user + system times divided by the total running time. It also prints a percentage sign. R Number of minor, or recoverable, page faults. These are pages that are not valid (so they fault) but which have not yet been claimed by other virtual pages. Thus the data in the page is still valid but the system tables must be updated. S Total number of CPU-seconds used by the system on behalf of the process (in kernel mode), in seconds. U Total number of CPU-seconds that the process used directly (in user mode), in seconds. W Number of times the process was swapped out of main memory. X Average amount of shared text in the process, in Kilobytes. Z System's page size, in bytes. This is a per-system constant, but varies between systems. c Number of times the process was context-switched involuntarily (because the time slice expired). e Фактическое время выполнения процесса в сек. k Number of signals delivered to the process. p Average unshared stack size of the process, in Kilobytes. r Number of socket messages received by the process. s Number of socket messages sent by the process. t Average resident set size of the process, in Kilobytes. w Number of times that the program was context-switched voluntarily, for instance while waiting for an I/O operation to complete. x Exit status of the command.
#time, #memory usage, #cpu usage, #benchmark