Jak sprawić, by zabójca Linux OOM nie zabił mojego procesu?

28

Jak sprawić, by zabójca Linux OOM nie zabijał moich procesów, gdy pamięć fizyczna jest niska, ale jest dużo przestrzeni wymiany?

Wyłączyłem zabijanie OOM i przesadziłem z sysctl vm.overcommit_memory = 2.

Maszyna wirtualna ma 3 GB całkowicie darmowej niefragmentowanej wymiany, a procesy, które są zabijane przez OOM, mają maksymalne wykorzystanie pamięci poniżej 200 MB.

Wiem, że długoterminowa zamiana będzie straszna z punktu widzenia wydajności, ale muszę teraz użyć tej wymiany, aby przeprowadzić testy funkcjonalne w valgrind, gdzie wymagania dotyczące pamięci są znacznie większe.

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

To jest / 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
Koder
źródło
8
Ze śladu połączeń oczywiste jest, że jądro nie miało wystarczającej ilości pamięci. Jeśli chodzi o to, dlaczego się nie podmieniło, może to mieć wiele różnych przyczyn, z których wszystkie są zbyt długie, aby można je było w pełni wyjaśnić za pomocą 500 znaków. Ale wygląda na to, że nie było stron, które można by odzyskać ( all_unreclaimabletak). Są to strony zablokowane w pamięci RAM, na ogół dlatego, że są przypięte lub używane przez jądro. W tym czasie nic, co pozostało w pamięci RAM, nie podlegało wymianie; wszystko, co można było zamienić, już było. Ponownie rozwiązaniem jest więcej pamięci RAM.
Michael Hampton
1
@MichaelHampton Reszta pamięci jest używana przez zwykłe aplikacje. Dlaczego jądro nie może zmusić ich do zamiany? Proszę odpowiedzieć na moje pytanie „Jeśli to, co mówisz, jest prawdą, to w jaki sposób jakikolwiek proces może rozwidlić się po wykorzystaniu całej pamięci fizycznej?”
Koder
1
@MichaelHampton Wyłączam rozwidlenie, a teraz fail2ban wywołuje zabójcę oom, powodując śmierć moich procesów. Jaki jest sens wymiany, jeśli jądro jej nie użyje? Co ważniejsze, jak skonfigurować jądro, aby przestało mu brakować pamięci.
Koder
4
@MatthewIfe: Jeśli znasz odpowiedź, opublikuj ją tutaj. Witryny Stack Exchange są przeznaczone dla wszystkich, którzy czytają, nie tylko dla OP, który zadał pytanie.
R ..
4
Zamiana maszyny wirtualnej nie jest uważana za najlepszą praktykę. Przydziel więcej pamięci rzeczywistej do maszyny wirtualnej. Jeśli nie możesz dodać więcej pamięci, przenieś ją do fizycznego sprzętu zamiast pozostawić ją w wypożyczalni niewymiarowej.
Criggie

Odpowiedzi:

36

Wydaje się to być problemem w połączeniu z dwoma czynnikami:

  • Korzystanie z maszyny wirtualnej.
  • Możliwy błąd jądra.

Jest to częściowo jedna z linii, która opisuje, dlaczego tak się dzieje:

7 marca 02:43:11 jądro myhost: memcheck-amd64- wywołane oom-killer: gfp_mask = 0x24002c2, order = 0, oom_score_adj = 0

Druga linia to:

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

| Pierwszy wiersz to maska ​​GFP przypisana do alokacji. Zasadniczo opisuje, co jądro jest dozwolone / nie może zrobić, aby zaspokoić to żądanie. Maska wskazuje kilka standardowych flag. Ostatni bit „2” wskazuje jednak, że przydział pamięci powinien pochodzić ze HighMemstrefy.

Jeśli przyjrzysz się uważnie wynikowi OOM, zobaczysz, że żadna HighMem/Normalstrefa faktycznie nie istnieje.

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(zwykle nazywany także Normalx86_64) ma tendencję do mapowania pamięci dla stref poza standardowymi zakresami 896MiB bezpośrednio jądro dostępne w systemach 32-bitowych. Na x86_64 HighMem/Normalwydaje się obejmować wszystkie strony powyżej 3GiB.

DMA32zawiera strefę używaną dla pamięci, która byłaby dostępna na 32-bitowych urządzeniach DMA, tzn. można adresować je 4-bajtowymi wskaźnikami. Uważam, że DMAdotyczy 16-bitowych urządzeń DMA.

Ogólnie rzecz biorąc, w systemach o niskiej pamięci Normalnie istniałyby, biorąc pod uwagę, że DMA32obejmują one już wszystkie dostępne adresy wirtualne.

Powodem, dla którego zabijasz OOM, jest przydzielenie pamięci dla HighMemstrefy z 0 stronami dostępnymi. Biorąc pod uwagę, że moduł obsługi pamięci nie ma absolutnie żadnego powodu, aby zapewnić, że ta strefa ma strony do wykorzystania przez zamianę, zabijanie innych procesów lub inną sztuczkę, OOM-killer po prostu ją zabija.

Uważam, że jest to spowodowane balonowaniem maszyny wirtualnej hosta podczas uruchamiania. W systemach KVM można ustawić dwie wartości.

  • Bieżąca pamięć.
  • Dostępna pamięć.

Działa to w ten sposób, że można dodać pamięć na serwerze do dostępnej pamięci. Wasz system otrzymuje aktualną pamięć.

Po uruchomieniu maszyny wirtualnej KVM rozpoczyna się od maksymalnej możliwej do przydzielenia pamięci (dostępnej pamięci). Stopniowo podczas fazy rozruchu systemu KVM odzyskuje tę pamięć za pomocą balonowania, pozostawiając zamiast tego aktualne ustawienie pamięci.

Moim przekonaniem jest to, co się tutaj wydarzyło. Linode pozwala rozszerzyć pamięć, dając znacznie więcej na starcie systemu.

Oznacza to, że istnieje Normal/HighMemstrefa na początku cyklu życia systemu. Kiedy hiperwizor przesuwa balon, normalna strefa słusznie znika z menedżera pamięci. Podejrzewam jednak, że ustawienie flagi, czy wspomniana strefa jest dostępna do alokacji, nie jest usuwane, kiedy powinna. To prowadzi jądro do próby alokacji ze strefy, która nie istnieje.

Jeśli chodzi o rozwiązanie tego problemu, masz dwie opcje.

  1. Pokaż to na listach mailingowych jądra, aby zobaczyć, czy to naprawdę jest błąd, oczekiwane zachowanie lub nic wspólnego z tym, co mówię.

  2. Żądaj, aby linode ustawiło „dostępną pamięć” w systemie na takie samo przypisanie 1GiB jak „bieżąca pamięć”. W ten sposób system nigdy się nie balonuje i nigdy nie otrzymuje strefy normalnej przy starcie, utrzymując flagę w czystości. Życzę im powodzenia!

Powinieneś być w stanie przetestować, że tak jest, ustawiając własną maszynę wirtualną w ustawieniu KVM dostępnym dla 6GiB, bieżącym dla 1GiB i uruchamiając test przy użyciu tego samego jądra, aby sprawdzić, czy wystąpi powyższe zachowanie. Jeśli tak, zmień ustawienie „dostępne” na równe prądowi 1 GiB i powtórz test.

Robię tutaj wiele wykształconych domysłów i czytam między wierszami, aby uzyskać tę odpowiedź, ale to, co mówię, wydaje się pasować do już zarysowanych faktów.

Sugeruję przetestowanie mojej hipotezy i poinformowanie nas wszystkich o wyniku.

Matthew Ife
źródło
4
To dokładna (i dobrze wyjaśniona) odpowiedź!
Olivier Dulac,
2
Tak, doskonała odpowiedź ... Znacznie bardziej pomocne niż komentarze ludzi, że „OP powinien ślepo ufać komunikatom jądra” bez prób wyjaśnienia, dlaczego dostępna przestrzeń wymiany nie jest używana.
Michael Martinez,
31

Aby odpowiedzieć na główne pytanie, użyj oom_score_adj(jądro> = 2.6.36) lub dla wcześniejszych jąder (> = 2.6.11) oom_adj, zobacz man proc

/ proc / [pid] / oom_score_adj (od Linuksa 2.6.36) Ten plik może być użyty do dostosowania heurystyki złej użytej do wyboru, który proces zostanie zabity w warunkach braku pamięci ...

/ proc / [pid] / oom_adj (od Linuksa 2.6.11) Za pomocą tego pliku można dostosować wynik używany do wyboru, który proces powinien zostać zabity w sytuacji braku pamięci (OOM) ...

Jest o wiele więcej do przeczytania, ale ustawienie oom_score_adj na -1000 lub oom_adj na -17 pozwoli osiągnąć to, czego chcesz.

Problem w tym, że coś innego zostanie zabite. Być może lepiej byłoby ustalić, dlaczego wywoływana jest OOM i sobie z tym poradzić.

user9517 obsługuje GoFundMonica
źródło
4
+1 za „rozwiązać podstawowy problem”. Czy to możliwe, że obraźliwe oprogramowanie (lub coś innego) właśnie próbowało wyłudzić dużą część rdzenia? To prośby o więcej pamięci, które wprowadzą rzeczy na terytorium alarmowe, które mają tendencję do wyzwalania zabójcy OOM.
MadHatter obsługuje Monikę
11
@Coder: Programiści jądra Linuksa i jądro Linuksa wyraźnie wiedzą więcej niż ty. Twój proces został zabity, ponieważ (pomimo twoich protestów) brakowało pamięci. Jeśli uważasz, że jest to nieprawidłowe, zgłoś błąd . Jeśli nie masz zamiaru słuchać tego, co mają do powiedzenia osoby o jasnej wiedzy, być może powinieneś zapłacić za swoje wsparcie, ponieważ porady są warte tego, za co płacisz. Porada nie będzie inna, ale zapłacisz za nią, więc docenisz ją bardziej.
user9517 obsługuje GoFundMonica
4
@Coder Niestety nie jestem programistą. Po prostu uwięziono między dwiema możliwościami: że jądro nie wie, jak korzystać z VM, i że programista popełnił błąd, wiem, na które są moje pieniądze.
MadHatter obsługuje Monikę
1
@coder Jestem „kimś”. Daj mi znać, jak się skontaktować.
Matthew Ife
1
@MadHatter z działającego tysiąca systemów linuksowych mogę powiedzieć: NIE jest tak, że można założyć, że nie ma żadnych problemów z zarządzaniem pamięcią ani żadną inną częścią jądra. To nie jest jak wysokiej klasy platformy UNIX i zwykle, gdy wszystko działa dobrze to nie rozsądne, aby wziąć po obu stronach w jakiejkolwiek dogmatycznej sposób.
Florian Heigl
12

Kilka przemyśleń (z moich komentarzy powyżej) i linki do ciekawych informacji na temat twojej sytuacji:

Olivier Dulac
źródło
1
oom_adj działa tylko na starsze jądra, nowsze używają oom_score_adj.
user9517 obsługuje GoFundMonica
zrzeczenie się odpowiedzialności: Nie mogę podać więcej szczegółowych informacji niż kilka linków powyżej, ponieważ w tej chwili nie mogę uzyskać dostępu do systemu linux ... i jest tak wiele rzeczy do sprawdzenia. Może ktoś wkroczy i dostarczy ładne procedury krok po kroku ... (odpowiedź na błąd serwera, ostatni z linku „dobre czytanie” w mojej odpowiedzi, była taka i jest niesamowitą lekturą.)
Olivier Dulac
6

oprócz wspomnianego oom_score_adjzwiększenia dla omawianego procesu (co prawdopodobnie nie pomoże wiele - sprawiłoby, że PIERWSZE zabiłoby ten proces, ale ponieważ jest to system intensywnie korzystający z pamięci, prawdopodobnie nie odzyska się, dopóki nie zostanie ostatecznie zabity), oto kilka pomysłów do ulepszenia:

  • jeśli ustawisz vm.overcommit_memory=2, również dostosuj vm.overcommit_ratiodo może 90 (alternatywnie, ustaw vm.overcommit_memory=0- patrz dokumentacja nadkomitowania jądra )
  • zwiększać vm.min_free_kbytes , aby zawsze zachować wolną fizyczną pamięć RAM, a tym samym zmniejszyć szanse, że OOM będzie musiał coś zabić (ale nie przesadzaj, ponieważ OOM natychmiast).
  • wzrost vm.swappinessdo 100 (aby łatwiej zamieniać jądro )

Pamiętaj, że jeśli masz za mało pamięci, aby wykonać dane zadanie, nawet jeśli nie robisz OOM, może on (lub nie) stać się BARDZO powolny - pół godziny pracy (w systemie z wystarczającą ilością pamięci RAM) może z łatwością zająć kilka tygodni ( po zastąpieniu pamięci RAM zamienianiem) w ekstremalnych przypadkach, a nawet zawiesić całą maszynę wirtualną. Dzieje się tak zwłaszcza w przypadku wymiany na klasycznych dyskach obrotowych (w przeciwieństwie do dysków SSD) z powodu ogromnych losowych odczytów / zapisów, które są na nich bardzo drogie.

Matija Nalis
źródło
3

Spróbowałbym włączyć overcommit i sprawdzić, czy to pomoże. Wygląda na to, że proces zawiedzie w forkwywołaniu, które wymaga tyle pamięci wirtualnej, ile miał proces początkowy. overcommit_memory=2nie czyni twojego procesu odpornym na zabójcę OOM, po prostu zapobiega jego uruchomieniu przez przydzielenie zbyt dużej ilości. Inne procesy mogą powodować niepowiązane błędy alokacji (np. Uzyskanie ciągłego bloku pamięci), które nadal wyzwalają zabójcę OOM i usuwają proces.

Alternatywnie (i bardziej na temat), jak sugeruje kilka komentarzy, kup więcej pamięci RAM.

Dmitrij Grigoriew
źródło
0

Krótka historia - wypróbuj inną wersję jądra. Mam system, który pokazał błędy OOM w jądrach 4.2.0-x i 4.4.0-x, ale nie w wersji 3.19.0-x.

Długa historia: (nie za długa!) Mam tu wciąż Compaq DC5000 - obecnie z 512 MB pamięci RAM (i część tej, jak 32-128 MB, na wideo na pokładzie ..) NFS, mam do niego podłączony monitor, więc od czasu do czasu się loguję (Ubuntu Classic, brak Unity).

Przez Ubuntu HWE przez długi czas działałem jądro 3.19.x; skończyłoby to jak 200-300 MB rzeczy, ale najwyraźniej były to rzeczy nieużywane, nie byłoby żadnej zamiany z tego, że musiałbym zamienić je później, o ile mogłem powiedzieć.

Jądro 4.2.0-x, a teraz jądro 4.4.0-x, mogę uruchomić gruby zapis NFS, tylko 220 MB do wymiany (tj. 1,3 GB za darmo), i zacznie zabijać OOM. Nie twierdzę, że jest to błąd jądra lub „problem ze strojeniem” (jak rezerwa 64 MB, która normalnie jest w porządku, ale zbyt wysoka w systemie około 400 MB?)

Bez szacunku dla tych, którzy mówią, że to w jakiś sposób łamie tylko dlatego, że oczekuje zamiany; z całym szacunkiem, że się mylisz. Nie będzie to szybkie, ale w kilku systemach 512 MB-1 GB korzystałem z wymiany 1 lub 2 GB. Oczywiście, niektóre rodzaje oprogramowania mlock to trochę pamięci RAM, ale w moim przypadku (ponieważ używam tego samego oprogramowania tylko na innym jądrze), oczywiście tak nie jest.

użytkownik367995
źródło