Câu trả lời:
Một cách tiếp cận khác, là vô hiệu hóa bộ nhớ quá mức.
Để khôi phục một số lợi ích của sự tỉnh táo đối với việc quản lý bộ nhớ của bạn:
- Vô hiệu hóa OOM Killer (Đặt
vm.oom-kill = 0
trong /etc/sysctl.conf)- Vô hiệu hóa bộ nhớ quá mức (Đưa
vm.overcommit_memory = 2
vào/etc/sysctl.conf
)Các cài đặt này sẽ khiến Linux hoạt động theo cách truyền thống (nếu một quy trình yêu cầu nhiều bộ nhớ hơn khả dụng
Lưu ý rằng đây là một giá trị ternary:malloc()
sẽ thất bại và quá trình yêu cầu bộ nhớ dự kiến sẽ đối phó với thất bại đó).
- 0 = "ước tính nếu chúng ta có đủ RAM"
- 1 = "Luôn luôn nói có"
- 2 = "nói không nếu chúng ta không có bộ nhớ"
Điều này sẽ buộc ứng dụng tự xử lý hết bộ nhớ và có thể các bản ghi / coredump / vv của ứng dụng có thể cung cấp cho bạn một cái gì đó hữu ích.
LƯU Ý: Khi hệ thống của bạn hết bộ nhớ, bạn sẽ không thể sinh ra các quy trình mới! Bạn có thể bị khóa khỏi hệ thống.
echo 1 > /proc/sys/vm/oom_dump_tasks
có vẻ như về mức tối đa mà bạn có thể khiến kernel hiển thị trên các lỗi hết bộ nhớ.
https://www.kernel.org/doc/Documentation/sysctl/vm.txt
Cho phép kết xuất tác vụ trên toàn hệ thống (không bao gồm các luồng nhân) khi kernel thực hiện hủy OOM và bao gồm các thông tin như pid, uid, tgid, vm size, rss, nr_ptes, hoán đổi, điểm oom_score_adj và tên. Điều này rất hữu ích để xác định lý do tại sao kẻ giết người OOM được viện dẫn, để xác định nhiệm vụ lừa đảo gây ra nó và để xác định lý do tại sao kẻ giết người OOM chọn nhiệm vụ mà nó đã làm để giết.
Nếu điều này được đặt thành không, thông tin này sẽ bị chặn. Trên các hệ thống rất lớn với hàng ngàn tác vụ, có thể không khả thi để kết xuất thông tin trạng thái bộ nhớ cho từng tác vụ. Các hệ thống như vậy không nên bị buộc phải chịu một hình phạt hiệu suất trong điều kiện OOM khi thông tin có thể không được mong muốn.
Nếu điều này được đặt thành khác không, thông tin này sẽ được hiển thị bất cứ khi nào kẻ giết người OOM thực sự giết chết một nhiệm vụ ăn cắp bộ nhớ.