Làm cách nào để ngăn Linux đóng băng khi hết bộ nhớ?


25

Hôm nay tôi (vô tình) chạy một số chương trình trên hộp Linux của tôi, nó nhanh chóng sử dụng rất nhiều bộ nhớ. Hệ thống của tôi đóng băng, trở nên không phản hồi và do đó tôi không thể giết người phạm tội.

Làm thế nào tôi có thể ngăn chặn điều này trong tương lai? Ít nhất nó có thể giữ một lõi đáp ứng hoặc một cái gì đó đang chạy không?


Câu trả lời:


15

Tôi cá rằng hệ thống không thực sự "đóng băng" (theo nghĩa là hạt nhân bị treo), nhưng đúng hơn là không phản hồi. Rất có thể nó đã hoán đổi rất mạnh, khiến hiệu suất tương tác và thông lượng hệ thống giảm xuống như một hòn đá.

Bạn có thể tắt trao đổi, nhưng điều đó chỉ thay đổi vấn đề từ hiệu suất kém sang các quy trình bị OOM giết (và tất cả những điều thú vị gây ra), cùng với hiệu suất giảm do bộ đệm đĩa ít khả dụng hơn.

Cách khác, bạn có thể sử dụng các giới hạn tài nguyên trên mỗi quy trình (thường được gọi là rlimitvà / hoặc ulimit) để loại bỏ khả năng một quy trình chiếm một lượng bộ nhớ vô lý và gây ra sự hoán đổi, nhưng điều đó chỉ đẩy bạn vào lãnh thổ giải trí với các quy trình chết tại khoảnh khắc bất tiện vì họ muốn có thêm một chút bộ nhớ so với hệ thống sẵn sàng cung cấp cho họ.

Nếu bạn biết bạn sẽ làm điều gì đó có khả năng gây ra việc sử dụng bộ nhớ lớn, bạn có thể viết một chương trình trình bao bọc đã thực hiện mlockall()và sau đó thực hiện trình bao của bạn; sẽ giữ nó trong bộ nhớ và sẽ là điều gần gũi nhất để "giữ lõi phản ứng nhanh" mà bạn có khả năng nhận được (vì không phải CPU đang bị sử dụng quá mức mà đó là vấn đề).

Cá nhân, tôi đăng ký phương pháp kiểm soát tài nguyên "đừng làm những điều ngu ngốc". Nếu bạn đã root, bạn có thể gây ra tất cả các thiệt hại cho hệ thống và do đó, làm bất cứ điều gì mà bạn không biết kết quả có thể xảy ra là một công việc rủi ro.


2
Thật không may, "đừng làm những điều ngu ngốc" không giúp người dùng chạy các ứng dụng ăn cắp bộ nhớ như Chrome (xem các vấn đề 134612 , 393395 ).
Dan Dascalescu

1
@DanDascalescu Và không phải lúc nào bạn cũng làm điều gì đó ngu ngốc. Máy của tôi đã treo vào một ngày khác vì tôi đã thay đổi "UNION" trong truy vấn SQLite (phức tạp) thành "UNION ALL".
Michael

Các chương trình lỗi đã biết có thể (và nên) được chạy trong một cấu hình bị hạn chế về tài nguyên - ulimithoặc thậm chí là các nhóm trong những ngày này, nếu bạn là một người trẻ tuổi, làm công việc khá tốt. Nếu bạn đang thực hiện thay đổi đối với các truy vấn trong sản xuất mà không xác thực hiệu ứng của chúng trong môi trường không quan trọng, đó là vấn đề gốc rễ của bạn.
womble

8

Như đã đề cập ở trên trong nhận xét của Tronic, có thể gọi OOM-killer (hết bộ nhớ) bằng cách kết hợp bàn phím SysRq- F.

SysRqphím thường được kết hợp trong PrtScphím trên bàn phím.

Kẻ giết người OOM giết chết một số quy trình (-es) và hệ thống trở nên phản hồi một lần nữa. Theo mặc định, các acc trực tiếp cho OOM-killer có thể không được bật, vui lòng kiểm tra câu hỏi này để tìm cách kiểm tra trạng thái của nó và / hoặc kích hoạt nó.

PS: Điều này đã giúp tôi rất nhiều. Tôi đồng ý với ý kiến ​​rằng đây là lời khuyên hữu ích nhất về vấn đề đó nếu nó gây ra bởi Chrome hoặc bất kỳ phần mềm tham lam bộ nhớ nào. Nhưng bạn cần lưu ý rằng OOM-killer có thể giết chết một quá trình thực sự quan trọng, hãy sử dụng nó một cách cẩn thận.



0

Nếu bạn cảm thấy muốn biên dịch lại kernel, bạn có thể thử bản vá từ EDITphần của câu hỏi này: /programming//q/52067753/10239415
Nó không đuổi các Active(file)trang trong áp suất bộ nhớ cao và do đó nó cho phép OOM-killer để kích hoạt gần như ngay lập tức vì kernel không còn cần phải mất vài phút để đọc lại từ các trang mã thực thi của mọi tiến trình gây ra hệ điều hành bị đóng băng.


-1

Đây là một điều đặc biệt khó ngăn chặn. Đó là vì kernel bắt đầu hoán đổi. Một giải pháp là tắt trao đổi. Khi hệ thống hết bộ nhớ, thay vì bắt đầu hoán đổi, kernel sẽ giết một số tiến trình; thông thường, nó chọn ra quy trình chính xác để giết, nhưng tốt hơn hết là giết một quy trình ngẫu nhiên hơn là có một hệ thống không phản hồi.

Đây có thể là một giải pháp đặc biệt tốt cho các máy chủ, bởi vì các máy chủ thường có đủ RAM và khi chúng bắt đầu sử dụng không gian hoán đổi, điều đó có nghĩa là có gì đó không ổn. Tuy nhiên, máy tính để bàn thường cần không gian hoán đổi, vì vậy tôi nghĩ không có giải pháp tốt cho máy tính để bàn. Tôi thường tắt không gian trao đổi trong các máy chủ, đặc biệt là khi có nghi ngờ rò rỉ bộ nhớ.


4
Tắt trao đổi trên bất kỳ hệ thống nào là một ý tưởng tồi, bởi vì nó không cho phép các trang không sử dụng bị tráo đổi và không gian trống được sử dụng cho bộ đệm đĩa. Điều này đặc biệt đúng khi có rò rỉ bộ nhớ.
womble

2
Và với việc hoán đổi, hệ thống vẫn có thể bị chậm do phân trang. Nó sẽ chỉ phân trang sạch sẽ điên cuồng thay vì những trang bẩn. (Vì, không có trao đổi, nó không bao giờ có thể đuổi một trang bẩn, nó sẽ luôn phải đuổi những trang sạch.)
David Schwartz

Tôi có một máy chủ bị rò rỉ bộ nhớ. Lần đầu tiên xảy ra, tôi phải nhấn nút thiết lập lại, vì máy chủ trở nên không phản hồi. Nhưng bây giờ tôi đã tắt trao đổi, máy chủ sẽ giết đứa trẻ apache nếu nó trở nên quá lớn (đó là một biện pháp bảo vệ ngoài MaxRequestsPerChild). Kết quả là máy chủ chạy mà không gặp vấn đề gì. Dù sao thì nó cũng không có nhiều trang không được sử dụng và chắc chắn nó không làm điên đảo các trang sạch.
Antonis Christofides

@AntonisChristofides: Tôi không chắc bạn nghĩ bài học mang đi từ đó là gì. Giải pháp của bạn chắc chắn là một giải pháp tồi vì nó cản trở hiệu suất do không thể đuổi các trang bẩn hiếm khi truy cập khỏi bộ nhớ vật lý, nó không giải quyết được vấn đề tiềm ẩn và bạn có nguy cơ kẻ giết người OOM có thể giết chết quá trình quan trọng. Bạn tình cờ không gặp phải mối nguy hiểm cụ thể mà tôi đã cảnh báo, nhưng bạn vẫn có nguy cơ vì nó không có trao đổi.
David Schwartz

8
Có hoặc không có trao đổi, nó vẫn đóng băng trước khi kẻ giết OOM được chạy tự động. Đây thực sự là một lỗi kernel cần được sửa (tức là chạy OOM killer trước đó, trước khi bỏ tất cả bộ đệm đĩa). Thật không may, các nhà phát triển kernel và rất nhiều người dân khác không nhìn thấy vấn đề. Các đề xuất phổ biến như vô hiệu hóa / kích hoạt trao đổi, mua thêm RAM, chạy ít quy trình hơn, đặt giới hạn, v.v. không giải quyết vấn đề cơ bản là việc xử lý bộ nhớ thấp của hạt nhân hút bóng của lạc đà. Trong khi đó, tôi khuyên bạn nên chạy thủ công OOM bằng tay (SysRq-F) khi hệ thống đóng băng vì điều đó sẽ giúp nó phục hồi nhanh hơn.
Tronic
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.