Làm cách nào để sử dụng oom_score_adj?


24

Ngày 11.04, /proc/[pid]có chứa oom_score_adj, nhưng man procmô tả cái cũ oom_adj. Tôi đã googled không thành công cho bất kỳ thông tin về cách sử dụng này.

Điều tôi cần sắp xếp là các quy trình bắt đầu bằng 'pbs' hoặc 'gridengine' bị giết trước khi bất cứ thứ gì khác bị giết. Làm thế nào tôi có thể làm điều đó?


Để có sự thay đổi này vĩnh viễn cho các dịch vụ được quản lý bởi Upstart: Làm cách nào để thiết lập các điều chỉnh sát thủ OOM cho daemon vĩnh viễn? .
gertvdijk

Nó đã là một câu trả lời. Nó liên kết với nó. :)
gertvdijk

Nhưng không phải trên trang web này :-)
bmargulies

Câu trả lời:


13

Dựa trên câu hỏi và trả lời của riêng tôi về Unix & Linux cho một câu hỏi tương tự.

Như Stuart đã chỉ ra rất tốt trong câu trả lời của mình , các giá trị hợp lệ là các số nguyên trong phạm vi từ 1000 đến 1000 cho oom_score_adj. Các thấp hơn giá trị, làm giảm khả năng nó sẽ bị giết.

Sẽ rất bất tiện khi phải thay đổi giá trị này nhiều lần sau khi bạn khởi động lại ứng dụng. Thông tin đơn giản là bị mất sau khi quá trình kết thúc. Upstart (init daemon trong Ubuntu), có một tùy chọn tuyệt vời cho việc này để định cấu hình cho trình tiện ích để đảm bảo nó được đặt bất cứ khi nào nó bắt đầu lại:

oom score

[...] Bắn tỉa [...]

Thí dụ:

# this application is a "resource hog"
oom score 1000

expect daemon
respawn
exec /usr/bin/leaky-app

Vì vậy, về cơ bản, bạn có thể chỉnh sửa /etc/init/myservice.conftệp cấu hình cho các dịch vụ bạn muốn thay đổi, để bao gồm một dòng oom score -1000. Tôi cho rằng các dịch vụ 'pbs' hoặc 'gridengine' mà bạn đang nói trong câu hỏi của bạn là hỗ trợ khởi động, nếu không bạn sẽ cần một cách khác để thay đổi điều này vĩnh viễn.


7

Nếu bạn có thể sửa đổi tập lệnh bắt đầu sinh ra quá trình mà bạn muốn ưu tiên cho oom-killer, hãy thêm đoạn mã sau vào tập lệnh bắt đầu:

echo 1000 > /proc/self/oom_score_adj

Giá trị được kế thừa cho các quá trình con.


6

Nếu bạn đặt giá trị (ish) cao cho oom_adj hoặc oom_score_adj thì chúng sẽ bị giết trước. ví dụ

echo 15 > /proc/[pid]/oom_adj

oom_adj đi từ -16 đến 15 và như đã đề cập ở trên oom_score_adj chấp nhận -1000 đến 1000


Bạn cần phải root để làm điều này. sudo sh -c "echo -1000 > /proc/[PID]/oom_score_adj"
Adil

2
Trên thực tế, bạn có thể tăng điểm cho các quy trình của mình với root ("vâng, điều này có thể bị giết chết"). Giảm (dưới 0) cần root.
Piskvor

5

Nhìn vào mã luôn là một ý tưởng tốt. Thông thường tôi sử dụng chức năng tìm kiếm của kernel.org, nhưng hiện tại nó không hoạt động. Github cũng làm một công việc tốt. Tôi đã tìm thấy cái này:

Thay vào đó, một điều chỉnh mới, / Proc / pid / oom_score_adj, được thêm vào trong phạm vi từ -1000 đến +1000. Nó có thể được sử dụng để phân cực heuristic sao cho một số nhiệm vụ nhất định không bao giờ được xem xét để giết oom trong khi những nhiệm vụ khác có thể luôn được xem xét. Giá trị được thêm trực tiếp vào điểm xấu (), vì vậy, giá trị -500 chẳng hạn, có nghĩa là giảm 50% mức tiêu thụ bộ nhớ của nó so với các tác vụ khác trên hệ thống, bị ràng buộc với mempolicy, trong cpuset, hoặc chia sẻ cùng bộ điều khiển bộ nhớ.

Từ https://github.com/mirrors/linux-2.6/commit/a63d83f427fbce97a6cea0db2e64b0eb8435cd10#include/linux/oom.h


Cảm ơn con trỏ, nhưng tôi hy vọng ai đó sẽ lái xe và bắn vào một công thức cho toàn bộ vấn đề, dường như sẽ sắp xếp giá trị này được đặt cho daemon của pbs trước khi nó thực hiện bất kỳ công việc nào.
bmargulies

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.