大きなCPUとメモリを消費するプロセスのツリーを開始するスクリプトがあります。 Pythonとそこに実行可能ファイルがありますが、すべては単一のbashスクリプトとpythonサブプロセスで始まります。
実行中、システムの残りの部分は完全に停止されます。私は$ Nice -n10 ionice -c2 ./Script.sh
で緩和しようとしましたが、これは十分ではありません-コンピュータの使用は非常に遅いです(実際、これは開発用デスクトップですが、指定されたサーバーの問題も同様です)。
問題は、プロセスが大量のメモリを使用していることだと思います-すべてがスワップアウトされて遅くなります。
物理メモリへのアクセスでプロセス(およびその再帰的な子)の優先度を下げる方法はありますか?他のタスクへの影響が限られているバックグラウンドで実行する方が遅いです。
消費するメモリの「ペース」を制限することはできませんが、さまざまなメカニズムを使用して、メモリの総使用量を制限できます。
1)セキュリティ制限/etc/security/limits.confを介してプロセスを実行するユーザーのメモリ使用量を制限します。同じユーザーが別の作業をしているときにこのプロセスを実行している場合、これは機能しない可能性があります。
例:
username hard as 1000000
2)グループを制御する-cgroupsを使用して、グループを作成し、メモリ使用量を制限することもできます。次のように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の優先度を下げることはできません。たとえ可能であっても、使用するプログラムの一部がまだスワップされないという保証はありません。したがって、システムの応答がさらに遅くなります。そこに行かないでください。
次はメモリスワッピングに役立ちませんが、プロセスのIO影響)に役立つはずです。
level
も明示的に設定する必要があるようです。
ionice -c2 -n5 ./slowscript.sh
カーネルによっては、C2だけでは十分でない場合があります。
マンページのQoute(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のいずれかを実行します。