Linux コマンドのタイミング

LinuxBeginner
オンラインで実践に進む

はじめに

この実験(Lab)では、Linux でコマンドの実行時間を測定する方法を学びます。コマンドの実行にかかる時間を追跡する能力は、パフォーマンス分析、最適化、およびトラブルシューティングにおいて非常に役立つスキルです。

time コマンドは、プログラムまたはコマンドの実行にかかる時間を測定できる、シンプルでありながら強力なツールです。これは、スクリプトを最適化したり、問題を解決するためのさまざまなアプローチの効率を比較したりする場合に特に役立ちます。

この実験(Lab)を終えるまでに、time コマンドを使用して実行時間を測定し、結果を解釈して、コマンド効率に関する情報に基づいた意思決定を行えるようになります。

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

この出力では:

  • 最初の行は、スクリプトの出力です。
  • 2 行目は、タイミング情報を示しています。
    • user: ユーザーモードで費やされた CPU 時間の量 (この場合は 0.00 秒)。
    • system: カーネルモードで費やされた CPU 時間の量 (この場合は 0.00 秒)。
    • cpu: CPU 使用率のパーセンテージ (この場合は 90%)。
    • total: 開始から終了までの合計経過時間 (実時間) (この場合は 0.001 秒)。

この簡単な例は、スクリプトが予想どおり非常に迅速に実行されることを示しています。

Time コマンドの出力の理解

time コマンドの基本的な使い方を見てきたので、提供される出力を詳しく見ていきましょう。これらのメトリクスを理解することは、適切なパフォーマンス分析にとって非常に重要です。

前のステップで time コマンドを実行したとき、1 行にいくつかの時間測定値が表示されました。

  1. user - これは、ユーザーモードコード (カーネル外) で費やされた CPU 時間の量です。CPU がプログラムのコードをアクティブに処理していた時間のみをカウントします。

  2. system - これは、カーネルで費やされた CPU 時間の量です。これには、ファイルの読み取りまたは書き込みなどのシステムコールにかかる時間が含まれます。

  3. cpu - これは、実行中の CPU 使用率のパーセンテージを示します。

  4. total - これは、コマンドが開始されてから終了するまでの合計実時間 (wall-clock time) です。これは、ストップウォッチで測定するものです。

簡単なスクリプトの場合、スクリプトの実行内容が非常に少ないため、これらの時間はすべて非常に小さくなりました。

これらの値をより明確に確認するために、より CPU 負荷の高いスクリプトを作成しましょう。

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.10 秒)。スクリプトは多くのシステムコールを行わないため、system 時間も長くなっています (0.09 秒) が、比較的小さいままです。合計実時間は 2.335 秒で、CPU 使用率は 93% です。

これらのメトリクスを使用して、プログラムがどこで時間を費やしているかを特定できます。

  • user 時間が長い場合は、プログラムがユーザースペースで CPU 負荷が高いことを意味します。
  • system 時間が長い場合は、プログラムが多くのシステムコールを行っているか、I/O を待機していることを意味します。
  • totalusersystem の合計よりもはるかに大きい場合は、プログラムがリソースを待機しているか、並行して実行されていることを示している可能性があります。
  • CPU パーセンテージは、実行中に CPU がどれだけ効率的に使用されたかを示します。

異なるコマンドの実行時間の比較

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

次に、この I/O 負荷の高いスクリプトの時間を測定しましょう。

time ~/project/io_intensive.sh

次のような出力が表示されるはずです。

I/O operations complete
~/project/io_intensive.sh  0.01s user 0.00s system 96% cpu 0.014 total

CPU 負荷の高いスクリプトと比較して、system 時間が user 時間よりも相対的に高くなっていることに注意してください。これは、ファイル I/O 操作にはシステムコールが必要であり、システムコールはカーネルモードで実行されるためです。高い CPU パーセンテージ (96%) は、実行中にシステムがほとんどの時間アクティブに動作していたことを示しています。

テキストパターンを検索する一般的な Linux コマンドの時間も測定しましょう。

time grep -r "root" /etc

このコマンドは、/etc ディレクトリ以下のすべてのファイルで "root" という単語を再帰的に検索します。出力は次のようになります。

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

次に、時間を測定した 3 つのコマンドすべてを比較しましょう。

  1. simple_echo.sh: 非常に高速な実行 (合計 0.001 秒)、最小限の CPU 時間とシステム時間。
  2. cpu_intensive.sh: より長い実行 (合計 2.335 秒)、主にユーザー CPU 時間 (2.10 秒)。
  3. io_intensive.sh: 適度な実行時間 (合計 0.014 秒)、I/O 操作のため、ユーザー時間とシステム時間のバランスが取れています。
  4. grep -r "root" /etc: 適度な実行時間 (合計 0.259 秒)、テキスト処理とファイル I/O の両方のため、ユーザー時間とシステム時間のバランスが取れています。

この比較は、さまざまな種類の操作が実行時間とリソース使用量にどのように影響するかを示しています。これらのパターンを理解すると、スクリプトとコマンドのボトルネックを特定し、より効率的なコードを作成するのに役立ちます。

まとめ

この実験(Lab)では、Linux で time コマンドを使用して、コマンドとスクリプトの実行時間を測定および分析する方法を学びました。次のことについて実践的な経験を積みました。

  • 基本的な time コマンドの構文を使用して、実行時間を測定する
  • 主要なメトリクス (user、system、CPU 使用率(CPU percentage)、合計時間(total time)) を理解する
  • さまざまなパフォーマンス特性を持つスクリプトを作成して時間を測定する
  • 実行時間を比較して、パフォーマンスパターンを特定する
  • 詳細なパフォーマンス分析のためにタイミングツールを使用する

コマンド実行時間を測定する能力は、システム管理者、開発者、およびパワーユーザーにとって不可欠なスキルです。これにより、パフォーマンスのボトルネックを特定し、コードを最適化し、リソース割り当てについて情報に基づいた意思決定を行うことができます。

Linux を使い続けるうちに、time コマンドがパフォーマンス分析ツールキットの貴重なツールとなり、より効率的なスクリプトとコマンドを作成するのに役立つことがわかるでしょう。