Tại sao OOM-Killer không thể giết quá trình yêu cầu quá nhiều?


12

Điều này được giải thích ở đây là OOM-Killer có thể được cấu hình thông qua overcommit_memoryvà rằng:

  • 2 = không thừa. Phân bổ thất bại nếu yêu cầu quá nhiều.
  • 0, 1 = overcommit (theo kinh nghiệm hoặc luôn luôn). Giết một số tiến trình dựa trên một số heuristic khi quá nhiều bộ nhớ thực sự được truy cập.

Bây giờ, tôi có thể hoàn toàn hiểu sai về điều đó, nhưng tại sao không có tùy chọn (hoặc tại sao nó không phải là mặc định) để giết chính quá trình thực sự cố gắng truy cập quá nhiều bộ nhớ được phân bổ?


Điều gì xảy ra nếu một quá trình hệ thống quan trọng yêu cầu quá nhiều bộ nhớ?
Lawrence

Ở nơi đầu tiên - nó có thể làm điều này. Nhưng, vấn đề lớn nhất với câu hỏi đó là trong tất cả khả năng nếu một quá trình yêu cầu bộ nhớ thì nó mới được thực thi - hay nói cách khác, đây là một quy trình mới liên quan đến việc xử lý rất hiện tại. Bạn có muốn OOM cho phép khách hàng im không mở trong 3 ngày của bạn tiếp tục lãng phí bộ nhớ hệ thống hay bạn muốn YouTube thực sự tải một số thời gian trong năm nay? linuxHRyram.com
mikeerv

3
Đây là những gì no overcommittùy chọn về cơ bản làm. Nếu một quá trình yêu cầu quá nhiều bộ nhớ, nó sẽ thất bại. Nếu nó kiểm tra lỗi, nó thường sẽ tự chết; nếu không, nó có thể sẽ gặp Lỗi phân đoạn khi nó cố gắng hủy bỏ con trỏ null malloc()trả về và nó sẽ bị sập.
Barmar

Lưu ý rằng 2 thực sự là no overcommitchế độ, theo các nguồn được trích dẫn (chẳng hạn như kernel.org/doc/Documentation/vm/overcommit-accounting ). Tôi nghĩ rằng tôi sẽ chỉnh sửa câu hỏi của bạn cho phù hợp.
hans_meine

Câu trả lời:


24

Hãy xem xét kịch bản này:

  • Bạn có 4GB bộ nhớ miễn phí.
  • Một quá trình bị lỗi phân bổ 3.999GB.
  • Bạn mở một trình quản lý tác vụ để giết quá trình chạy trốn. Trình quản lý tác vụ phân bổ 0,002GB.

Nếu quy trình bị giết là quá trình cuối cùng để yêu cầu bộ nhớ, trình quản lý tác vụ của bạn sẽ bị giết.

Hoặc là:

  • Bạn có 4GB bộ nhớ miễn phí.
  • Một quá trình bị lỗi phân bổ 3.999GB.
  • Bạn mở một trình quản lý tác vụ để giết quá trình chạy trốn. Máy chủ X phân bổ 0,002GB để xử lý cửa sổ của trình quản lý tác vụ.

Bây giờ máy chủ X của bạn bị giết. Nó không gây ra vấn đề; đó chỉ là "ở sai thời điểm". Nó tình cờ là quá trình đầu tiên phân bổ thêm bộ nhớ khi không còn lại, nhưng đó không phải là quá trình sử dụng tất cả bộ nhớ để bắt đầu.


Để mở rộng ví dụ của bạn, điều đó có nghĩa là nếu một quá trình tiêu tốn 99,999% bộ nhớ của bạn thì bạn sẽ không bao giờ có thể giết được nó vì bất cứ thứ gì có thể giết chết đều cần đến bộ nhớ và do đó sẽ bị giết trước khi quá trình sai lầm có thể bị giết!
Sled

13
Nhắc bạn, đây là triết lý của Linux, không phải là một thực tế cần thiết. Windows 3.0 đã giải quyết nó bằng cách có đủ bộ nhớ dành cho xử lý OOM, bao gồm các hộp thoại cần thiết.
MSalters

@MSalters: Tuy nhiên, điều đó không thực sự áp dụng cho ví dụ; Ví dụ là về một quá trình dành gần như toàn bộ bộ nhớ, tức là. không đủ để tự giết mình. Rõ ràng là phải có đủ bộ nhớ dành riêng cho việc xử lý OOM trên bất kỳ HĐH nào. Nhưng quá trình gọi xử lý OOM sẽ là quá trình tiếp theo xảy ra để dự trữ bộ nhớ, chứ không phải quá trình xử lý sai. Tất nhiên, trừ khi bạn có nghĩa là Windows 3.0 luôn có đủ bộ nhớ dành cho việc chạy trình quản lý tác vụ hoặc trình xử lý OOM luôn nhắc người dùng về quy trình này để giết. (Mà! = Giết quá trình vi phạm)
Aleksi Torhamo

3
@AleksiTorhamo: Tôi thực sự có nghĩa là sau này. Windows 3.0 không có trình quản lý tác vụ đầy đủ, nó có màn hình màu xanh nổi tiếng với bộ nhớ được mở rộng.
MSalters
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.