it-swarm.com.de

Wie kann ich den Linux OOM-Killer dazu bringen, meinen Prozess nicht zu beenden?

Wie kann ich den Linux OOM-Killer dazu bringen, meine Prozesse nicht abzubrechen, wenn der physische Speicher knapp ist, aber genügend Swap-Speicherplatz vorhanden ist?

Ich habe OOM-Killing und Overcommit mit sysctl vm.overcommit_memory = 2 deaktiviert.

Die VM hat 3 GB absolut freien unfragmentierten Swap und die Prozesse, die OOM beendet werden, haben eine maximale Speichernutzung von weniger als 200 MB.

Ich weiß, dass ein langfristiger Austausch für die Leistung schrecklich sein wird, aber ich muss den Austausch jetzt verwenden, um Funktionstests unter Valgrind durchzuführen, bei denen der Speicherbedarf viel höher ist.

Mar  7 02:43:11 myhost kernel: memcheck-AMD64- invoked oom-killer: gfp_mask=0x24002c2, order=0, oom_score_adj=0
Mar  7 02:43:11 myhost kernel: memcheck-AMD64- cpuset=/ mems_allowed=0
Mar  7 02:43:11 myhost kernel: CPU: 0 PID: 3841 Comm: memcheck-AMD64- Not tainted 4.4.0-x86_64-linode63 #2
Mar  7 02:43:11 myhost kernel: Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.8.2-0-g33fbe13 by qemu-project.org 04/01/2014
Mar  7 02:43:11 myhost kernel: 0000000000000000 0000000000000000 ffffffff8158cbcc ffff880032d7bc18
Mar  7 02:43:11 myhost kernel: ffffffff811c6a55 00000015118e701d ffffffff81044a8d 00000000000003e2
Mar  7 02:43:11 myhost kernel: ffffffff8110f5a1 0000000000000000 00000000000003e2 ffffffff81cf15cc
Mar  7 02:43:11 myhost kernel: Call Trace:
Mar  7 02:43:11 myhost kernel: [<ffffffff8158cbcc>] ? dump_stack+0x40/0x50
Mar  7 02:43:11 myhost kernel: [<ffffffff811c6a55>] ? dump_header+0x59/0x1dd
Mar  7 02:43:11 myhost kernel: [<ffffffff81044a8d>] ? kvm_clock_read+0x1b/0x1d
Mar  7 02:43:11 myhost kernel: [<ffffffff8110f5a1>] ? __raw_callee_save___pv_queued_spin_unlock+0x11/0x1e
Mar  7 02:43:11 myhost kernel: [<ffffffff81183316>] ? oom_kill_process+0xc0/0x34f
Mar  7 02:43:11 myhost kernel: [<ffffffff811839b2>] ? out_of_memory+0x3bf/0x406
Mar  7 02:43:11 myhost kernel: [<ffffffff81187bbd>] ? __alloc_pages_nodemask+0x8ba/0x9d8
Mar  7 02:43:11 myhost kernel: [<ffffffff811b82e8>] ? alloc_pages_current+0xbc/0xe0
Mar  7 02:43:11 myhost kernel: [<ffffffff811b096c>] ? __vmalloc_node_range+0x12d/0x20a
Mar  7 02:43:11 myhost kernel: [<ffffffff811e0e62>] ? alloc_fdtable+0x6a/0xd8
Mar  7 02:43:11 myhost kernel: [<ffffffff811b0a83>] ? __vmalloc_node+0x3a/0x3f
Mar  7 02:43:11 myhost kernel: [<ffffffff811e0e62>] ? alloc_fdtable+0x6a/0xd8
Mar  7 02:43:11 myhost kernel: [<ffffffff811b0ab0>] ? vmalloc+0x28/0x2a
Mar  7 02:43:11 myhost kernel: [<ffffffff811e0e62>] ? alloc_fdtable+0x6a/0xd8
Mar  7 02:43:11 myhost kernel: [<ffffffff811e1338>] ? dup_fd+0x103/0x1f0
Mar  7 02:43:11 myhost kernel: [<ffffffff810dd143>] ? copy_process+0x5aa/0x160d
Mar  7 02:43:11 myhost kernel: [<ffffffff8110f5a1>] ? __raw_callee_save___pv_queued_spin_unlock+0x11/0x1e
Mar  7 02:43:11 myhost kernel: [<ffffffff810de2fc>] ? _do_fork+0x7d/0x291
Mar  7 02:43:11 myhost kernel: [<ffffffff810ea186>] ? __set_current_blocked+0x47/0x52
Mar  7 02:43:11 myhost kernel: [<ffffffff810ea1f2>] ? sigprocmask+0x61/0x6a
Mar  7 02:43:11 myhost kernel: [<ffffffff81998eae>] ? entry_SYSCALL_64_fastpath+0x12/0x71
Mar  7 02:43:11 myhost kernel: Mem-Info:
Mar  7 02:43:11 myhost kernel: active_anon:15 inactive_anon:18 isolated_anon:0
Mar  7 02:43:11 myhost kernel: active_file:7 inactive_file:8 isolated_file:0
Mar  7 02:43:11 myhost kernel: unevictable:0 dirty:3 writeback:26 unstable:0
Mar  7 02:43:11 myhost kernel: slab_reclaimable:1798 slab_unreclaimable:3674
Mar  7 02:43:11 myhost kernel: mapped:8 shmem:1 pagetables:752 bounce:0
Mar  7 02:43:11 myhost kernel: free:1973 free_pcp:0 free_cma:0
Mar  7 02:43:11 myhost kernel: Node 0 DMA free:3944kB min:60kB low:72kB high:88kB active_anon:0kB inactive_anon:0kB active_file:28kB inactive_file:32kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:15992kB managed:15908kB
 mlocked:0kB dirty:0kB writeback:0kB mapped:0kB shmem:0kB slab_reclaimable:72kB slab_unreclaimable:236kB kernel_stack:48kB pagetables:60kB unstable:0kB bounce:0kB free_pcp:0kB local_pcp:0kB free_cma:0kB writeback_tmp:0kB pages_scanned:36
0 all_unreclaimable? yes
Mar  7 02:43:11 myhost kernel: lowmem_reserve[]: 0 972 972 972
Mar  7 02:43:11 myhost kernel: Node 0 DMA32 free:3948kB min:3956kB low:4944kB high:5932kB active_anon:60kB inactive_anon:72kB active_file:0kB inactive_file:0kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:1032064kB manag
ed:999552kB mlocked:0kB dirty:12kB writeback:104kB mapped:32kB shmem:4kB slab_reclaimable:7120kB slab_unreclaimable:14460kB kernel_stack:2112kB pagetables:2948kB unstable:0kB bounce:0kB free_pcp:0kB local_pcp:0kB free_cma:0kB writeback_t
mp:0kB pages_scanned:792 all_unreclaimable? yes
Mar  7 02:43:11 myhost kernel: lowmem_reserve[]: 0 0 0 0
Mar  7 02:43:11 myhost kernel: Node 0 DMA: 20*4kB (UM) 17*8kB (UM) 13*16kB (M) 14*32kB (UM) 8*64kB (UM) 4*128kB (M) 4*256kB (M) 0*512kB 1*1024kB (M) 0*2048kB 0*4096kB = 3944kB
Mar  7 02:43:11 myhost kernel: Node 0 DMA32: 934*4kB (UM) 28*8kB (UM) 0*16kB 0*32kB 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 3960kB
Mar  7 02:43:11 myhost kernel: 71 total pagecache pages
Mar  7 02:43:11 myhost kernel: 42 pages in swap cache
Mar  7 02:43:11 myhost kernel: Swap cache stats: add 245190, delete 245148, find 77026/136093
Mar  7 02:43:11 myhost kernel: Free swap  = 3118172kB
Mar  7 02:43:11 myhost kernel: Total swap = 3334140kB
Mar  7 02:43:11 myhost kernel: 262014 pages RAM
Mar  7 02:43:11 myhost kernel: 0 pages HighMem/MovableOnly
Mar  7 02:43:11 myhost kernel: 8149 pages reserved
Mar  7 02:43:11 myhost kernel: [ pid ]   uid  tgid total_vm      rss nr_ptes nr_pmds swapents oom_score_adj name
Mar  7 02:43:11 myhost kernel: [ 2054]     0  2054     5101        1      15       4      283             0 upstart-udev-br
Mar  7 02:43:11 myhost kernel: [ 2063]     0  2063    12362        1      28       4      184         -1000 systemd-udevd
Mar  7 02:43:11 myhost kernel: [ 3342]   102  3342     9780        1      23       3       89             0 dbus-daemon
Mar  7 02:43:11 myhost kernel: [ 3423]     0  3423    10864        1      26       3       85             0 systemd-logind
Mar  7 02:43:11 myhost kernel: [ 3441]     0  3441    15344        0      34       3      184         -1000 sshd
Mar  7 02:43:11 myhost kernel: [ 3450]     0  3450     4786        0      14       3       43             0 atd
Mar  7 02:43:11 myhost kernel: [ 3451]     0  3451     5915        0      17       4       65             0 cron
Mar  7 02:43:11 myhost kernel: [ 3457]   101  3457    63962        0      28       3      202             0 rsyslogd
Mar  7 02:43:11 myhost kernel: [ 3516]     0  3516     3919        1      13       3      156             0 upstart-file-br
Mar  7 02:43:11 myhost kernel: [ 3518]     0  3518     4014        0      13       3      265             0 upstart-socket-
Mar  7 02:43:11 myhost kernel: [ 3557]     0  3557    66396        0      32       3     1802             0 fail2ban-server
Mar  7 02:43:11 myhost kernel: [ 3600]     0  3600     3956        1      13       3       39             0 getty
Mar  7 02:43:11 myhost kernel: [ 3601]     0  3601     3198        1      12       3       37             0 getty
Mar  7 02:43:11 myhost kernel: [ 3673]     0  3673    26411        1      55       3      252             0 sshd
Mar  7 02:43:11 myhost kernel: [ 3740]  1000  3740    26411        1      52       3      253             0 sshd
Mar  7 02:43:11 myhost kernel: [ 3741]  1000  3741     5561        0      16       3      431             0 bash
Mar  7 02:43:11 myhost kernel: [ 3820]   103  3820     7863        1      21       3      152             0 ntpd
Mar  7 02:43:11 myhost kernel: [ 3837]  1000  3837    31990        0      58       4    12664             0 memcheck-AMD64-
Mar  7 02:43:11 myhost kernel: [ 3841]  1000  3841    32006        0      59       4    12812             0 memcheck-AMD64-
Mar  7 02:43:11 myhost kernel: [ 3844]  1000  3844    31950        0      57       4    12035             0 memcheck-AMD64-
Mar  7 02:43:11 myhost kernel: [ 3849]  1000  3849    31902        0      56       4    11482             0 memcheck-AMD64-
Mar  7 02:43:11 myhost kernel: [ 3853]  1000  3853     1087        0       7       3       27             0 lsof
Mar  7 02:43:11 myhost kernel: [ 3854]     0  3854    26140        5      55       3      230             0 sshd
Mar  7 02:43:11 myhost kernel: [ 3855]   104  3855    15699        0      33       3      202             0 sshd
Mar  7 02:43:11 myhost kernel: Out of memory: Kill process 3841 (memcheck-AMD64-) score 11 or sacrifice child
Mar  7 02:43:11 myhost kernel: Killed process 3841 (memcheck-AMD64-) total-vm:128024kB, anon-rss:0kB, file-rss:0kB

Dies ist/proc/meminfo

MemTotal:        1015460 kB
MemFree:          277508 kB
MemAvailable:     322032 kB
Buffers:            8336 kB
Cached:            42208 kB
SwapCached:        46088 kB
Active:            58844 kB
Inactive:         116100 kB
Active(anon):      34784 kB
Inactive(anon):    89620 kB
Active(file):      24060 kB
Inactive(file):    26480 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:       3334140 kB
SwapFree:        3215756 kB
Dirty:                16 kB
Writeback:             0 kB
AnonPages:        121128 kB
Mapped:            15072 kB
Shmem:                 4 kB
Slab:              22668 kB
SReclaimable:       8028 kB
SUnreclaim:        14640 kB
KernelStack:        2016 kB
PageTables:         2532 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     3841868 kB
Committed_AS:     380460 kB
VmallocTotal:   34359738367 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
DirectMap4k:       14208 kB
DirectMap2M:     1034240 kB
DirectMap1G:           0 kB
28
Coder

Dies scheint in Kombination mit zwei Faktoren ein Problem zu sein:

  • Verwenden einer virtuellen Maschine.
  • Ein möglicher Kernel-Fehler.

Dies ist teilweise eine der Zeilen, die beschreiben, warum dies geschieht:

 7. März 02:43:11 myhost-Kernel: memcheck-AMD64- aufgerufener oom-Killer: gfp_mask = 0x24002c2, order = 0, oom_score_adj = 0 

Die andere Zeile lautet:

Mar  7 02:43:11 myhost kernel: 0 pages HighMem/MovableOnly

| Die erste Zeile ist die für die Zuordnung zugewiesene GFP-Maske. Grundsätzlich wird beschrieben, was der Kernel tun darf/nicht darf, um diese Anforderung zu erfüllen. Die Maske zeigt eine Reihe von Standardflags an. Das letzte Bit '2' gibt jedoch an, dass die Speicherzuordnung aus der Zone HighMem stammen soll.

Wenn Sie sich die OOM-Ausgabe genau ansehen, sehen Sie, dass tatsächlich keine HighMem/Normal - Zone vorhanden ist.

Mar  7 02:43:11 myhost kernel: Node 0 DMA: 20*4kB (UM) 17*8kB (UM) 13*16kB (M) 14*32kB (UM) 8*64kB (UM) 4*128kB (M) 4*256kB (M) 0*512kB 1*1024kB (M) 0*2048kB 0*4096kB = 3944kB
Mar  7 02:43:11 myhost kernel: Node 0 DMA32: 934*4kB (UM) 28*8kB (UM) 0*16kB 0*32kB 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 3960kB

HighMem (im Allgemeinen auch als Normal auf x86_64 bezeichnet) tendiert dazu, Speicher für Zonen außerhalb der Standardbereiche von 896 MB zuzuordnen, auf die auf 32-Bit-Systemen direkt zugegriffen werden kann. Auf x86_64 scheint HighMem/Normal Alle Seiten mit einer Größe über 3 GB abzudecken.

DMA32 Enthält eine Zone, die für den Speicher verwendet wird, auf den auf 32-Bit-GerätenDMA zugegriffen werden kann, dh Sie können sie mit 4-Byte-Zeigern adressieren. Ich glaube, DMA ist für 16-Bit DMA Geräte.

Im Allgemeinen würde auf Systemen mit wenig Speicher Normal nicht existieren, da DMA32 Alle verfügbaren virtuellen Adressen bereits abdeckt.

Der Grund, warum Sie OOM beenden, ist, dass eine Speicherzuordnung für eine HighMem -Zone mit 0 verfügbaren Seiten vorhanden ist. Da der Out-of-Memory-Handler absolut keine Möglichkeit hat, diese Zone mit Seiten zu versehen, die durch Austauschen, Beenden anderer Prozesse oder anderer Tricks verwendet werden können, beendet OOM-Killer sie einfach.

Ich glaube, dies wird dadurch verursacht, dass der Host VM beim Hochfahren im Ballon aufsteigt. Auf KVM Systemen können zwei Werte festgelegt werden.

  • Der aktuelle Speicher.
  • Der verfügbare Speicher.

Dies funktioniert so, dass Sie Ihrem Server Speicher bis zum verfügbaren Speicher hinzufügen können. Ihr System erhält jedoch tatsächlich den aktuellen Speicher.

Wenn ein KVM VM hochfährt, beginnt es mit der maximal möglichen Speicherzuweisung (dem verfügbaren Speicher). Während der Startphase des Systems kratzt KVM diesen Speicher allmählich mithilfe seiner Sprechblase zurück, sodass Sie stattdessen die aktuelle Speichereinstellung behalten, die Sie haben.

Ich glaube, das ist hier passiert. Mit Linode können Sie den Speicher erweitern und beim Systemstart viel mehr erreichen.

Dies bedeutet, dass zu Beginn der Systemlebensdauer eine Normal/HighMem - Zone vorhanden ist. Wenn der Hypervisor es aufbläht, verschwindet die normale Zone zu Recht aus dem Speichermanager. Ich vermute jedoch, dass die Flaggeneinstellung, ob die besagte Zone zum Zuweisen verfügbar ist, nicht gelöscht ist, wenn dies erforderlich ist. Dies führt dazu, dass der Kernel versucht, aus einer nicht vorhandenen Zone zuzuweisen.

Um dies zu lösen, haben Sie zwei Möglichkeiten.

  1. Rufen Sie dies in den Kernel-Mailinglisten auf, um zu sehen, ob dies wirklich ein Fehler, ein erwartetes Verhalten oder gar nichts mit dem zu tun hat, was ich sage.

  2. Fordern Sie den Linode auf, den 'verfügbaren Speicher' auf dem System auf dieselbe 1-GB-Zuweisung wie den 'aktuellen Speicher' einzustellen. Somit steigt das System niemals auf und erhält beim Booten niemals eine normale Zone, wodurch die Flagge frei bleibt. Viel Glück, dass sie das tun!

Sie sollten in der Lage sein, zu testen, ob dies der Fall ist, indem Sie Ihre eigene Einstellung VM in KVM einrichten, die für 6 GB verfügbar ist, aktuell 1 GB ist, und Ihren Test mit demselben Kernel ausführen, um festzustellen, ob Dieses oben gezeigte Verhalten tritt auf. Wenn dies der Fall ist, ändern Sie die Einstellung "Verfügbar" so, dass sie dem Strom von 1 GB entspricht, und wiederholen Sie den Test.

Ich mache hier ein paar fundierte Vermutungen und lese etwas zwischen den Zeilen, um diese Antwort zu finden, aber was ich sage, scheint zu den bereits skizzierten Fakten zu passen.

Ich schlage vor, meine Hypothese zu testen und uns alle das Ergebnis mitzuteilen.

36
Matthew Ife

Verwenden Sie zur Beantwortung Ihrer Überschriftenfrage oom_score_adj (Kernel> = 2.6.36) oder für frühere Kernel (> = 2.6.11) oom_adj Siehe man proc

/ proc/[pid]/oom_score_adj (seit Linux 2.6.36) Mit dieser Datei kann die Badness-Heuristik angepasst werden, mit der ausgewählt wird, welcher Prozess unter Bedingungen mit zu wenig Speicher beendet wird ...

/ proc/[pid]/oom_adj (seit Linux 2.6.11) Mit dieser Datei kann die Punktzahl angepasst werden, mit der ausgewählt wird, welcher Prozess in einer OOM-Situation (Out-of-Memory) beendet werden soll ...

Es gibt noch viel mehr zu lesen, aber wenn Sie oom_score_adj auf -1000 oder oom_adj auf -17 setzen, wird das erreicht, was Sie wollen.

Das Problem ist, dass etwas anderes getötet wird. Vielleicht ist es besser festzustellen, warum OOM aufgerufen wird, und sich damit zu befassen.

32
user9517

Einige Gedanken (aus meinen Kommentaren oben) und Links zu interessanten Informationen über Ihre Situation:

12
Olivier Dulac

neben erwähnt oom_score_adj Erhöhen für den fraglichen Prozess (was wahrscheinlich nicht viel hilft - es würde es weniger wahrscheinlich machen, dass dieser Prozess ZUERST beendet wird, aber da dies nur ein speicherintensives Prozesssystem ist, wird es wahrscheinlich nicht wiederhergestellt, bis es endgültig ist getötet), hier sind einige Ideen zu Tweak:

  • wenn Sie vm.overcommit_memory=2, auch Tweak vm.overcommit_ratio auf vielleicht 90 (alternativ setzen Sie vm.overcommit_memory=0 - siehe Kernel-Overcommit-Dokumente )
  • erhöhen, ansteigen vm.min_free_kbytes um immer etwas physisches RAM frei zu halten und damit die Wahrscheinlichkeit zu verringern, dass OOM etwas töten muss (aber übertreibe es nicht, da es sofort OOM wird).
  • erhöhen, ansteigen vm.swappiness bis 100 (um Kernel-Swap leichter zu machen )

Beachten Sie, dass wenn Sie zu wenig Speicher haben, um die vorliegende Aufgabe auszuführen, auch wenn Sie keine OOM haben, diese (oder auch nicht) EXTREM langsam werden kann - Eine halbe Stunde (auf einem System mit genügend RAM) kann in extremen Fällen leicht mehrere Wochen dauern (wenn RAM wird durch Swap ersetzt)) oder sogar die gesamte VM hängen Fall, wenn sich Swap auf klassischen Rotationsplatten befindet (im Gegensatz zu SSDs), aufgrund massiver zufälliger Lese-/Schreibvorgänge, die für sie sehr teuer sind.

6
Matija Nalis

Ich würde versuchen, Overcommit zu aktivieren und zu sehen, ob das hilft. Ihr Prozess scheint innerhalb eines fork -Aufrufs fehlzuschlagen, der so viel virtuellen Speicher benötigt wie der ursprüngliche Prozess. overcommit_memory=2 macht Ihren Prozess nicht immun gegen OOM-Killer, sondern verhindert lediglich, dass Ihr Prozess ihn auslöst, indem er zu viel zuweist. Andere Prozesse können zu nicht verwandten Zuordnungsfehlern führen (z. B. Abrufen eines zusammenhängenden Speicherblocks), die den OOM-Killer weiterhin auslösen und Ihren Prozess entsorgen.

Alternativ (und mehr auf den Punkt), wie mehrere Kommentare vermuten lassen, kaufen Sie mehr RAM.

3

Kurzgeschichte - probieren Sie eine andere Kernelversion. Ich habe ein System, das OOM-Fehler mit 4.2.0-x- und 4.4.0-x-Kerneln zeigte, aber nicht mit 3.19.0-x.

Lange Geschichte: (nicht zu lang!) Ich habe hier noch einen Compaq DC5000 in Betrieb - derzeit mit 512 MB RAM) (und ein Teil davon, wie 32-128 MB, wird bereitgestellt zum Onboard-Video ..) Hauptsächlich für NFS, habe ich einen Monitor angeschlossen, so dass ich mich gelegentlich anmelden werde (Ubuntu Classic, no Unity.)

Über Ubuntu HWE habe ich eine Weile den 3.19.x-Kernel ausgeführt. es würde am Ende wie 200-300 MB Material austauschen, aber anscheinend war es unbenutztes Material, es würde keine Tauschaktivität geben, wenn es später ausgetauscht werden müsste, soweit ich das beurteilen konnte.

4.2.0-x-Kernel und jetzt 4.4.0-x-Kernel, ich kann einen klobigen NFS-Schreibvorgang starten, nur 220 MB in den Swap (d. H. 1,3 GB frei), und es wird OOM-Killing-Dinge starten. Ich werde nicht behaupten, ob es sich um einen Kernel-Fehler oder ein "Tuning-Problem" handelt (wie eine 64-MB-Reserve, die normalerweise in Ordnung ist, aber auf einem System mit ca. 400 MB oder so zu hoch ist?)

Keine Respektlosigkeit gegenüber denen, die sagen, dass es irgendwie kaputt geht, nur weil er erwartet, Swap zu verwenden; Bei allem Respekt liegst du falsch. Es wird nicht schnell gehen, aber ich habe auf einigen 512 MB-1 GB-Systemen 1 oder 2 GB in den Swap gesteckt. Natürlich sind einige Arten von Software mlock eine Reihe von RAM, aber in meinem Fall (da ich dieselbe Software nur auf einem anderen Kernel ausführe) ist dies eindeutig nicht der Fall.

0
user367995