Anda harus menggunakan cgroups. Mount point dan detail berbeda pada distro dan kernel. Yaitu. Debian 7.0 dengan kernel stok tidak me-mount cgroupfs secara default dan memiliki subsistem memori yang dinonaktifkan (orang-orang menyarankan untuk mem-boot ulang dengan cgroup_enabled=memory) sementara openSUSE 13.1 dikirimkan dengan semua itu di luar kotak (kebanyakan karena systemd).
Jadi pertama-tama buat mount point dan mount cgroupfs jika belum dilakukan oleh distro Anda:
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
Buat cgrup:
mkdir /sys/fs/cgroup/cpu/shell
mkdir /sys/fs/cgroup/memory/shell
Siapkan cgrup. Saya memutuskan untuk mengubah berbagi cpu . Nilai default untuk itu adalah 1024, jadi menyetelnya ke 128 akan membatasi cgroup hingga 11% dari semua sumber daya CPU, jika ada pesaing. Jika masih ada sumber daya cpu gratis, mereka akan diberikan ke mongodump. Anda juga dapat menggunakan cpuset
untuk membatasi jumlah inti yang tersedia untuknya.
echo 128 > /sys/fs/cgroup/cpu/shell/cpu.shares
echo 50331648 > /sys/fs/cgroup/memory/shell/memory.limit_in_bytes
Sekarang tambahkan PID ke cgroup itu juga akan mempengaruhi semua anak mereka.
echo 13065 > /sys/fs/cgroup/cpu/shell/tasks
echo 13065 > /sys/fs/cgroup/memory/shell/tasks
Saya menjalankan beberapa tes. Python yang mencoba mengalokasikan banyak mem Dibunuh oleh OOM:
[email protected]:~$ python -c 'l = range(3000000)'
Killed
Saya juga menjalankan empat loop tak terbatas dan kelima di cgroup. Seperti yang diharapkan, loop yang dijalankan di cgroup hanya mendapat sekitar 45% dari waktu CPU, sedangkan sisanya mendapat 355% (saya punya 4 core).
Semua perubahan itu tidak bertahan saat reboot!
Anda dapat menambahkan kode ini ke skrip yang menjalankan mongodump, atau menggunakan beberapa solusi permanen.