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?


12

Chạy một số máy chủ Linux với một hoặc chỉ một vài trình nền dịch vụ hệ thống quan trọng, tôi muốn điều chỉnh trình diệt OOM cho các quy trình được tạo ra đó trong trường hợp có điều gì đó kỳ lạ xảy ra. Ví dụ, ngày nay một số máy chủ Ubuntu chạy MySQL đã bị giết daemon MySQL vì hàng tấn apt-checkerquy trình chiếm hết bộ nhớ và kernel nghĩ rằng đó là một ý tưởng tốt để giết MySQL.

Tôi biết rằng tôi có thể điều chỉnh điểm số bằng cách sử dụng /proc/$(pidof mysqld)/oom_score_adjtệp để cung cấp cho nhân một số manh mối mà tôi không thích MySQL bị giết, tuy nhiên điều đó không tồn tại khi khởi động lại dịch vụ. Tôi có nên chỉnh sửa các tập lệnh init / upstart từ gói để bao gồm các điều chỉnh này không? Tôi không nghĩ đó là một giải pháp rất thanh lịch vì tôi sẽ điều chỉnh các tệp thuộc một gói. Có thể nối vào các tập lệnh khởi động / init nói chung và điều chỉnh nó một cách có điều kiện? Hoặc bạn sẽ đề nghị chạy một kịch bản không xác định như thế while true{ adjust_oom(); sleep 60;}nào?


Điều thú vị là có khả năng điều chỉnh điều đó. Tôi đoán rằng không có gì tốt hơn vòng lặp vô hạn của bạn để hoàn thành công việc. Kẻ giết người OOM được chôn sâu bên trong hạt nhân và có một thuật toán rất tối nghĩa.
Nils

Câu trả lời:


7

Một số hệ thống giám sát hiện đại có một phương tiện để thực hiện việc này. (Thật vậy, vì có một công cụ tải chuỗi cho công việc, nên có thể nói rằng tất cả chúng đều có phương tiện để thực hiện việc này.)

  • Mới bắt đầu: Sử dụng oom scoretrong tập tin công việc.
    điểm số -500
  • hệ thống: Sử dụng OOMScoreAdjust=cài đặt trong đơn vị dịch vụ. Bạn có thể sử dụng tệp vá đơn vị dịch vụ để ảnh hưởng đến các đơn vị dịch vụ đóng gói sẵn.
    [Dịch vụ] 
    OOMScoreAdjust = -500
  • họ daemontools : Sử dụngoom-kill-protectcông cụ từ bộ công cụ nosh trongrun chương trình cho dịch vụ.

    Nếu bạn đang chuyển đổi một đơn vị dịch vụ hệ thống, convert-systemd-unitstrên thực tế công cụ sẽ chuyển đổiOOMScoreAdjust= cài đặt thành một lệnh gọi như vậy oom-kill-protect.

    #! / bin / quà vặt 
    ...
    oom-kill-Protect - -500
    ...
    chương trình tranh luận
    Là một phần thưởng, bạn có thể làm cho nó tham số hóa:
    oom-kill-bảo vệ - fromenv
    và đặt giá trị của tham số trong môi trường của dịch vụ (được cho là được đọc từ một envdir được liên kết với dịch vụ, ở đây được thao tác với bộ công cụ nosh rcctl shim nosh):
    rcctl bộ servicename oomprotect -500

đọc thêm

  • Jonathan de Boyne Pollard (2016). oom-kill-protect. bộ công cụ nosh. Phần mềm.
  • James Hunt và Clint Byrum (2014). " oom score". Sách dạy nấu ăn mới nổi .
  • Lennart Poettering (2013-10-07). " OOMScoreAdjust". systemd.exec. trang hướng dẫn hệ thống. freedesktop.org.
  • Jonathan de Boyne Pollard. rcctl. bộ công cụ nosh. Phần mềm.
  • /unix//a/409454/5132

9

Điều này có thể có trong Ubuntu bằng cách sử dụng Upstart và oom scoretùy chọn cấu hình.

oom score

Linux có một cơ sở giết người "hết bộ nhớ". [...]

Thông thường, kẻ giết người OOM coi tất cả các quy trình như nhau, khổ thơ này khuyên nhân xử lý công việc này khác nhau.

Giá trị "điều chỉnh" được cung cấp cho khổ thơ này có thể là giá trị nguyên từ -999 (rất khó bị giết bởi kẻ giết người OOM) lên tới 1000 (rất có khả năng bị giết bởi kẻ giết người OOM). [...]

Thí dụ:

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

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

Đối với những độc giả sử dụng Ubuntu 16.04+, điều này đã trở nên lỗi thời khi Upstart đã được thay thế bởi systemd.
gertvdijk

4

Bạn có thể hack nó vào chính MySQL (ví dụ như OpenSSH sshdthực hiện điều này), tuy nhiên điều đó hơi khó và rất bẩn (vấn đề với các bản cập nhật, v.v.)

Bạn có thể thực hiện việc này trong trình bao bọc hoặc trong tập lệnh init - điểm sẽ được kế thừa (và trong trình bao bọc bạn có thể muốn thực hiện bằng exec mysqld "$@"mọi cách).

Sử dụng cgroups- nó sẽ giúp bạn linh hoạt hơn một chút và có thể được thực hiện vĩnh viễn theo nghĩa, rằng các cài đặt phù hợp có thể được áp dụng tự động khi khởi động lại dịch vụ. Xem ví dụ: kiểm soát mức độ ưu tiên của các ứng dụng bằng cách sử dụng các nhóm để biết thêm thông tin. Để đạt được tính tự động mà bạn đang tìm kiếm, có lẽ bạn sẽ muốn xem libcgroup , trong đó có một trình nền có thể xử lý các nhóm thay đổi của một quy trình đang chạy theo một bộ quy tắc hoặc chỉ sử dụng cgexectrình bao bọc ( từ cùng một gói).

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.