Измерение времени выполнения команд Linux

LinuxLinuxBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии (лабораторной работе) вы научитесь измерять время выполнения команд в Linux. Возможность отслеживать, сколько времени занимает выполнение команд, является ценным навыком для анализа производительности, оптимизации и устранения неполадок.

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

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/FileandDirectoryManagementGroup(["File and Directory Management"]) linux(("Linux")) -.-> linux/TextProcessingGroup(["Text Processing"]) linux(("Linux")) -.-> linux/SystemInformationandMonitoringGroup(["System Information and Monitoring"]) linux(("Linux")) -.-> linux/BasicSystemCommandsGroup(["Basic System Commands"]) linux/BasicSystemCommandsGroup -.-> linux/echo("Text Display") linux/BasicFileOperationsGroup -.-> linux/cat("File Concatenating") linux/BasicFileOperationsGroup -.-> linux/chmod("Permission Modifying") linux/FileandDirectoryManagementGroup -.-> linux/cd("Directory Changing") linux/TextProcessingGroup -.-> linux/grep("Pattern Searching") linux/SystemInformationandMonitoringGroup -.-> linux/time("Command Timing") subgraph Lab Skills linux/echo -.-> lab-271405{{"Измерение времени выполнения команд Linux"}} linux/cat -.-> lab-271405{{"Измерение времени выполнения команд Linux"}} linux/chmod -.-> lab-271405{{"Измерение времени выполнения команд Linux"}} linux/cd -.-> lab-271405{{"Измерение времени выполнения команд Linux"}} linux/grep -.-> lab-271405{{"Измерение времени выполнения команд Linux"}} linux/time -.-> lab-271405{{"Измерение времени выполнения команд Linux"}} end

Введение в команду time

Команда time представляет собой утилиту, которая измеряет время выполнения заданной команды или программы. Этот инструмент помогает понять, сколько времени занимает выполнение команды, что полезно для мониторинга и оптимизации производительности.

Начнем с создания простого скрипта, который мы будем использовать для демонстрации команды time.

Сначала перейдите в директорию проекта, если вы еще не находитесь в ней:

cd ~/project

Теперь создадим простой скрипт с именем simple_echo.sh, который просто выводит сообщение:

echo '#!/bin/bash' > ~/project/simple_echo.sh
echo 'echo "Hello, this is a simple script!"' >> ~/project/simple_echo.sh

Перед запуском скрипта необходимо сделать его исполняемым:

chmod +x ~/project/simple_echo.sh

Теперь используем команду time для измерения времени выполнения этого скрипта:

time ~/project/simple_echo.sh

Вы должны увидеть вывод, похожий на следующий:

Hello, this is a simple script!

real    0m0.003s
user    0m0.001s
sys     0m0.001s

В этом выводе:

  • Первая строка - это вывод вашего скрипта.
  • Следующие три строки показывают информацию о времени:
    • real: Общее время по часам (от начала до конца), затраченное на выполнение команды.
    • user: Количество времени ЦП, затраченного в пользовательском режиме.
    • sys: Количество времени ЦП, затраченного в режиме ядра.

В этом простом примере показано, что наш скрипт выполняется очень быстро, как и ожидалось.

Понимание вывода команды time

Теперь, когда мы рассмотрели базовое использование команды time, давайте более подробно изучим вывод, который она предоставляет. Понимание этих показателей (метрик) является важным для правильного анализа производительности.

Когда вы запустили команду time на предыдущем шаге, вы увидели три разных измерения времени:

  1. real (или elapsed) - Это общее время по часам от момента запуска команды до ее завершения. Это то, что вы бы измерили с помощью секундомера.

  2. user - Это количество времени ЦП, затраченное на выполнение кода в пользовательском режиме (за пределами ядра). Он учитывает только время, когда ЦП активно работал над кодом вашей программы.

  3. sys (или system) - Это количество времени ЦП, затраченное в ядре. Это включает время, затраченное на системные вызовы, такие как чтение или запись файлов.

Для нашего простого скрипта все эти времена были очень малы, потому что скрипт выполняет очень мало работы.

Давайте создадим более интенсивный по использованию ЦП скрипт, чтобы более четко увидеть эти значения:

echo '#!/bin/bash' > ~/project/cpu_intensive.sh
echo 'for i in {1..1000000}; do' >> ~/project/cpu_intensive.sh
echo '  let "sum = $i + $i"' >> ~/project/cpu_intensive.sh
echo 'done' >> ~/project/cpu_intensive.sh
echo 'echo "Calculation complete"' >> ~/project/cpu_intensive.sh

Сделайте скрипт исполняемым:

chmod +x ~/project/cpu_intensive.sh

Теперь измерим время выполнения этого скрипта:

time ~/project/cpu_intensive.sh

Вы должны увидеть вывод, похожий на следующий (фактические времена могут отличаться в зависимости от вашей системы):

Calculation complete

real    0m1.234s
user    0m1.200s
sys     0m0.032s

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

Вы можете использовать эти показатели для определения, где программа тратит свое время:

  • Высокое время user означает, что программа интенсивно использует ЦП в пользовательском пространстве.
  • Высокое время sys означает, что программа делает много системных вызовов или ожидает ввода-вывода (I/O).
  • Если время real намного выше суммы времени user и sys, это может указывать на то, что программа ожидает ресурсов или работает параллельно.

Сравнение времени выполнения различных команд

Теперь, когда мы понимаем, как использовать команду time и интерпретировать ее вывод, давайте сравним время выполнения различных команд, чтобы понять их характеристики производительности.

Сначала создадим скрипт, интенсивно использующий ввод-вывод (I/O), который читает и записывает данные:

echo '#!/bin/bash' > ~/project/io_intensive.sh
echo 'for i in {1..10}; do' >> ~/project/io_intensive.sh
echo '  cat /etc/passwd > ~/project/temp_file_$i.txt' >> ~/project/io_intensive.sh
echo '  cat ~/project/temp_file_$i.txt > /dev/null' >> ~/project/io_intensive.sh
echo 'done' >> ~/project/io_intensive.sh
echo 'rm ~/project/temp_file_*.txt' >> ~/project/io_intensive.sh
echo 'echo "I/O operations complete"' >> ~/project/io_intensive.sh

Сделайте скрипт исполняемым:

chmod +x ~/project/io_intensive.sh

Теперь измерим время выполнения этого скрипта, интенсивно использующего ввод-вывод:

time ~/project/io_intensive.sh

Вы должны увидеть вывод, похожий на следующий:

I/O operations complete

real    0m0.050s
user    0m0.010s
sys     0m0.040s

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

Давайте также измерим время выполнения обычной команды Linux, которая ищет текстовые шаблоны:

time grep -r "root" /etc

Эта команда рекурсивно ищет слово "root" во всех файлах в директории /etc. Вывод может выглядеть так:

[many matches shown here]

real    0m0.567s
user    0m0.123s
sys     0m0.445s

Теперь сравним все три команды, время выполнения которых мы измерили:

  1. simple_echo.sh: Очень быстрое выполнение, минимальное использование ЦП и системного времени.
  2. cpu_intensive.sh: Более длительное выполнение, в основном используется пользовательское время ЦП.
  3. io_intensive.sh: Среднее время выполнения, более высокое системное время из-за операций ввода-вывода.
  4. grep -r "root" /etc: Среднее время выполнения, сбалансированное между пользовательским и системным временем из-за как обработки текста, так и операций ввода-вывода файлов.

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

Для более подробной информации о времени выполнения вы также можете использовать команду /usr/bin/time с флагом -v (подробный вывод):

/usr/bin/time -v ~/project/simple_echo.sh

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

Резюме

В этом практическом занятии (лабораторной работе) вы узнали, как использовать команду time в Linux для измерения и анализа времени выполнения команд и скриптов. Вы приобрели практический опыт в следующих аспектах:

  • Использовании базового синтаксиса команды time для измерения продолжительности выполнения
  • Понимании трех ключевых показателей (метрик): реального времени (real), времени пользователя (user) и системного времени (sys)
  • Создании и измерении времени выполнения скриптов с различными характеристиками производительности
  • Сравнении времени выполнения для выявления шаблонов производительности
  • Использовании более продвинутых инструментов для измерения времени для детального анализа

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

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