Kẻ giết người OOM không hoạt động đúng, dẫn đến một hệ điều hành bị đóng băng


22

Trong nhiều năm, kẻ giết người OOM trong hệ điều hành của tôi không hoạt động đúng và dẫn đến một hệ thống bị đóng băng.
Khi mức sử dụng bộ nhớ rất cao, toàn bộ hệ thống có xu hướng "đóng băng" (thực tế: trở nên cực kỳ chậm) trong nhiều giờ hoặc thậm chí nhiều ngày , thay vì giết các quá trình để giải phóng bộ nhớ.
Tối đa mà tôi đã ghi lại là 7 ngày trước khi từ chức để thực hiện thiết lập lại.
Khi OOM sắp đạt được, iowait rất rất cao (~ 70%), trước khi trở nên không thể đo lường được.
Công cụ: iotopđã chỉ ra rằng mọi chương trình đều đọc với thông lượng rất cao (trên mỗi chục MB / giây) từ ổ cứng của tôi.
Những chương trình đó đang đọc gì?
- Hệ thống phân cấp thư mục?
- Bản thân mã thực thi?
Tôi không chính xác bây giờ.

[đã chỉnh sửa] Vào thời điểm tôi viết tin nhắn này (năm 2017), tôi đang sử dụng một ArchLinux mới nổi (4.9.27-1-lts), nhưng đã gặp vấn đề này trong nhiều năm trước.
Tôi đã gặp vấn đề tương tự với các bản phân phối Linux khác nhau và các cấu hình phần cứng khác nhau.
Hiện tại (2019), tôi đang sử dụng Debian 9.6 (4.9.0) nâng cấp Tôi có 16 GB ram vật lý, ổ SSD được cài đặt hệ điều hành của tôi và không có bất kỳ phân vùng trao đổi nào .

Vì số lượng ram mà tôi có, tôi không muốn kích hoạt phân vùng trao đổi, vì nó sẽ chỉ trì hoãn sự xuất hiện của vấn đề.
Ngoài ra, với việc SSD đổi chỗ quá thường xuyên có khả năng làm giảm tuổi thọ của đĩa.
Nhân tiện, tôi đã thử và không có phân vùng trao đổi, nó đã chứng minh rằng chỉ trì hoãn sự xuất hiện của vấn đề, nhưng không phải là giải pháp.

Đối với tôi, vấn đề xảy ra là do Linux làm rơi dữ liệu cần thiết từ bộ nhớ cache , dẫn đến một hệ thống bị đóng băng vì nó phải đọc mọi thứ, mọi lúc từ ổ cứng.

Tôi thậm chí tự hỏi nếu Linux sẽ không bỏ các trang mã thực thi của các chương trình đang chạy, điều này sẽ giải thích tại sao các chương trình thường không đọc nhiều dữ liệu, lại hoạt động theo cách này trong tình huống này.

Tôi đã thử một vài điều với hy vọng sẽ khắc phục vấn đề này.
Một là đặt /proc/sys/vm/min_free_kbytesthành 1000000(1 GB).
1 GB này vẫn còn miễn phí, tôi nghĩ rằng bộ nhớ này sẽ được Linux dành riêng để lưu trữ dữ liệu quan trọng.
Nhưng nó đã không làm việc.

Ngoài ra, tôi nghĩ hữu ích để thêm rằng thậm chí nếu nó có thể âm thanh tuyệt vời về mặt lý thuyết, hạn chế kích thước của bộ nhớ ảo với kích thước của bộ nhớ vật lý, bằng cách định nghĩa /proc/sys/vm/overcommit_memoryđể 2không decently về mặt kỹ thuật có thể trong hoàn cảnh của tôi, bởi vì các loại ứng dụng mà tôi sử dụng, đòi hỏi nhiều bộ nhớ ảo hơn là chúng sử dụng hiệu quả vì một số lý do.
Theo tệp /proc/meminfo, Commited_ASgiá trị thường cao hơn gấp đôi ram vật lý trên hệ thống của tôi (16 GB, Commited_AS thường> 32 GB).

Tôi đã gặp vấn đề này với /proc/sys/vm/overcommit_memorygiá trị mặc định của nó: 0và trong một thời gian tôi đã xác định nó là : 1, bởi vì tôi thích các chương trình bị giết bởi kẻ giết người OOM hơn là hành xử sai vì chúng không kiểm tra giá trị trả về mallockhi phân bổ bị từ chối.

Khi tôi nói về vấn đề này trên IRC , tôi đã gặp những người dùng Linux khác gặp phải vấn đề rất giống nhau, vì vậy tôi đoán rằng rất nhiều người dùng lo ngại về vấn đề này.
Đối với tôi điều này là không thể chấp nhận được vì ngay cả Windows cũng xử lý tốt hơn với việc sử dụng bộ nhớ cao.

Nếu bạn cần thêm thông tin, có một gợi ý, xin vui lòng cho tôi biết.

Tài liệu:
https://en.wikipedia.org/wiki/Thrashing_%28computer_science%29
https://en.wikipedia.org/wiki/Memory_overcommitment
https://www.kernel.org/doc/Documentation/sysctl/vm. txt
https://www.kernel.org/doc/Documentation/vm/overcommit-accounting
https://lwn.net/Articles/317814/

Họ nói về nó:
Tại sao kẻ giết người hết bộ nhớ linux (OOM) không chạy tự động, mà hoạt động dựa trên sysrq-key?
Tại sao OOM-killer đôi khi không giết được lợn đất?
Tải trước OOM Killer
Có thể kích hoạt OOM-killer khi bị tráo đổi?
Làm thế nào để tránh độ trễ cao gần tình hình OOM?
https://lwn.net/Articles/104179/
https://bbs.archlinux.org/viewtopic.php?id=233843


1
Tôi nghĩ rằng đây là những gì bạn nên mong đợi, nếu bạn đang đập, nhưng bạn không thực sự tiếp cận 100% "đã sử dụng", tức là có quá nhiều việc sử dụng bộ nhớ được hỗ trợ bằng tệp, được tính là "buff / cache". (Ugh, cụm từ này giả định rằng các phân bổ tmpfs của bạn là không đáng kể, vì các cụm từ này hiển thị dưới dạng "buff / cache", nhưng không thể chuyển sang hệ thống tệp vật lý). min_free_kbyteskhông liên quan, nó không phải là dự trữ cho các trang được lưu trữ. AFAICT không có hệ thống vm nào cho phép lưu trữ bất kỳ bộ nhớ cụ thể nào cho các trang được lưu trong bộ nhớ cache, tức là giới hạn phân bổ MAP_ANONYMOUS :(.
sourcejedi

2
Tôi đã tìm kiếm một giải pháp cho vấn đề chính xác này trong nhiều năm nay mà không có bất kỳ thành công nào. Tôi tin rằng lần đầu tiên tôi nhận thấy vấn đề sau khi thay thế ổ cứng của mình bằng ổ SSD, điều này cũng khiến tôi vô hiệu hóa việc hoán đổi hoàn toàn, nhưng tôi thực sự không thể đảm bảo rằng nó không bao giờ xảy ra trước những thay đổi này, vì vậy nó có thể không liên quan. Tôi đang ở trên Archlinux btw.
brunocodutra

2
Tôi vừa đăng trên diễn đàn Arch Linux về điều này.
Ignat Insarov

1
@ dsstorefile1 Cảm ơn bạn, tôi sẽ thử nó. Nhưng làm thế nào nó có thể kích hoạt kẻ giết OOM chắc chắn khi hạt nhân trong tình huống này không thể làm điều đó đúng cách?
M89

1
Nó giúp ích khi chrome quản lý để rò rỉ qua tất cả RAM của tôi ... (Mặc dù cuối cùng tôi cũng đã thêm một phân vùng trao đổi đĩa thực tế và cuối cùng được nâng cấp lên một lượng RAM kha khá)
Gert van den Berg

Câu trả lời:


5

Tôi đã tìm thấy hai lời giải thích (cùng một điều) về lý do tại sao kswapd0 việc đọc đĩa liên tục xảy ra tốt trước khi OOM-killer giết chết quá trình vi phạm:

  1. Xem câu trả lời và nhận xét của câu trả lời Askubfox SE này
  2. xem câu trả lời và ý kiến ​​của David Schwartz về câu trả lời này trên unix SE

Tôi sẽ trích dẫn ở đây nhận xét từ 1. điều thực sự mở mắt về lý do tại sao tôi liên tục đọc đĩa trong khi mọi thứ bị đóng băng :

Ví dụ, hãy xem xét trường hợp bạn không có trao đổi và hệ thống sắp hết RAM. Nhân sẽ lấy bộ nhớ từ ví dụ Firefox (nó có thể làm điều này vì Firefox đang chạy mã thực thi đã được tải từ đĩa - mã có thể được tải lại từ đĩa nếu cần). Nếu Firefox sau đó cần truy cập lại RAM đó N giây sau đó, CPU sẽ tạo ra "lỗi cứng" buộc Linux phải giải phóng một số RAM (ví dụ: lấy một số RAM từ quy trình khác), tải dữ liệu bị thiếu từ đĩa và sau đó cho phép Firefox tiếp tục như bình thường. Điều này khá giống với trao đổi thông thường và kswapd0 thực hiện nó. - Mikko Rantalainen ngày 15 tháng 2 lúc 13:08

Nếu bất cứ ai có cách để vô hiệu hóa hành vi này (có thể biên dịch lại kernel với các tùy chọn nào? ), Xin vui lòng cho tôi biết càng sớm càng tốt! Rất cảm kích, cảm ơn!

CẬP NHẬT: Cách duy nhất tôi tìm thấy cho đến nay là thông qua việc vá kernel và nó hoạt động với tôi với tính năng hoán đổi bị vô hiệu hóa (nghĩa là CONFIG_SWAP is not set) nhưng dường như không hoạt động đối với những người khác có khả năng hoán đổi ; xem bản vá bên trong câu hỏi này


Vui lòng xóa văn bản không hợp lệ. Không gắn thẻ chỉnh sửa với "EDIT" trong văn bản. Họ là rõ ràng từ lịch sử sửa đổi .
Kusalananda

1
@Kusalananda Người dùng này nên được khuyến khích vì có lẽ anh ta là người đóng góp nhiều nhất.
M89

@Kusalananda Tôi nghĩ rằng điều quan trọng là phải giữ chúng để những người khác có thể thấy những gì (người khác) đã thử và không hoạt động. Có lẽ UPDATEthay vì EDITsẽ tốt hơn?

@MarcusLinsner Không, xin lỗi, bạn đã hiểu nhầm. Hiển thị những gì bạn đã cố gắng là những gì bạn làm khi bạn đặt câu hỏi. Câu trả lời phải chính xác cho câu hỏi vì nó hiện đang được đặt ra. Ý tôi là, một chỉnh sửa thậm chí yêu cầu người đọc bỏ qua các chỉnh sửa trước đó . Nếu một người thích xem lịch sử chỉnh sửa, bạn có thể thấy nó ở đây .
Kusalananda

0

Các memory.mintham số trong các cgroups-v2bộ điều khiển bộ nhớ cần giúp đỡ.

Cụ thể, hãy để tôi trích dẫn:

Bảo vệ bộ nhớ cứng. Nếu việc sử dụng bộ nhớ của một nhóm nằm trong ranh giới tối thiểu hiệu quả của nó, bộ nhớ của nhóm đó sẽ không được lấy lại trong bất kỳ điều kiện nào. Nếu không có bộ nhớ có thể lấy lại không được bảo vệ có sẵn, kẻ giết người OOM được gọi.

Nguồn: https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html


Bạn có thể giải thích xin vui lòng? Câu trả lời của bạn hơi thiếu một chút khi trả lời câu hỏi OP.
Nghịch lý
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.