Я столкнулся с этой проблемой, когда каждые несколько дней один из моих Java-серверов просто умирает. Чтобы понять почему, я побежал cat /var/log/syslog
который производит:
Sep 21 06:36:24 ip-172-31-42-5 systemd-timesyncd[16235]: Network configuration changed, trying to establish connection.
Sep 21 06:36:24 ip-172-31-42-5 systemd-timesyncd[16235]: Synchronized to time server 91.189.91.157:123 (ntp.ubuntu.com).
Sep 21 06:46:45 ip-172-31-42-5 systemd[1]: Starting Daily apt upgrade and clean activities...
Sep 21 06:47:35 ip-172-31-42-5 kernel: [5731409.370359] systemd-resolve invoked oom-killer: gfp_mask=0x14200ca(GFP_HIGHUSER_MOVABLE), nodemask=(null), order=0, oom_score_adj=0
...(skipping a bunch) ...
Sep 21 06:47:35 ip-172-31-42-5 kernel: [5731409.370580] Out of memory: Kill process 28251 (java) score 368 or sacrifice child
Sep 21 06:47:35 ip-172-31-42-5 kernel: [5731409.374244] Killed process 28251 (java) total-vm:2613628kB, anon-rss:178048kB, file-rss:0kB, shmem-rss:0kB
Sep 21 06:47:35 ip-172-31-42-5 kernel: [5731409.403233] oom_reaper: reaped process 28251 (java), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB
После прочтения эта почта, Я узнал, что oom_reaper уничтожит самый большой процесс, использующий память, если ЛЮБОЙ процесс попытается выделить слишком много памяти. Итак, я предполагаю, что systemd-resolve пытается запросить невероятный объем памяти, а затем жнец убивает мой плохой java-процесс.
Я мог бы обойти это, установив vm.oom_kill_allocating_task
как предлагается в приведенной выше ссылке, но я пытаюсь выяснить основную причину того, почему systemd-resolve пытается запросить такой абсурдный объем памяти. Кто-нибудь знает, в чем коренная проблема?
изменить: когда Java-сервер работает, использование памяти составляет только 234M / 460M