cgroups
là cách đúng đắn để làm điều này, như các câu trả lời khác đã chỉ ra. Thật không may, không có giải pháp hoàn hảo cho vấn đề này, vì chúng ta sẽ đi vào bên dưới. Có một loạt các cách khác nhau để đặt giới hạn sử dụng bộ nhớ cgroup. Làm thế nào một người đi về việc làm cho phiên đăng nhập của người dùng tự động là một phần của một nhóm khác nhau tùy theo hệ thống. Red Hat có một số công cụ, và systemd cũng vậy .
memory.memsw.limit_in_bytes
và memory.limit_in_bytes
đặt giới hạn bao gồm và không bao gồm trao đổi, tương ứng. Nhược điểm memory.limit_in_bytes
là nó đếm các tập tin được lưu trong bộ nhớ cache của nhân thay mặt cho các tiến trình trong nhóm so với hạn ngạch của nhóm. Ít bộ nhớ đệm hơn có nghĩa là truy cập nhiều đĩa hơn, do đó bạn có khả năng từ bỏ một số hiệu suất nếu hệ thống có sẵn một số bộ nhớ.
Mặt khác, memory.soft_limit_in_bytes
cho phép nhóm này vượt quá hạn ngạch, nhưng nếu kẻ giết OOM hạt nhân được gọi thì những nhóm đó vượt quá hạn ngạch của họ sẽ bị giết trước, theo logic. Tuy nhiên, nhược điểm của điều đó là có những tình huống cần một số bộ nhớ ngay lập tức và không có thời gian để kẻ giết người OOM tìm kiếm các quy trình để giết, trong trường hợp đó có thể thất bại trước các quy trình của người dùng vượt quá giới hạn bị giết
ulimit
tuy nhiên, hoàn toàn là công cụ sai cho việc này. ulimit đặt giới hạn cho việc sử dụng bộ nhớ ảo, gần như chắc chắn không phải là điều bạn muốn. Nhiều ứng dụng trong thế giới thực sử dụng bộ nhớ ảo nhiều hơn nhiều so với bộ nhớ vật lý. Hầu hết các thời gian chạy được thu gom rác (Java, Go) hoạt động theo cách này để tránh phân mảnh. Một chương trình "hello world" tầm thường trong C, nếu được biên dịch với trình khử trùng địa chỉ, có thể sử dụng 20TB bộ nhớ ảo. Phân bổ không dựa vào sbrk
, chẳng hạn như jemalloc (là cấp phát mặc định cho Rust) hoặc tcmalloc, cũng sẽ có mức sử dụng bộ nhớ ảo vượt quá mức sử dụng vật lý của họ. Để hiệu quả, nhiều công cụ sẽ tập tin mmap, làm tăng mức sử dụng ảo nhưng không nhất thiết phải sử dụng vật lý. Tất cả các quy trình Chrome của tôi đều sử dụng 2TB bộ nhớ ảo. Tôi đang sử dụng máy tính xách tay với 8GB bộ nhớ vật lý. Bất kỳ cách nào người ta cố gắng thiết lập hạn ngạch bộ nhớ ảo ở đây đều sẽ phá vỡ Chrome, buộc Chrome phải vô hiệu hóa một số tính năng bảo mật dựa trên việc phân bổ (nhưng không sử dụng) số lượng lớn bộ nhớ ảo hoặc hoàn toàn không hiệu quả trong việc ngăn người dùng lạm dụng hệ thống .