サーバーがクラッシュするのを防ぐために、CPU使用率を制限することが重要になる場合があります。

これは、crontabで実行している可能性のあるカスタムスクリプトで特に役立ちます。

まず、Ubuntu12.10×64ドロップレットを起動します。

cpulimitをインストールします

apt-get -y install cpulimit

使用構文

Usage: cpulimit TARGET [OPTIONS...]
   TARGET must be exactly one of these:
      -p, --pid=N        pid of the process
      -e, --exe=FILE     name of the executable program file
      -P, --path=PATH    absolute path name of the executable program file
   OPTIONS
      -b  --background   run in background
      -l, --limit=N      percentage of cpu allowed from 0 to 100 (mandatory)
      -v, --verbose      show control statistics
      -z, --lazy         exit if there is no suitable target process, or if it dies
      -h, --help         display this help and exit

ベンチマークCPU使用率

cpulimitを使用せずにCPU使用率をベンチマークしてみましょう。

これは、アプリケーションでCPUを利用する方法の例です。

md5sum /dev/zero &

この’フォーク’md5sumプロセスをバックグラウンドに。 topでCPU使用率を確認できるようになりました。

ご覧のとおり、ほぼ100 % o fのCPUリソースを消費しています(このドロップレットに1つのCPUコアがある場合)。

fg を使用してこのプロセスをフォアグラウンドにし、 CTRL +Cでキャンセルできます。

cpulimitでCPU使用率を制限する

これで、 cpulimit をテストして、実際に想定どおりに動作するかどうかを確認できます。

CPU使用率を40%に制限し、同じコマンドを実行しましょう。

cpulimit -l 40 md5sum /dev/zero &

案の定、40%に制限されています:

マルチコアドロップレット

複数のプロセッサを搭載したドロップレットでは、各プロセスのCPU使用率を制限する必要があります。

これは、制限なしで4つのプロセスをフォークし、サーバー上で同時に実行できるようにするスクリプトです。

for j in `seq 1 4`; do md5sum /dev/zero & done

各CPUコアはほぼ100% ofのリソースを使用しています。

top - 23:29:28 up 7 days, 13:54,  1 user,  load average: 0.80, 1.08, 0.53
Tasks:  77 total,   5 running,  72 sleeping,   0 stopped,   0 zombie
%Cpu0  :100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  : 93.2 us,  6.8 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu2  : 95.0 us,  5.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu3  : 98.3 us,  1.7 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:   8178228 total,   380196 used,  7798032 free,    28136 buffers
KiB Swap:        0 total,        0 used,        0 free,   251708 cached

  PID USER      PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND                                                                                                                                                                        
 8400 root      20   0  7172  612  520 R 101.7  0.0   0:03.10 md5sum                                                                                                                                                                         
 8401 root      20   0  7172  612  520 R 101.7  0.0   0:03.10 md5sum                                                                                                                                                                         
 8399 root      20   0  7172  616  520 R  98.4  0.0   0:03.06 md5sum                                                                                                                                                                         
 8402 root      20   0  7172  612  520 R  98.4  0.0   0:03.09 md5sum                                                                                                                     

各プロセスにcpulimitを使用するには、次のコマンドの前に配置します。

for j in `seq 1 4`; do cpulimit -l 40 md5sum /dev/zero & done

現在、各プロセスは各スレッドを最大40 % o f使用し、サーバーに過負荷をかけません。

top - 23:31:03 up 7 days, 13:55,  1 user,  load average: 2.68, 1.72, 0.82
Tasks:  81 total,   5 running,  76 sleeping,   0 stopped,   0 zombie
%Cpu0  : 39.4 us,  0.7 sy,  0.0 ni, 59.6 id,  0.0 wa,  0.0 hi,  0.0 si,  0.3 st
%Cpu1  : 38.7 us,  1.7 sy,  0.0 ni, 59.6 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu2  : 39.4 us,  1.3 sy,  0.0 ni, 59.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu3  : 39.4 us,  1.7 sy,  0.0 ni, 58.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:   8178228 total,   380452 used,  7797776 free,    28144 buffers
KiB Swap:        0 total,        0 used,        0 free,   251708 cached

  PID USER      PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND                                                                                                                                                                        
 8442 root      20   0  7172  616  520 R  40.4  0.0   0:06.10 md5sum                                                                                                                                                                         
 8440 root      20   0  7172  612  520 R  40.0  0.0   0:06.09 md5sum                                                                                                                                                                         
 8435 root      20   0  7172  616  520 R  39.7  0.0   0:06.09 md5sum                                                                                                                                                                         
 8436 root      20   0  7172  612  520 R  39.7  0.0   0:06.10 md5sum                                                                                          

そして、あなたはすべて完了です!