sql >> データベース >  >> NoSQL >> MongoDB

mongodumpのCPUおよびRAMリソースを制限するにはどうすればよいですか?

    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を実行するスクリプトに追加するか、永続的なソリューションを使用することができます。




    1. Node.js Mongoose .update with ArrayFilters

    2. Redisデプロイメント構成-マスタースレーブレプリケーション

    3. AWSでMongoDBをホストするときに尋ねる(そして答える)10の質問

    4. いつインデックスを作成するか、Mongoidで何をインデックスに登録するか?