Daemonlar için OOM katil ayarlamaları kalıcı olarak nasıl yapılır?


12

Bazı Linux sunucularını tek veya sadece birkaç hayati sistem hizmeti arka plan programı ile çalıştırarak, garip bir şey olması durumunda o daemonlaştırılmış süreçler için OOM katilini ayarlamak istiyorum. Örneğin bugün tonlarca çünkü MySQL çalışan bazı Ubuntu sunucu bir öldürülmüş MySQL daemon var apt-checkersüreçler edildi tüm bellek tüketen ve çekirdek o MySQL öldürmek için iyi bir fikir olduğunu düşündü.

/proc/$(pidof mysqld)/oom_score_adjÇekirdeğe bazı ipuçları vermek için dosyayı kullanarak skoru ayarlayabileceğimi biliyorum . Bu ayarlamaları dahil etmek için init / upstart komut dosyalarını pakette düzenlemeli miyim? Bir pakete ait dosyalarda ayarlamalar yapacağım için bunun çok şık bir çözüm olduğunu düşünmüyorum. Genel olarak sonradan başlatma / başlatma komut dosyalarına bağlanmak ve koşullu olarak ayarlamak mümkün müdür? Yoksa şöyle belirsiz bir komut dosyası çalıştırmayı önerir misiniz while true{ adjust_oom(); sleep 60;}?


İlginçtir ki, ayarlama imkanı vardır. Sanırım işi tamamlamak için sonsuz döngünüzden daha iyi bir şey yok. OOM katili çekirdeğin derinliklerine gömülü ve çok belirsiz bir algoritmaya sahip.
Nils

Yanıtlar:


8

Birçok modern dæmon denetim sisteminin bunu yapmanın bir yolu vardır. (İşi için bir zincir yükleme aracı olmadığından Nitekim, tartışmalı onlar tüm bu iş için bir araç vardır.)

  • Upstart:oom score İş dosyasında kullanın .
    oom skoru -500
  • systemd:OOMScoreAdjust= Servis birimindeki ayarı kullanın . Önceden paketlenmiş hizmet birimlerini etkilemek için hizmet birimi düzeltme eki dosyalarını kullanabilirsiniz.
    [Hizmet] 
    OOMScoreAdjust = -500
  • daemontools ailesi : Hizmetoom-kill-protect için nosh araç setindeki aracıkullanınrun.

    Bir sistem servis birimini dönüştürüyorsanız, convert-systemd-unitsaraç aslında OOMScoreAdjust=ayarı böyle bir çağrışmaya dönüştürür oom-kill-protect.

    #! / bin / nosh 

    oom-kill-koruma - -500

    program argümanları
    Bonus olarak, parametrelendirilebilir yapabilirsiniz:
    oom-öldürmek-korumak - fromenv
    ve hizmet ortamındaki parametrenin değerini ayarlayın (hizmetle ilişkili bir envdir'den okunacağı varsayılır, burada nosh araç takımı rcctlşim ile değiştirilir):
    rcctl set servis adı oomprotect -500

daha fazla okuma

  • Jonathan de Boyne Pollard (2016). oom-kill-protect. nosh araç takımı. Yazılımları.
  • James Hunt ve Clint Byrum (2014). " oom score". Upstart Yemek Kitabı .
  • Lennart Poettering (2013-10-07). " OOMScoreAdjust". systemd.exec. systemd kılavuz sayfaları. freedesktop.org.
  • Jonathan de Boyne Pollard. rcctl. nosh araç takımı. Yazılımları.
  • /unix//a/409454/5132

9

Bu Ubuntu'da Upstart ve oom scoreyapılandırma seçeneğini kullanarak mümkündür .

oom score

Linux'ta "Bellek Dolu" bir öldürme tesisi var. [...]

Normalde OOM katili tüm süreçleri eşit olarak görür, bu stanza çekirdeğe bu işe farklı davranmasını önerir.

Bu stanza sağlanan "ayarlama" değeri, -999'dan (OOM katili tarafından öldürülmesi pek olası değildir) 1000'e (OOM katili tarafından öldürülmesi muhtemel) bir tamsayı değeri olabilir. [...]

Misal:

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

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

Ubuntu 16.04+ kullanan okuyucular için, artık Upstart'ın systemd ile değiştirildiği artık kullanılmıyor.
gertvdijk

4

MySQL'in kendisini hackleyebilirsiniz (örneğin, OpenSSH'ler sshdbunu yapar), ancak bu biraz fazla sert ve çok kirli (güncellemelerle ilgili sorunlar vb.)

Bunu bir sarmalayıcıda veya init komut dosyasında yapabilirsiniz - puan devralınmalıdır (ve muhtemelen bir sarmalayıcıda exec mysqld "$@"yine de yapmak istersiniz ).

Kullanın cgroups- size biraz daha esneklik kazandıracak ve servis yeniden başlatıldığında uygun ayarların otomatik olarak uygulanabileceği anlamında kalıcı hale getirilebilir. Daha fazla bilgi için bkz. Cgroups kullanarak uygulamaların önceliğini kontrol etme . Aradığınız otomatizmi elde etmek için, muhtemelen bir kurallar kümesine göre çalışan bir işlemin değişen gruplarını anında işleyebilen bir daemon içeren libcgroup'a bir göz atmak isteyeceksiniz veya sarıcıyıcgexec ( aynı paketten).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.