cgroupsを使用する必要があります。マウントポイントと詳細は、ディストリビューションとカーネルで異なります。つまりストックカーネルを備えたDebian7.0は、デフォルトではcgroupfsをマウントせず、メモリサブシステムを無効にします(cgroup_enabled =memoryで再起動することをお勧めします)が、openSUSE 13.1は、ほとんどの場合systemdのために出荷されています。
したがって、まず、ディストリビューションでまだ行われていない場合は、マウントポイントを作成し、cgroupfsをマウントします。
mkdir /sys/fs/cgroup/cpu
mount -t cgroup -o cpuacct,cpu cgroup /sys/fs/cgroup/cpu
mkdir /sys/fs/cgroup/memory
mount -t cgroup -o memory cgroup /sys/fs/cgroup/memory
cgroupを作成します:
mkdir /sys/fs/cgroup/cpu/shell
mkdir /sys/fs/cgroup/memory/shell
cgroupを設定します。 CPUシェアを変更することにしました 。デフォルト値は1024であるため、競合他社が存在する場合、128に設定すると、cgroupはすべてのCPUリソースの11%に制限されます。無料のCPUリソースがまだある場合は、mongodumpに渡されます。 cpuset
を使用することもできます 使用可能なコアの数を制限します。
echo 128 > /sys/fs/cgroup/cpu/shell/cpu.shares
echo 50331648 > /sys/fs/cgroup/memory/shell/memory.limit_in_bytes
次に、PIDをcgroupに追加します。これは、すべての子にも影響します。
echo 13065 > /sys/fs/cgroup/cpu/shell/tasks
echo 13065 > /sys/fs/cgroup/memory/shell/tasks
私はいくつかのテストを実行します。たくさんのmemを割り当てようとするPythonがOOMによって殺されました:
[email protected]:~$ python -c 'l = range(3000000)'
Killed
また、cgroupで4つの無限ループと5番目のループを実行しました。予想どおり、cgroupで実行されたループのCPU時間は約45%でしたが、残りのループは355%でした(4つのコアがあります)。
すべての変更は再起動後も存続しません!
このコードをmongodumpを実行するスクリプトに追加するか、永続的なソリューションを使用することができます。