Giết chết nút quy trình lớn nhất


14

Máy tính xách tay này có ổ SSD và do đó tôi quyết định bỏ qua việc trao đổi. Điều này hoạt động tốt trong hầu hết các trường hợp, nhưng đôi khi RAM hơi ngắn và máy tính trở nên chậm chạp và có xu hướng đóng băng. Có cách nào để thực hiện nút "giết quá trình lớn nhất" đi thẳng vào kernel trong trường hợp tôi nhận thấy sự đóng băng đủ nhanh không? Hoặc, bởi vì đó là một máy tính, một heuristic khi nó bắt đầu đóng băng và tự quay quá trình lớn nhất cũng sẽ ổn thôi.


Bạn có nghĩa là lệnh "giết quá trình lớn nhất"?
Ramesh

Linux có cái này Nó được gọi là kẻ giết người OOM. Nhưng bạn phải kích hoạt bộ nhớ quá mức (và mặc định nó được bật trong hầu hết các bản phát hành).
Patrick

@Patrick overcommit_memory0, overcommit_ratio50.
Reactormonk

Câu trả lời:


12

Từ nhận xét của bạn, có vẻ như hệ thống chỉ là trao đổi.

Linux có một trình diệt OOM, được gọi khi hệ thống đã quá tải bộ nhớ và hiện đã hết.
Linux theo mặc định thực hiện quá mức bộ nhớ, điều đó về cơ bản có nghĩa là nó cung cấp cho các chương trình nhiều bộ nhớ hơn so với hệ thống thực sự có. Nó thực hiện điều này với giả định rằng các chương trình sẽ không thực sự sử dụng tất cả bộ nhớ mà chúng yêu cầu. Tuy nhiên, khi hệ thống hết bộ nhớ, nó đã thông báo cho các quá trình đang chạy khác nhau rằng chúng có bộ nhớ, vì vậy nó không thể từ chối nữa. Thay vào đó, những gì nó làm là để gọi kẻ giết người OOM. Kẻ giết người OOM về cơ bản tìm thấy một quá trình mà hạt nhân nghĩ sẽ làm giảm bớt tình trạng hết bộ nhớ. Thông thường đây chỉ là quá trình sử dụng nhiều bộ nhớ nhất, nhưng thuật toán thực sự phức tạp hơn thế nhiều.

Vì bạn đã overcommit_memoryđặt thành 0(chế độ tự động), kernel đang thực hiện bộ nhớ quá mức. Vì vậy, từ hành vi được giải thích của bạn, có vẻ như hệ thống đang trao đổi rất nhiều.

Từ đây có 2 lựa chọn.

Giảm trao đổi

Hệ thống của bạn sắp hết RAM và do đó, kernel bắt đầu đẩy mọi thứ vào trao đổi. Nếu hệ thống của bạn hết trao đổi, thì nó sẽ gọi kẻ giết người OOM. Tuy nhiên vì bạn vẫn còn không gian trao đổi miễn phí, điều này không xảy ra.

Ý tưởng ban đầu của bạn, thủ công giết một quá trình.

Bạn có thể tự hủy một quá trình khi bạn nghĩ rằng hệ thống đang hoán đổi quá nhiều và cần phải chết. Điều này có thể được thực hiện thông qua các kích hoạt SysRq kernel.

Hạt nhân có cái mà nó gọi là "ma thuật SysRq". Đây là một chút chức năng yêu cầu kernel thực hiện một số thao tác khẩn cấp. Đây có thể là những thứ như "kể lại tất cả các tập chỉ đọc", "đồng bộ hóa tất cả các hệ thống tập tin" hoặc "khởi động lại ngay bây giờ". Một trong những lựa chọn này cũng là để gọi kẻ giết người OOM.

Nếu kernel của bạn có phép thuật SysRq được bật (tùy chọn kernel CONFIG_MAGIC_SYSRQ), bạn có thể làm điều này theo 2 cách.

  1. Alt+ SysRq+ f
    Chỉ cần nhấn 3 phím này trên bàn phím.
  2. echo f > /proc/sysrq-trigger
    Điều này sẽ thực hiện nhiệm vụ chính xác giống như phương pháp bàn phím, nhưng thực hiện theo chương trình.

Bạn cũng có thể vô hiệu hóa trao đổi hoàn toàn và đây là những gì tôi làm trên hầu hết các hệ thống của mình và vì lý do chính xác này. Hoán đổi có lợi ở chỗ hạt nhân sẽ trao đổi trước dữ liệu không được sử dụng, cho phép sử dụng nhiều ram của bạn để lưu vào bộ đệm. Nhưng nó dẫn đến vấn đề hoán đổi bắt buộc này mà bạn đang thấy.

Cá nhân tôi nghĩ rằng giải pháp tốt nhất là một số loại tùy chọn kernel để gọi kẻ giết OOM khi bị tráo đổi. Về cơ bản hãy để trao đổi ưu tiên hoạt động, nhưng nếu hạt nhân buộc phải chuyển thứ gì đó sang trao đổi vì bạn hết RAM, thì hãy gọi kẻ giết OOM.
Thật không may, đây chỉ là mong muốn cá nhân của riêng tôi. Nó không làm điều này.


Tôi không biết về OOM Killer. Tôi đã nghĩ đến một kịch bản liên tục theo dõi việc sử dụng bộ nhớ bằng cách sử dụng tophoặc pslệnh và nếu nó vượt quá giới hạn ngưỡng nhất định, sẽ giết quá trình đó bằng cách sử dụng killlệnh.
Ramesh

Tôi không sử dụng bất kỳ trao đổi.
Reactormonk

để xem quá trình nào đã bị giết bởi kẻ giết người oom:grep -E "oom-killer|Killed process" /var/log/syslog /var/log/syslog.1
lesmana

Xin lỗi nên trải nghiệm hạt nhân vừa giết chết mọi thứ.
Patrick

@Patrick điều đó xảy ra, nhưng sau ~ 30 phút.
Reactormonk
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.