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

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

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

Введение

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

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

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicSystemCommandsGroup(["Basic System Commands"]) 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/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!
~/project/simple_echo.sh  0.00s user 0.00s system 90% cpu 0.001 total

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

  • Первая строка — это вывод вашего скрипта.
  • Вторая строка показывает информацию о времени:
    • user: Количество времени центрального процессора (CPU), затраченного в пользовательском режиме (0.00s в данном случае).
    • system: Количество времени CPU, затраченного в режиме ядра (kernel mode) (0.00s в данном случае).
    • cpu: Процент использования CPU (90% в данном случае).
    • total: Общее прошедшее (реальное) время (wall-clock time) от начала до конца (0.001 секунды в данном случае).

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

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

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

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

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

  2. system - Это количество времени CPU, затраченного в ядре (kernel). Это включает время для системных вызовов (system calls), таких как чтение или запись файлов.

  3. cpu - Это показывает процент использования CPU во время выполнения.

  4. total - Это общее реальное время (wall-clock time) с момента запуска команды до ее завершения. Это то, что вы измерили бы с помощью секундомера.

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

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

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
~/project/cpu_intensive.sh  2.10s user 0.09s system 93% cpu 2.335 total

Обратите внимание, что на этот раз значения значительно выше, потому что наш скрипт выполняет больше работы. Время user намного выше (2.10s), потому что наш скрипт тратит большую часть своего времени на выполнение вычислений в пользовательском режиме. Время system также выше (0.09s), но все еще относительно мало, потому что наш скрипт не выполняет много системных вызовов. Общее реальное время составляет 2.335 секунды, а использование CPU составляет 93%.

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

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

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

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

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

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
~/project/io_intensive.sh  0.01s user 0.00s system 96% cpu 0.014 total

Обратите внимание, что время system теперь выше по отношению ко времени user по сравнению с нашим скриптом, интенсивно использующим CPU. Это связано с тем, что операции файлового ввода-вывода требуют системных вызовов, которые выполняются в режиме ядра. Высокий процент CPU (96%) указывает на то, что система активно работала большую часть времени во время выполнения.

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

time grep -r "root" /etc

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

[many matches shown here]
grep -r "root" /etc  0.18s user 0.08s system 99% cpu 0.259 total

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

  1. simple_echo.sh: Очень быстрое выполнение (0.001s total), минимальное время CPU и system.
  2. cpu_intensive.sh: Более длительное выполнение (2.335s total), в основном время CPU в пользовательском режиме (2.10s).
  3. io_intensive.sh: Умеренное время выполнения (0.014s total), сбалансированное между временем user и system из-за операций ввода-вывода.
  4. grep -r "root" /etc: Умеренное время выполнения (0.259s total), сбалансированное между временем user и system из-за обработки текста и файлового ввода-вывода.

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

Итог

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

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

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

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