Linuxでプロセスの時間とメモリ使用量を制限する方法


タイムアウトスクリプトは、Linuxのプロセスの時間とメモリ消費を制限するための便利なリソース監視プログラムです。これにより、プログラムを制御下で実行し、時間とメモリの制限を適用して、これらのパラメータに違反したときにプログラムを終了することができます。

インストールは必要ありません。タイムアウトプログラムを使用して引数と一緒にコマンドを実行するだけで、コマンドのメモリと時間の消費を監視し、制限を超えた場合はプロセスを中断し、事前定義されたメッセージで通知します。

このスクリプトを実行するには、LinuxシステムにPerl 5をインストールし、/ procファイルシステムをマウントする必要があります。

LinuxシステムにインストールされているPerlのバージョンを確認するには、次のコマンドを実行します。

$ perl -v

次に、gitコマンドを使用してタイムアウトリポジトリをシステムに複製し、cdコマンドを使用してローカルリポジトリに移動し、通常のLinuxコマンドとして呼び出します。

$ cd ~/bin
$ git clone https://github.com/pshved/timeout.git
$ cd timeout

次に、タイムアウトスクリプトがどのように機能するかを見てみましょう。

この最初の例は、 -m フラグを使用して、プロセスのメモリ使用量を100Mの仮想メモリに制限する方法を示しています。メモリのデフォルトの単位はキロバイトです。

ここで、stress-ngコマンドは4つの仮想メモリストレッサー(VMS)を実行し、それらを組み合わせて使用可能なメモリの40%を10分間使用します。したがって、各ストレッサーは使用可能なメモリの10%を使用します。

$ ./timeout -m 100000 stress-ng --vm 4 --vm-bytes 40% -t 10m

上記のtimeoutコマンドの出力を考慮すると、stress-ngワーカープロセスはわずか1.16秒後に終了しました。これは、VMSの合計メモリ消費量(438660キロバイト)が、stress-ngとその子プロセスで許可されている仮想メモリ使用量よりも多いためです。

プロセスの時間制限を有効にするには、図のように -t フラグを使用します。

$ ./timeout -t 4 stress-ng --vm 4 --vm-bytes 40% -t 10m

上記の例では、stress-ng CPU + SYS時間が定義された値4を超えると、ワーカープロセスが強制終了されます。

次のように、メモリと時間の両方を一度に制限することもできます。

$ ./timeout -t 4 -m 100000 stress-ng --vm 4 --vm-bytes 40% -t 10m

タイムアウトは、ハングアップ検出を有効にする -detect-hangups などのいくつかの高度なオプションもサポートします。

$ ./timeout --detect-hangups -m 100000 stress-ng --vm 4 --vm-bytes 40% -t 10m

-memlimit-rss または -s スイッチを使用して、RSS(常駐セットサイズ)のメモリ制限を監視できます。

$ ./timeout -m 100000 -s  stress-ng --vm 4 --vm-bytes 40% -t 10m

さらに、プロセスの終了コードまたはシグナル+128を返すには、図のように -confess または -c オプションを使用します。

$ ./timeout -m 100000 -c  stress-ng --vm 4 --vm-bytes 40% -t 10m

詳細と使用例については、タイムアウトGithubリポジトリ(https://github.com/pshved/timeout)を参照してください。

また、次の関連記事も同様に役立つ場合があります。

  1. How To Find Top 15 Processes by Memory Usage with ‘top’ in Batch Mode
  2. CPUTool – Limit and Control CPU Utilization of Any Process in Linux
  3. How To Limit CPU Usage of a Process in Linux with CPULimit Tool

タイムアウトスクリプトは、Linuxのプロセスの時間とメモリ消費を本質的に制限する単純なリソース監視プログラムです。以下のコメントフォームから、タイムアウトスクリプトに関するフィードバックをお送りください。