Ngăn Ubuntu đóng băng, ngay cả khi bộ nhớ hệ thống thấp


24

Đôi khi tôi làm việc với những đống dữ liệu khổng lồ mà tôi muốn giữ trong bộ nhớ để xử lý. Đôi khi, tôi tính toán sai số lượng bộ nhớ mà chương trình của tôi sẽ tạo ra hoặc trình gỡ lỗi nhân mức sử dụng bộ nhớ theo hệ số vượt quá bộ nhớ khả dụng của tôi.

Bất cứ khi nào tôi bắt đầu một quá trình đói bộ nhớ, đây là điều tôi mong đợi từ một hệ điều hành lành mạnh: cố gắng ăn hết bộ nhớ trống, sau đó yêu cầu một số quy trình không thiết yếu khác từ bỏ một số bộ nhớ mà chúng không cần, sau đó viết để trao đổi.

Đây là những gì Ubuntu làm cho tôi: ăn hết bộ nhớ tự do, sau đó yêu cầu hệ điều hành trao đổi tất cả các dịch vụ thiết yếu (phiên gnome, thiết bị đầu cuối, bàn phím), sau đó đóng băng và chờ tôi rút phích cắm điện.

Hai câu hỏi:

  1. Làm thế nào một hệ điều hành có thể giả định, rằng bất cứ điều gì có thể quan trọng đến mức không thể ngừng lắng nghe ý kiến ​​của người dùng?
  2. Làm cách nào tôi có thể bảo Ubuntu không bao giờ trao đổi các dịch vụ thiết yếu và luôn phản ứng với đầu vào của người dùng, ngay cả khi một quy trình ngu ngốc nào đó cố gắng ăn nhiều tài nguyên hơn hệ thống cung cấp.

Bạn đã cài đặt bao nhiêu RAM? Kích thước của bạn là gì (trong thiết bị đầu cuối, gõ swaponđể tìm hiểu)? Chúc mừng, Al
heynnema

3
Ram 16gb và trao đổi 16gb. Nhưng đó không phải là vấn đề ở đây, vấn đề này không thể được giải quyết bằng cách thêm nhiều bộ nhớ.
Klamann

1
Hãy thử một trong hai điều. 1) thay đổi swappinesscài đặt thành 10, tức là: vm.swappiness = 10trong /etc/sysctl.conf. Tìm kiếm ở đây cho swappiness để biết thêm thông tin về nó. 2) Nếu swappiness không giúp được gì ... Mặc dù bạn có thể không muốn ... tăng kích thước của tệp hoán đổi của mình lên 1,5x16G và xem điều đó có giúp ích gì không. Giữ cho tôi được đăng. Chúc mừng, Al
heynnema

1
@Klamann Tôi đồng ý thêm nhiều trao đổi sẽ không khắc phục vấn đề. Khi bạn có một chương trình bị hỏng, tiêu thụ hết RAM + SWAP, việc thêm SWAP chỉ làm chậm trễ không thể tránh khỏi.
WinEunuuchs2Unix

1
@ WinEunuuchs2Unix, như tôi đã nói, vm.swappiness=10cần phải được THÊM vào sysctl.conf. Một người có kinh nghiệm thậm chí có thể sử dụng lệnh sysctl một cách nhanh chóng, để đặt vm.swappiness = 10, mà không cần chỉnh sửa tệp sysctl.conf. Chúc mừng, Al ps: đang chờ OP phản hồi.
heynnema

Câu trả lời:


5

Tôi vẫn chưa có giải pháp cho vấn đề này, nhưng tôi có thể đưa ra hai cách giải quyết có thể khiến người khác quan tâm:

1) sớm

Đó là một dịch vụ mà đồng hồ sử dụng bộ nhớ và giết chết quá trình tiêu thụ bộ nhớ nhất khi một ngưỡng nhất định đạt được (xem thêm nàynày câu hỏi liên quan đến việc kẻ giết oom trong hạt nhân Linux)

Tôi đã thử nghiệm nó với một quy trình demo yêu cầu bộ nhớ trong các khối nhỏ. Đây là ấn tượng đầu tiên của tôi: Khi tôi bắt đầu quá trình lừa đảo, nó nhanh chóng ngốn hết RAM của tôi. Sau đó trao đổi bắt đầu, hệ thống trở nên không phản hồi. Một vài giây sau hệ thống đã hoạt động trở lại. Nhật ký của Earlyoom cho thấy nó đã giết quá trình ăn bộ nhớ sau khi cả bộ nhớ và mức sử dụng trao đổi đạt 90%.

Vẫn còn độ trễ khó chịu khi bắt đầu hoán đổi và sau khi quá trình bị giết, một số phần của các quy trình khác thường được giữ nguyên cho đến khi chúng được yêu cầu, nhưng đó là một sự khởi đầu.

2) chỉ cần vô hiệu hóa trao đổi

Tôi biết đây là một chủ đề gây tranh cãi , nhưng với mục đích của các hệ thống máy tính để bàn và đặc biệt là các máy phát triển, đôi khi nó có thể xảy ra một quá trình cố gắng ăn hết bộ nhớ của bạn, điều đó có ý nghĩa: Không trao đổi, kẻ giết người OOM chỉ hoạt động như dự định. Khi bạn hết bộ nhớ, nó sẽ tìm ra quy trình tốt nhất để tiêu diệt và loại bỏ nó. Không trễ, không chậm trễ.

Bạn có thể vô hiệu hóa trao đổi cho phiên hiện tại với sudo swapoff -ahoặc thực hiện thay đổi vĩnh viễn .


Tất nhiên, giải pháp thích hợp cho vấn đề là hệ thống sẽ phản hồi nhanh khi bộ nhớ chính bị cạn kiệt và nó bắt đầu trao đổi bộ nhớ như không có ngày mai, nhưng dường như điều đó sẽ không xảy ra sớm.


1
Tôi đã vô hiệu hóa trao đổi và hệ thống của tôi chuyển thẳng từ bộ nhớ thấp (<100MB) sang đóng băng. Làm thế nào tôi có thể biết nếu kẻ giết người OOM được kích hoạt Actuall?
Michael

0

Hãy thử một trong hai điều sau:

1) thay đổi cài đặt swappiness từ cài đặt mặc định là 60, thành 10, tức là: add vm.swappiness = 10 thành /etc/sysctl.conf (trong terminal, gõ sudo gedit /etc/sysctl.conf), sau đó khởi động lại hệ thống. Tìm kiếm ở đây cho swappiness để biết thêm thông tin về nó.

2) Nếu swappiness không giúp ... mặc dù bạn có thể không muốn ... tăng kích thước của tệp hoán đổi của mình lên 1,5x16G và xem điều đó có giúp ích không.

Giữ cho tôi được đăng. Chúc mừng, Al


Tôi đã thiết lập một VM để chạy một số thử nghiệm, bởi vì việc khởi động lại hệ điều hành của tôi cứ sau vài giây lại thực sự khó chịu. Ubuntu 16.04, ram 2gb, trao đổi 3gb, đĩa 20gb. Sau đó, tôi chạy một đoạn script chiếm rất nhiều bộ nhớ: Với sự thay đổi mặc định (60), hệ thống đóng băng và sau vài phút, tôi tắt nó đi vì thời gian phục hồi là không thể chấp nhận được. Với swappiness 10, hệ thống sẽ đóng băng trong vài giây, sau đó nó chấp nhận đầu vào nhưng bạn không thể bắt đầu bất kỳ quy trình nào (ví dụ: topđể tiêu diệt bộ nhớ hog). Sau một phút hoặc lâu hơn, quá trình bị giết. Không hoàn hảo, nhưng chúng ta đang tiến gần hơn.
Klamann

Giữ cho chúng tôi được đăng. VM sẽ không thực sự mô phỏng hệ điều hành làm việc thực tế của bạn, nhưng nó sẽ cho phép bạn chơi với các cài đặt. Tôi sẽ tò mò nếu swappiness giúp giải quyết vấn đề của bạn. Chúc mừng, Al
heynnema

À! Giỏi. Phát triển! Đọc lên một chút về swappiness. Bạn có thể chơi với giá trị một chút. Chúc mừng, Al
heynnema

Bao nhiêu trao đổi đã được sử dụng khi hệ thống đóng băng? Chúc mừng, Al
heynnema

2
Tại sao, điểm gì trong đó? thêm bộ nhớ sẽ không ngăn hệ thống bị kẹt nếu tôi cũng sử dụng bộ nhớ đó.
Klamann

0

Tôi đã giải quyết một vấn đề tương tự. Tôi không biết nếu kinh nghiệm của tôi có thể phù hợp với bạn ...

Gần đây tôi đã xuất bản một hướng dẫn về cách cài đặt linux trên các thiết bị LVM loopback khởi động từ USB (vì vậy không cần phải cài đặt grub trên đĩa bên trong, để nó như bản gốc). Dưới đây là hướng dẫn: https://github.com/DareDevil73/linux-on-loopback-usb .

Sau đó, tôi rơi vào vấn đề đóng băng khi tải bộ nhớ cao và tôi quan sát thấy việc sử dụng không gian hoán đổi bất thường (tất cả RAM đã ăn và sử dụng trao đổi gần như bằng không). Rõ ràng phân vùng trao đổi LVM đã được gắn kết và hoạt động đúng, nhưng tôi không biết tại sao kernel không sử dụng nó như mong đợi.

Tôi đã thử một giải pháp thay thế. Tôi đã tạo một tệp loopback hoán đổi (không phải LVM) và đóng băng đã biến mất. Bây giờ tập tin trao đổi được sử dụng như nó sẽ được, và hệ điều hành không bao giờ đóng băng!

Vui lòng xem https://github.com/DareDevil73/linux-on-loopback-usb# Unknown -issues để có được thông tin sâu hơn.


Vui lòng mở rộng các liên kết thành câu trả lời.
Konrad Gajewski
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.