Hệ thống treo khi hết bộ nhớ


34

Tôi đã có một eeePC 900a: nó có flash 8GB dưới dạng đĩa và chỉ 1GB RAM. Bản phân phối Linux được cài đặt trên nó là ArchLinux.

Khi hệ thống hết bộ nhớ, nó trở nên cực kỳ không phản hồi: phải mất vài giây / phút để làm những việc như chuyển sang TTY1 hoặc thậm chí di chuyển con trỏ chuột. Đôi khi có vẻ như hệ thống chỉ đóng băng: ba chúng tôi trước đây tôi để nó một mình và cho đến nay không có gì thay đổi.

Tôi muốn tránh tạo phân vùng / tệp hoán đổi trên eeePC này vì đĩa đã nhỏ và cũng vì nhiều lần ghi trên không gian hoán đổi sẽ rút ngắn rất nhiều thời gian sử dụng thẻ flash. Hơn nữa, tôi nghĩ rằng một tập tin hoán đổi / phân vùng sẽ chỉ di chuyển vấn đề, thay vì chắc chắn sửa nó.

Không phải kernel phải giết một số ứng dụng ngẫu nhiên khi hết bộ nhớ sao? Tại sao nó thất bại (hoặc mất nhiều tuổi) khi làm điều đó?

Vài tháng / năm trước tôi đã cố gắng tìm hiểu sâu hơn về vấn đề này, nhưng không thể tìm thấy bất cứ thứ gì thực sự có tác dụng ...


1
Bạn đang sử dụng DE / WM nào trong thiết lập của mình, bạn đang chạy dịch vụ / trình nền nào? Ví dụ, sử dụng môi trường máy tính để bàn đầy đủ và duyệt bằng Chromium hoặc Firefox sẽ ăn RAM của bạn. 1GB RAM là đủ để chạy Arch Linux, nhưng điều thực sự quan trọng là những gì bạn đặt lên trên nó.

1
Tôi đang sử dụng LXDE. Chromium là chương trình thường chiếm phần lớn RAM. Dù sao đây không phải là vấn đề. Không phải tôi là người phải quan tâm đến việc hệ thống của tôi đang sử dụng bao nhiêu bộ nhớ, đó là hệ thống của tôi, người không nên chết vì điều đó. Nếu hệ thống của tôi sắp hết bộ nhớ, bạn có thể tự do giết bất kỳ ứng dụng nào mình muốn, tôi chỉ muốn nó không bị đóng băng !
peoro

6
Ý tôi là, tôi nghiêm túc suy nghĩ về việc chạy một kịch bản như thế này (bằng mã giả) : while(true){ if( $FREE_MEMORY<10MB ){ kill -9 $RANDOM_PID; } }. Điều này chắc chắn sẽ khắc phục vấn đề của tôi. Nhưng chờ đã, hạt nhân có phải làm điều đó không (và theo cách tốt hơn nhiều so với kịch bản của tôi)? Tại sao nó không làm việc của nó?
peoro

2
@Marcin, điều đó sẽ chỉ di chuyển vấn đề, sẽ không khắc phục nó. Ngay cả khi tôi có 4GB bộ nhớ (nhờ một số trao đổi), hệ thống của tôi có thể hết bộ nhớ (do đó bị treo). Điều tôi muốn tránh là hệ thống của tôi bị đóng băng khi hết RAM. Nếu hạt nhân của tôi đột nhiên giết chết crom ngay khi RAM của tôi hết thì tôi sẽ rất vui ngay cả với 1GB tôi đã có bây giờ.
peoro

4
@Lee "Magic sysrq" là một tổ hợp chính đi trực tiếp vào kernel. Điều này thường sẽ hoạt động ngay cả khi bàn phím và chuột không phản hồi. Xem en.wikipedia.org/wiki/Magic_SysRq_key
Raman

Câu trả lời:


14

Có thể gọi OOM-killer (hết bộ nhớ) bằng cách kết hợp bàn phím:

SysRq-F

Khóa SysRq thường được kết hợp trong khóa PrtSc 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.

Thx Raman cho lời khuyên về tính năng này trong các ý kiến ​​trê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.


2
Tôi có chìa khóa PrtScn|SysRq. Nhưng nhấn SysRq - Fchỉ nhận được một ảnh chụp màn hình
Lee

2
Vì về cơ bản bạn đã nhận xét của tôi ở trên và làm cho nó trở thành một câu trả lời, một sự ghi nhận nhỏ sẽ rất tốt. Dù sao tôi cũng ủng hộ bạn. :-)
Raman

3
@Lee Bạn phải kích hoạt nó. Một số distro không có sysrq ma thuật được bật theo mặc định. Điều này sẽ giúp: google.ca/search?q=sysrq+enable
Raman

2
@Raman Tôi đặt cược 99% những người tìm thấy điều này không thể "bật nó" theo mặc định vì máy của họ đã bị đóng băng ... tại sao nó không được bật theo mặc định?
themihai

3
@themihai vì nhiều người coi đó là rủi ro bảo mật - nó cho phép bạn truy cập trực tiếp vào kernel thông qua truy cập vật lý vào thiết bị đầu vào, bất kể trạng thái ứng dụng, ví dụ như màn hình khóa và như vậy.
Raman

12

Trạng thái tự nhiên của mọi thứ là dữ liệu ứng dụng nằm trong RAM và các tệp nằm trên đĩa.
Trạng thái lý tưởng của mọi thứ, hiệu suất khôn ngoan, là dữ liệu được sử dụng thường xuyên là trong RAM và dữ liệu không cần thiết vào lúc này là trên đĩa.
Trên một hệ thống bình thường, kernel thực hiện hai điều để cố gắng đạt được lý tưởng này:

  • Dữ liệu ứng dụng không được sử dụng trong một thời gian có thể được chuyển sang đĩa: đây là trao đổi.
  • Dữ liệu từ các tệp đã được sử dụng gần đây được lưu trong RAM: đây là bộ đệm đĩa (cho dữ liệu đọc từ đĩa) và bộ đệm đĩa (đối với dữ liệu sắp được ghi vào đĩa).

Trên một hệ thống điển hình, một phần đáng kể của RAM được dành cho bộ đệm và bộ đệm (50% là một con số điển hình). Vì RAM là tài nguyên hữu hạn, điều này có thể yêu cầu thay thế một số dữ liệu ứng dụng để trao đổi (trao đổi chỉ cần thiết nếu có cách tốt hơn để sử dụng RAM).

Trên một hệ thống không có trao đổi, có một điểm khi dữ liệu ứng dụng đang sử dụng gần như toàn bộ RAM và do đó, hầu như không còn chỗ trống cho bộ nhớ cache. Sau đó hệ thống có khả năng bị chậm. Kernel sẽ không bắt đầu giết các ứng dụng cho đến khi nó thực sự phải. Miễn là các ứng dụng chỉ chiếm 99% bộ nhớ khả dụng, hệ thống sẽ tiếp tục hoạt động, nhưng rất chậm vì dữ liệu tệp phải được tải và tải lại từ đĩa mọi lúc. Với cùng các ứng dụng đang chạy, hệ thống sẽ nhanh hơn với trao đổi tại thời điểm đó.

Để biết thêm về vấn đề này, xem cuộc thảo luận lkml nàybài đăng trên blog này .

Tôi không biết một cách trực tiếp để nói với kernel để dành một lượng RAM tối thiểu cho bộ đệm đĩa. Bạn có thể thiết lập một phần nhỏ RAM của mình dưới dạng không gian trao đổi , thậm chí có thể nén . Có những báo cáo thành công trên mặt trận đó , mặc dù tôi không đảm bảo trong trường hợp cụ thể của bạn.


1
Cảm ơn lời giải thích và các liên kết, họ đã giúp xóa tan một số nghi ngờ về trao đổi. Sau câu trả lời @Marcin cho câu hỏi của tôi, tôi đã thiết lập 256 MB trao đổi ảo nén (compcache) trong RAM của mình. Tuy nhiên, điều này không trả lời đầy đủ câu hỏi của tôi: Tôi hiểu rằng hệ thống của tôi sẽ chậm khi toàn bộ RAM chỉ được sử dụng bởi ứng dụng và không có gì được lưu trữ; Tuy nhiên, tôi không thể hiểu tại sao hệ thống này bị treo trong vài phút / giờ (có thể là mãi mãi?) Khi tôi hoàn toàn hết RAM. Tôi nghĩ rằng hạt nhân của tôi không thực hiện công việc của mình trong việc tắt các ứng dụng khi hết bộ nhớ, nếu 3 giờ không đủ để chuyển sang TTY1.
peoro

Tôi đã bị vô hiệu hóa với 32GB bộ nhớ vật lý và khi phần mềm xấu chạy đi với phân bổ bộ nhớ (xin chào ld, bạn là rác rưởi), nó vẫn bị treo trong gần một phút, thức dậy vừa đủ để tôi di chuyển con chuột vô cùng chậm chạp trong một giây hoặc hai cứ sau vài giây. Xử lý OOM của Linux là hoàn toàn tào lao. Nếu tôi may mắn, kẻ giết người OOM giết chết đúng quy trình mà không làm hỏng hoàn toàn môi trường máy tính để bàn. Và tôi là một fan hâm mộ lớn của Linux. Nó tệ hơn nhiều với tính năng phân trang được kích hoạt. Linux phân trang là một trò đùa.
doug65536

6

Đây là một lỗi đã biết từ năm 2007 - xem Hệ thống đóng băng khi sử dụng bộ nhớ cao .

Trong tình huống này, Windows sẽ hiển thị hộp thoại cảnh báo người dùng đóng một hoặc nhiều ứng dụng.


2
Có vẻ là "Chưa được gán" trong Ubuntu. Có lẽ DE nên cảnh báo người dùng hoặc thậm chí đóng băng ứng dụng cần nhiều bộ nhớ?
nkkollaw

1
@nbrogi - Cái gì cũng âm thầm đóng băng. Nhưng chúc may mắn thuyết phục các nhà phát triển Ubuntu để làm điều đó.
Dan Dascalescu

6

Gần đây tôi tìm thấy một giải pháp cho vấn đề của tôi.

Vì trình diệt OOM Linux không thể thực hiện đúng chức năng của nó, tôi bắt đầu sử dụng một không gian người dùng OOM Killer: Earlyoom . Nó được viết bằng C, khá cấu hình và nó hoạt động như một cơ duyên đối với tôi.

Tôi cũng đã nghe nói về một số lựa chọn thay thế, như OOMD của Facebook , được phát triển để chạy trên máy chủ của họ, nhưng tôi chưa thử cái này

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.