Tôi có một máy tính xách tay Linux (kiểm tra Debian) tiêu chuẩn, có phân vùng trao đổi.
Tôi làm rất nhiều thí nghiệm với nó. Một số người trong số họ thực sự đói bộ nhớ và cách Linux hành xử theo mặc định là một vấn đề đối với tôi ... Hãy đưa ra một ví dụ ngu ngốc:
- Ngồi trước máy tính xách tay
- Mở một thiết bị đầu cuối
- Gõ
python
, rồia = [0]*100000000
Bây giờ rất có thể bạn sẽ không có đủ RAM để xử lý danh sách lớn đó. Linux sẽ lấp đầy RAM, sau đó trao đổi và vài phút sau, kẻ giết người OOM sẽ được kích hoạt và giết (gần như) các dịch vụ ngẫu nhiên và hy vọng, nếu bạn nhấn Ctrl + C vào thời điểm tốt python
và nếu thiết bị đầu cuối vẫn tập trung, máy tính sẽ trở lại phản hồi.
Tôi muốn thực thi một số giới hạn bộ nhớ để tránh việc hoán đổi không mong muốn đó và từ chối xử lý quyền phân bổ nhiều bộ nhớ hơn mức tôi có (trong RAM). Nếu nhu cầu bộ nhớ dưới một giới hạn nhất định hoặc được yêu cầu bởi root, thì chỉ cần giết quá trình đói bộ nhớ nhất của bất kỳ người dùng nào ngoại trừ root.
ulimit -Sv [mem]
Tôi nghe thấy ở phía sau!
Hồ Hồ! "Sử dụng cgroups
thông qua cgexec
!" ai đó nói ở hàng đầu tiên!
Vâng, bạn đã đúng: đây thực sự là những giải pháp rất tốt. Nhưng:
- Họ không áp dụng toàn hệ thống
- Các giới hạn được đặt cho mỗi quy trình
- Các giới hạn là tĩnh, không tính đến số lượng thực RAM miễn phí (AFAIK)
- Ở đây và đó , họ nói rằng đây không thực sự là một giải pháp tốt để thực thi các giới hạn cứng.
Điều tôi muốn là kernel nói: "Bạn thuộc về người dùng foo (không phải root), bạn sử dụng rất nhiều bộ nhớ và chúng tôi sẽ hết bộ nhớ. Xin lỗi anh bạn ... chết ngay bây giờ!"
Hoặc: "Bạn đang làm cái quái gì vậy? Bạn cần x MB và chỉ có y MB. Có, SWAP trống, nhưng bạn không có ý định sử dụng SWAP để thực hiện công việc bẩn thỉu của mình, phải không? nói không! Không có ký ức cho bạn! Nếu bạn khăng khăng, bạn sẽ chết! "
overcommit_memory
tệp đặc biệt sử dụng RAM + SWAP làm bộ nhớ có thể sử dụng. Tôi vẫn sẽ trao đổi :)
ulimits
là một ý tưởng tồi như được hiển thị ở hầu hết mọi nơi vì nó là một giới hạn cho mỗi quy trình ... Tôi biết bạn biết :) Về cgroups
, điều này chắc chắn tốt hơn nhưng thiếu một cái gì đó chung chung hơn: Tôi đang nói về máy tính xách tay của mình nhưng tôi cũng sở hữu một máy chủ "tính toán" mà chúng tôi là ba để chia sẻ. Nếu tôi thực thi các giới hạn người dùng như vậy, tôi sẽ bị giới hạn bởi trường hợp xấu nhất, phải không?
/proc/sys/vm/overcommit_memory
ảnh hưởng đến hành vi kernel trên bộ nhớ thấp.