
CPU とメモリを大量に消費するプロセスのツリーから始まるスクリプトがあります。その下には Python と実行可能ファイルがありますが、すべては単一の bash スクリプトと Python サブプロセスから始まります。
実行中、システムの残りの部分は完全に停止します。 で緩和を試みました
$ nice -n10 ionice -c2 ./Script.sh
が、これでは不十分です。コンピューターの使用が非常に遅くなります (実際にはこれは開発デスクトップですが、指定されたサーバー上の問題も同様になります)。
問題はプロセスがメモリを大量に使用することにあると疑っています。すべてがスワップアウトされ、動作が遅くなります。
物理メモリへのアクセスにおいてプロセス (およびその再帰的な子プロセス) の優先度を下げる方法はありますか? 他のタスクへの影響を制限しながら、バックグラウンドで低速で実行することを希望します。
答え1
メモリ消費の「ペース」を制限することはできませんが、さまざまなメカニズムを通じてメモリの総使用量を制限することはできます。
1) セキュリティ制限 /etc/security/limits.conf を介してプロセスを実行しているユーザーのメモリ使用量を制限します。このプロセスを、異なる作業を行っている同じユーザーとして実行している場合、この方法は機能しない可能性があります。
例:
username hard as 1000000
2) グループを制御する cgroup を使用すると、グループを作成し、メモリ使用量を制限することもできます。次のように cgroup を作成するだけです。
# cat >> /etc/cgconfig.conf << EOF
group memlimit {
memory {
memory.limit_in_bytes = 1073741824;
}
}
EOF
# cat >> /etc/cgrules.conf <<EOF
username memory memlimit/
EOF
もちろん、どちらの場合も、メモリの割り当てに失敗した場合から回復できるようにプログラムを開発する必要があります。
それができない場合は、スワッピングを避けるためにシステムにメモリを追加する必要があります。スワッピングが始まったら、カーネルの手に委ねられ、たとえば、kswapd の優先度を下げることはできません。また、たとえできたとしても、使用しているプログラムの一部がスワップアウトされ、システム応答がさらに遅くなることが保証されません。そのようなことはしないでください。
答え2
次の方法はメモリスワップには役立ちませんが、プロセスの IO の影響には役立つはずです。
level
も明示的に設定する必要があるようです。
ionice -c2 -n5 ./slowscript.sh
カーネルによっては、C2 だけでは不十分な場合があります。
マンページからの引用 ( man ionice
)
Note that before kernel 2.6.26 a process that has not asked for an I/O priority formally uses "none" as scheduling class, but the I/O scheduler will treat such
processes as if it were in the best-effort class. The priority within the best-effort class will be dynamically derived from the CPU nice level of the process:
io_priority = (cpu_nice + 20) / 5.
For kernels after 2.6.26 with the CFQ I/O scheduler, a process that has not asked for an I/O priority inherits its CPU scheduling class. The I/O priority is
derived from the CPU nice level of the process (same as before kernel 2.6.26).
基本的に、新しく開始されたすべてのプロセスは C2 N4 を取得するため、IO を可能な限り低く抑えたい場合は、アイドル状態のみ (C3) または C2 N7 にします。