Bagaimana cara mengatur penyesuaian pembunuh OOM untuk daemon secara permanen?

12

Menjalankan beberapa server Linux dengan daemon layanan sistem tunggal atau hanya beberapa yang vital, saya ingin menyesuaikan pembunuh OOM untuk proses-proses yang di-daemonisasi jika-kalau terjadi sesuatu yang aneh. Sebagai contoh, saat ini beberapa Ubuntu server menjalankan MySQL mendapat MySQL daemon dibunuh karena ton apt-checkerproses yang memakan semua memori dan kernel pikir itu ide yang baik untuk membunuh MySQL.

Saya tahu saya dapat menyesuaikan skor menggunakan /proc/$(pidof mysqld)/oom_score_adjfile untuk memberikan kernel beberapa petunjuk saya tidak suka MySQL untuk dibunuh, namun itu tidak selamat me-restart layanan. Haruskah saya mengedit skrip init / pemula dari paket untuk menyertakan penyesuaian ini? Saya tidak berpikir itu solusi yang sangat elegan karena saya akan membuat penyesuaian ke file milik paket. Apakah mungkin untuk menghubungkan ke skrip pemula / init secara umum dan menyesuaikannya secara kondisional? Atau apakah Anda menyarankan menjalankan skrip tak terbatas seperti while true{ adjust_oom(); sleep 60;}?

gertvdijk
sumber
Menarik bahwa ada kemungkinan untuk menyesuaikan itu. Saya kira tidak ada yang lebih baik dari loop tanpa batas Anda untuk menyelesaikan pekerjaan. OOM-killer terkubur jauh di dalam kernel dan memiliki algoritma yang sangat tidak jelas.
Nils

Jawaban:

8

Beberapa sistem pengawasan demon modern memiliki cara untuk melakukan ini. (Memang, karena ada alat rantai pemuatan untuk pekerjaan itu, bisa dibilang mereka semua memiliki sarana untuk melakukan ini.)

  • Pemula: Gunakan oom scoredalam file pekerjaan.
    skor oom -500
  • systemd: Gunakan OOMScoreAdjust=pengaturan di unit layanan. Anda dapat menggunakan file tambalan unit layanan untuk mempengaruhi unit layanan pra-paket.
    [Layanan] 
    OOMScoreAdjust = -500
  • keluarga daemontools : Gunakanoom-kill-protectalat dari nosh toolset dalamrunprogram untuk layanan.

    Jika Anda mengonversi unit layanan sistem, convert-systemd-unitsalat ini sebenarnya akan mengubah OOMScoreAdjust=pengaturan menjadi doa seperti oom-kill-protect.

    #! / bin / nosh 
    ...
    oom-kill-protect - -500
    ... argumen
    program
    Sebagai bonus, Anda dapat membuatnya menjadi parameter:
    oom-kill-protect - fromenv
    dan mengatur nilai parameter di lingkungan layanan (dianggap dibaca dari envdir yang terkait dengan layanan, di sini dimanipulasi dengan rcctlshim nosh toolset ):
    rcctl mengatur servicename oomprotect -500

Bacaan lebih lanjut

  • Jonathan de Boyne Pollard (2016). oom-kill-protect. nosh toolset. Perangkat lunak.
  • James Hunt dan Clint Byrum (2014). " oom score". Mulai Cookbook .
  • Lennart Poettering (2013-10-07). " OOMScoreAdjust". systemd.exec. halaman manual systemd. freedesktop.org.
  • Jonathan de Boyne Pollard. rcctl. nosh toolset. Perangkat lunak.
  • /unix//a/409454/5132
JdeBP
sumber
9

Ini dimungkinkan di Ubuntu menggunakan Startstart dan oom scoreopsi konfigurasi.

oom score

Linux memiliki fasilitas pembunuh "Kehabisan Memori". [...]

Biasanya pembunuh OOM menganggap semua proses sama, bait ini menyarankan kernel untuk memperlakukan pekerjaan ini secara berbeda.

Nilai "penyesuaian" yang diberikan untuk bait ini mungkin merupakan nilai bilangan bulat dari -999 (sangat tidak mungkin dibunuh oleh pembunuh OOM) hingga 1000 (sangat mungkin dibunuh oleh pembunuh OOM). [...]

Contoh:

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

expect daemon
respawn
exec /usr/bin/leaky-app
gertvdijk
sumber
Untuk pembaca yang menggunakan Ubuntu 16.04+, ini menjadi usang karena Upstart telah digantikan oleh systemd.
gertvdijk
4

Anda dapat meretasnya ke dalam MySQL itu sendiri (mis. OpenSSH sshdmelakukan ini), namun itu agak terlalu hardcore dan sangat kotor (masalah dengan pembaruan dll.)

Anda dapat melakukan ini dalam pembungkus atau dalam skrip init - skor harus diwarisi (dan dalam pembungkus Anda mungkin ingin exec mysqld "$@"tetap melakukannya ).

Gunakan cgroups- itu akan memberi Anda sedikit lebih banyak fleksibilitas dan itu dapat dibuat permanen dalam arti, bahwa pengaturan yang sesuai dapat diterapkan secara otomatis pada restart layanan. Lihat misalnya mengendalikan prioritas aplikasi menggunakan cgroup untuk info lebih lanjut. Untuk mencapai otomatisme yang Anda cari, Anda mungkin ingin melihat libcgroup , yang berisi daemon yang dapat menangani perubahan cgroup dari proses yang berjalan dengan cepat sesuai dengan seperangkat aturan, atau cukup gunakan cgexecpembungkus ( dari paket yang sama).

peterph
sumber