Làm thế nào để kẻ giết người OOM quyết định quá trình giết đầu tiên?


92

Câu trả lời này giải thích các hành động được thực hiện bởi kernel khi gặp tình huống OOM dựa trên giá trị của sysctl vm.overcommit_memory.

Khi overcommit_memoryđược đặt thành 0 hoặc 1, overcommitđược bật và các chương trình được phép phân bổ nhiều bộ nhớ hơn mức thực sự có sẵn.

Bây giờ điều gì xảy ra khi chúng ta hết bộ nhớ trong tình huống này? Làm thế nào để kẻ giết người OOM quyết định quá trình giết đầu tiên?


1
Tôi tin rằng các giá trị là 1 và 2 - không phải 0 và 1.
fpmurphy

Từ đây serverfault.com/questions/606185/ Mạnh , 0 và 1 là các giá trị chính xác.
Rui F Ribeiro

1
Có một mô tả tuyệt vời có sẵn tại linux-mm.org/OOM_Killer
Jarek Przygódzki

Theo kernel.org/doc/Documentation/vm/overcommit-accounting 0, 1 và 2 đều là các giá trị hợp lệ.
Derek Lewis

Câu trả lời:


109

Nếu bộ nhớ được sử dụng triệt để bởi các quá trình, đến mức có thể đe dọa sự ổn định của hệ thống, thì kẻ giết người OOM sẽ xuất hiện.

LƯU Ý: Nhiệm vụ của OOM Killer là tiếp tục các tiến trình tiêu diệt cho đến khi giải phóng đủ bộ nhớ cho hoạt động trơn tru của phần còn lại của quá trình mà Kernel đang cố chạy.

OOM Killer phải chọn quy trình tốt nhất để tiêu diệt. Tốt nhất ở đây đề cập đến quá trình đó sẽ giải phóng bộ nhớ tối đa khi giết và cũng là điều ít quan trọng nhất đối với hệ thống.

Mục tiêu chính là tiêu diệt số lượng quá trình ít nhất nhằm giảm thiểu thiệt hại và đồng thời tối đa hóa lượng bộ nhớ được giải phóng.

Để tạo điều kiện cho điều này, kernel duy trì một oom_scorecho mỗi tiến trình. Bạn có thể thấy oom_scoretừng tiến trình trong /prochệ thống tập tin trong pidthư mục.

$ cat /proc/10292/oom_score

Giá trị của oom_scorebất kỳ quá trình nào càng cao thì khả năng bị giết bởi OOM Killer càng cao trong tình huống hết bộ nhớ.

Làm thế nào là OOM_Scoretính toán?

Trong bộ vá của David, các heuristic cũ () đã gần như biến mất hoàn toàn. Thay vào đó, phép tính biến thành một câu hỏi đơn giản về tỷ lệ phần trăm bộ nhớ khả dụng đang được quá trình sử dụng. Nếu toàn bộ hệ thống bị thiếu bộ nhớ, thì "bộ nhớ khả dụng" là tổng của tất cả RAM và dung lượng trao đổi có sẵn cho hệ thống.

Nếu thay vào đó, tình huống OOM gây ra do cạn kiệt bộ nhớ cho phép một nhóm điều khiển / nhóm điều khiển nhất định, thì "bộ nhớ khả dụng" là tổng số tiền được phân bổ cho nhóm điều khiển đó. Một tính toán tương tự được thực hiện nếu vượt quá giới hạn áp dụng bởi chính sách bộ nhớ. Trong mỗi trường hợp, việc sử dụng bộ nhớ của quá trình được coi là tổng của bộ lưu trú của nó (số trang RAM mà nó đang sử dụng) và mức sử dụng trao đổi của nó.

Kết quả tính toán này tạo ra một con số phần trăm lần mười; một quá trình sử dụng mỗi byte của bộ nhớ có sẵn sẽ có điểm 1000, trong khi một quá trình không sử dụng bộ nhớ nào sẽ nhận được điểm 0. Có rất ít điều chỉnh heuristic cho điểm này, nhưng mã vẫn trừ một lượng nhỏ (30) từ điểm của các quy trình thuộc sở hữu gốc với quan điểm rằng chúng có giá trị hơn một chút so với quy trình do người dùng sở hữu.

Một điều chỉnh khác được áp dụng là thêm giá trị được lưu trữ trong biến oom_score_adj của mỗi tiến trình, có thể được điều chỉnh thông qua / Proc. Núm này cho phép điều chỉnh mức độ hấp dẫn của từng quy trình đối với kẻ giết người OOM trong không gian người dùng; đặt nó thành -1000 sẽ vô hiệu hóa hoàn toàn OOM giết chết, trong khi cài đặt thành +1000 tương đương với việc vẽ một mục tiêu lớn trên quy trình liên quan.

Người giới thiệu

http://www.queryhome.com/15491/whats-happening-kernel-starting-killer-choose-which- Process https://serverfault.com/a/571326


3
Không phải sự tử tế cũng đóng một vai trò?
neverMind9
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.