これを行うための「正式な」方法があるかどうか疑問に思います。
背景と説明
ライブサーバーにいくつかのプログラムをインストールする必要があります。私はベンダー(FOSS、Github、複数の作者...)を信頼していますが、スクリプトが問題を引き起こし、システムリソースを消費し、サーバーが応答しなくなる完全に不可能ではないシナリオを避けたいと思います。 amavisがインストールされ、インストール直後に開始されましたが、いくつかの誤った設定のために平均負荷が4を超え、システムがほとんど応答しない状況がありました。
私の最初の教えはnice
-でしたnice -n 19 thatscript.sh
。これは役に立つかもしれないし、そうではないかもしれませんが、次のようなスクリプトを書いてアクティブにする方が良いと思います。
デーモンで実行(例)500ms-2s
ps
とマーク付きのプロセスを確認してください。grep
表示されたプロセス(または他のプロセス)があまりにも多くのCPUを使用している場合(まだ定義されていない)、そのプロセスを終了します。
SIGKILL
2番目のレッスンは、私が車輪を再発明したのは今回が初めてではないということです。
もしそうなら、プログラムとプログラムが生成するプロセスを事前定義された限られた量のシステムリソースに「閉じる」か、特定のしきい値に達すると自動的にシャットダウンする良い方法はありますか?
答え1
選択肢 #1: monit を使用したプロセスのモニタリング
インストールするメディア/モニタリングそして、このテンプレートに基づいて構成ファイルを作成します。
check process myprogram
matching "myprogram.*"
start program = "/usr/bin/myprogram" with timeout 10 seconds
stop program = "/usr/bin/pkill thatscript"
if cpu > 99% for 2 cycles then stop
if loadavg (5min) > 80 for 10 cycles then stop
代替案 #2: cgroup を使用したプロセス CPU 使用量の制限
最も基本的なLinux専用ソリューションの1つです。多くのオプションと複雑さを提供します。
例:
sudo cgcreate -g cpu:/cpulimited
sudo cgset -r cpu.shares=512 cpulimited
sudo cgexec -g cpu:cpulimited /usr/bin/myprogram > /dev/null &
次の内容をもっと読んでください。
DigitalOcean - 方法:CentOS 6でcgroupを使用してリソースを制限する
回避策#3:CPUlimitを使用してプロセスCPU使用率を制限します。
選択したパッケージマネージャから最新バージョンのcpulimitを入手するか、利用可能なソースを取得します。GitHub。
CPU使用率を90%に制限します。cpulimit -l 90 /usr/bin/myprogram > /dev/null &
注:
特定のCPUコアを使用するようにプロセスを固定することで、常に空きCPU性能を確保できます。
答え2
systemd
宛先/サービスのリソースは制限される可能性があります。man
ページから:
実行中のプロセスに指定されたCPU時間クォータを割り当てます。サフィックス「%」を使用してパーセント値を使用します。この割合は、CPUで利用可能な合計CPU時間と比較して、デバイスが受信できる最大CPU時間を指定します。複数の CPU に CPU 時間を分配するには、100% より大きい値を使用します。これは
cpu.max
、統合制御グループ階層の属性とcpu.cfs_quota_us
レガシーの属性を制御します。これらの制御グループのプロパティの詳細については、およびcgroup-v2.txt
を参照してくださいsched-design-CFS.txt
。例:
CPUQuota=20%
実行中のプロセスがCPUのCPU時間の20%を超えないようにしてください。ヒント"
CPUAccounting=true
"。
CPUAccounting
これを使うと私も含めるからだ。
このマシンのCPU使用率統計をオンにします。ブールパラメータを使用します。セルのCPUスペースを開くと、同じスライスに含まれるすべてのセルとその中に含まれるすべての親スライスとセルについても暗黙的に開きます。この設定のシステムデフォルトは
DefaultCPUAccounting=
を介して制御できますsystemd-system.conf(5)
。
私も引用します。Slice
:
単位の配置に使用されるスライス単位の名前。
system.slice
デフォルトは、すべてのセルタイプのすべてのインスタンス化されていないセルのものです(スライスセル自体は除く、以下を参照)。デフォルトでは、インスタンスセルはsystem.slice
テンプレート名に沿って名前付きサブスライスに配置されます。
したがって、デフォルトでは、すべてが同じslice
リソースプールに配置されます。つまり、すべてが1つのリソースプールにあることを意味します。
MemoryHigh
見どころの追加場所:
このデバイスで実行されるプロセスのメモリ使用量の上限を指定します。やむを得ずメモリ使用量が限度を超えることもあり、この場合、プロセス速度がひどく遅くなり、メモリを多く占めることになる。これは単位メモリ使用量を制御する基本的なメカニズムです。
メモリサイズをバイト単位で取得します。値にK、M、G、またはTサフィックスが付いている場合、指定されたメモリサイズはそれぞれキロバイト、メガバイト、ギガバイト、またはテラバイト(デフォルト1024)として解釈されます。あるいは、システムにインストールされている物理メモリに基づいてパーセンテージ値を指定できます。特殊値「無限大」を指定した場合、メモリ制限は適用されません。これは"
memory.high
"制御グループ属性を制御します。この制御グループの属性の詳細については、を参照してくださいcgroup-v2.txt
。ヒント"
MemoryAccounting=true
"。この設定は、統合制御グループ階層を使用して無効になっている場合にのみサポートされます
MemoryLimit=
。
systemd
サービスにスクリプトを簡単に配置できます。
/usr/local/thatscript.sh
スクリプトが次のとおりであるとします。
/usr/lib/systemd/system/thatscript.service
[Unit]
Description=This runs "thatscript"
ConditionFileNotEmpty=/usr/local/thatscript.sh
[Service]
Type=simple
ExecStart=/usr/local/thatscript.sh
CPUQuota=20%
[Install]
WantedBy=multi-user.target
その後、起動時に実行したり手動で起動したい場合は、systemctl daemon-reload
新しいサービスファイルを読む必要があります。systemctl enable thatscript.service
systemctl start thatscript.service