Bạn nên sử dụng cgroups. Điểm gắn kết và chi tiết khác nhau trên bản phân phối và hạt nhân. I E. Debian 7.0 với hạt nhân cổ phiếu không gắn kết cgroupfs theo mặc định và bị vô hiệu hóa hệ thống con bộ nhớ (mọi người khuyên bạn nên khởi động lại với cgroup_enabled =memory) trong khi openSUSE 13.1 được vận chuyển cùng với tất cả những thứ đó (chủ yếu là do systemd).
Vì vậy, trước hết, hãy tạo điểm gắn kết và gắn kết cgroupfs nếu bản phân phối của bạn chưa thực hiện:
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
Tạo nhóm cgroup:
mkdir /sys/fs/cgroup/cpu/shell
mkdir /sys/fs/cgroup/memory/shell
Thiết lập một nhóm. Tôi đã quyết định thay đổi cổ phiếu cpu . Giá trị mặc định cho nó là 1024, vì vậy việc đặt nó thành 128 sẽ giới hạn cgroup đến 11% tất cả tài nguyên CPU, nếu có đối thủ cạnh tranh. Nếu vẫn còn tài nguyên cpu miễn phí, chúng sẽ được cấp cho mongodump. Bạn cũng có thể sử dụng cpuset
để giới hạn số lõi có sẵn cho nó.
echo 128 > /sys/fs/cgroup/cpu/shell/cpu.shares
echo 50331648 > /sys/fs/cgroup/memory/shell/memory.limit_in_bytes
Bây giờ, hãy thêm PID vào nhóm cgroup, nó cũng sẽ ảnh hưởng đến tất cả các con của chúng.
echo 13065 > /sys/fs/cgroup/cpu/shell/tasks
echo 13065 > /sys/fs/cgroup/memory/shell/tasks
Tôi chạy một vài bài kiểm tra. Python cố gắng phân bổ một loạt các mem đã bị OOM giết:
[email protected]:~$ python -c 'l = range(3000000)'
Killed
Tôi cũng đã chạy bốn vòng lặp vô hạn và thứ năm trong cgroup. Đúng như dự đoán, vòng lặp được chạy trong cgroup chỉ chiếm khoảng 45% thời gian CPU, trong khi phần còn lại chiếm 355% (tôi có 4 lõi).
Tất cả những thay đổi đó không tồn tại khi khởi động lại!
Bạn có thể thêm mã này vào một tập lệnh chạy mongodump hoặc sử dụng một số giải pháp vĩnh viễn.