Что убило мой процесс и почему?

Мое приложение работает в Linux как фоновый процесс. В настоящее время он запускается из командной строки в окне терминала.

Недавно пользователь некоторое время исполнял приложение, и оно загадочным образом умерло. Текст:

убитый

был на терминале. Это случилось два раза. Я спросил, использует ли кто-то в другом Терминале команду kill для уничтожения процесса? Нет.

При каких условиях Linux решит убить мой процесс? Я полагаю, что оболочка показала "kill", потому что процесс умер после получения сигнала kill (9). Если Linux отправил сигнал уничтожения, должно ли быть какое-то сообщение в системном журнале, объясняющее, почему оно было убито?

Ответ 1

Если пользователь или системный администратор не убили программу, она может иметь ядро. Ядро будет только убивать процесс в исключительных обстоятельствах, таких как экстремальный ресурс голодания (думаю, mem + смену исчерпания).

Ответ 2

Пытаться:

dmesg -T| grep -E -i -B100 'killed process'

Где -B100 обозначает количество строк до того, как произошло уничтожение.

Пропустить -T в Mac OS.

Ответ 3

Это выглядит как хорошая статья на эту тему: Укрощение убийцы OOM.

Суть в том, что Linux переназначает память. Когда процесс запрашивает больше места, Linux предоставит ему это пространство, даже если оно заявлено другим процессом, исходя из предположения, что никто фактически не использует всю память, которую они запрашивают. Этот процесс получит эксклюзивное использование выделенной памяти, когда он действительно использует его, а не когда он его запрашивает. Это позволяет быстро распределить ресурсы и может позволить вам "обмануть" и выделить больше памяти, чем есть на самом деле. Однако, как только процессы начнут использовать эту память, Linux может понять, что она слишком щедра в распределении памяти, которой она не располагает, и ей придется убить процесс, чтобы освободить его. Процесс, который должен быть убит, основан на оценке с учетом времени выполнения (длительные процессы более безопасны), использование памяти (жадные процессы менее безопасны) и несколько других факторов, включая значение, которое вы можете настроить, чтобы сделать процесс меньше вероятно, будет убит. Все это описано в статье намного подробнее.

Изменить: И здесь другая статья, которая очень хорошо объясняет, как выбирается процесс (аннотируется некоторыми примерами кода ядра). Самое замечательное в этом состоит в том, что он содержит некоторые комментарии к рассуждения за различными правилами badness().

Ответ 4

Позвольте мне сначала объяснить, когда и почему OOMKiller вызывается?

Скажем, у вас есть 512 RAM + 1GB Swap-памяти. Теоретически, ваш процессор имеет доступ к общей сумме 1,5 ГБ виртуальной памяти.

Теперь, в течение некоторого времени все работает нормально в 1,5 ГБ общей памяти. Но внезапно (или постепенно) ваша система начала потреблять все больше и больше памяти, и она достигла точки в 95% от общей используемой памяти.

Теперь скажите, что любой процесс запросил большую часть памяти из ядра. Ядро проверяет наличие доступной памяти и обнаруживает, что он не может выделить ваш процесс больше памяти. Поэтому он попытается освободить некоторую память, вызывающую/вызывающую OOMKiller (http://linux-mm.org/OOM).

OOMKiller имеет собственный алгоритм для оценки ранга для каждого процесса. Обычно этот процесс использует больше памяти, чтобы жертва была убита.

Где можно найти журналы OOMKiller?

Обычно в каталоге /var/log. Или/var/log/kern.log или /var/log/dmesg

Надеюсь, это поможет вам.

Некоторые типичные решения:

  • Увеличить память (не своп)
  • Найдите утечки памяти в вашей программе и исправьте их.
  • Ограничить память, которую может потреблять любой процесс (например, JVM-память может быть ограничена с помощью JAVA_OPTS)
  • Смотрите журналы и google:)

Ответ 5

Это Linux менеджер памяти (OOM). Ваш процесс был выбран из-за " badness" - сочетание недавнего, резидентного размера (используемая память, а не просто выделенная) и других факторов.

sudo journalctl -xb

Вы увидите сообщение типа:

Jul 20 11:05:00 someapp kernel: Mem-Info:
Jul 20 11:05:00 someapp kernel: Node 0 DMA per-cpu:
Jul 20 11:05:00 someapp kernel: CPU    0: hi:    0, btch:   1 usd:   0
Jul 20 11:05:00 someapp kernel: Node 0 DMA32 per-cpu:
Jul 20 11:05:00 someapp kernel: CPU    0: hi:  186, btch:  31 usd:  30
Jul 20 11:05:00 someapp kernel: active_anon:206043 inactive_anon:6347 isolated_anon:0
                                    active_file:722 inactive_file:4126 isolated_file:0
                                    unevictable:0 dirty:5 writeback:0 unstable:0
                                    free:12202 slab_reclaimable:3849 slab_unreclaimable:14574
                                    mapped:792 shmem:12802 pagetables:1651 bounce:0
                                    free_cma:0
Jul 20 11:05:00 someapp kernel: Node 0 DMA free:4576kB min:708kB low:884kB high:1060kB active_anon:10012kB inactive_anon:488kB active_file:4kB inactive_file:4kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present
Jul 20 11:05:00 someapp kernel: lowmem_reserve[]: 0 968 968 968
Jul 20 11:05:00 someapp kernel: Node 0 DMA32 free:44232kB min:44344kB low:55428kB high:66516kB active_anon:814160kB inactive_anon:24900kB active_file:2884kB inactive_file:16500kB unevictable:0kB isolated(anon):0kB isolated
Jul 20 11:05:00 someapp kernel: lowmem_reserve[]: 0 0 0 0
Jul 20 11:05:00 someapp kernel: Node 0 DMA: 17*4kB (UEM) 22*8kB (UEM) 15*16kB (UEM) 12*32kB (UEM) 8*64kB (E) 9*128kB (UEM) 2*256kB (UE) 3*512kB (UM) 0*1024kB 0*2048kB 0*4096kB = 4580kB
Jul 20 11:05:00 someapp kernel: Node 0 DMA32: 216*4kB (UE) 601*8kB (UE) 448*16kB (UE) 311*32kB (UEM) 135*64kB (UEM) 74*128kB (UEM) 5*256kB (EM) 0*512kB 0*1024kB 1*2048kB (R) 0*4096kB = 44232kB
Jul 20 11:05:00 someapp kernel: Node 0 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=2048kB
Jul 20 11:05:00 someapp kernel: 17656 total pagecache pages
Jul 20 11:05:00 someapp kernel: 0 pages in swap cache
Jul 20 11:05:00 someapp kernel: Swap cache stats: add 0, delete 0, find 0/0
Jul 20 11:05:00 someapp kernel: Free swap  = 0kB
Jul 20 11:05:00 someapp kernel: Total swap = 0kB
Jul 20 11:05:00 someapp kernel: 262141 pages RAM
Jul 20 11:05:00 someapp kernel: 7645 pages reserved
Jul 20 11:05:00 someapp kernel: 264073 pages shared
Jul 20 11:05:00 someapp kernel: 240240 pages non-shared
Jul 20 11:05:00 someapp kernel: [ pid ]   uid  tgid total_vm      rss nr_ptes swapents oom_score_adj name
Jul 20 11:05:00 someapp kernel: [  241]     0   241    13581     1610      26        0             0 systemd-journal
Jul 20 11:05:00 someapp kernel: [  246]     0   246    10494      133      22        0         -1000 systemd-udevd
Jul 20 11:05:00 someapp kernel: [  264]     0   264    29174      121      26        0         -1000 auditd
Jul 20 11:05:00 someapp kernel: [  342]     0   342    94449      466      67        0             0 NetworkManager
Jul 20 11:05:00 someapp kernel: [  346]     0   346   137495     3125      88        0             0 tuned
Jul 20 11:05:00 someapp kernel: [  348]     0   348    79595      726      60        0             0 rsyslogd
Jul 20 11:05:00 someapp kernel: [  353]    70   353     6986       72      19        0             0 avahi-daemon
Jul 20 11:05:00 someapp kernel: [  362]    70   362     6986       58      18        0             0 avahi-daemon
Jul 20 11:05:00 someapp kernel: [  378]     0   378     1621       25       8        0             0 iprinit
Jul 20 11:05:00 someapp kernel: [  380]     0   380     1621       26       9        0             0 iprupdate
Jul 20 11:05:00 someapp kernel: [  384]    81   384     6676      142      18        0          -900 dbus-daemon
Jul 20 11:05:00 someapp kernel: [  385]     0   385     8671       83      21        0             0 systemd-logind
Jul 20 11:05:00 someapp kernel: [  386]     0   386    31573      153      15        0             0 crond
Jul 20 11:05:00 someapp kernel: [  391]   999   391   128531     2440      48        0             0 polkitd
Jul 20 11:05:00 someapp kernel: [  400]     0   400     9781       23       8        0             0 iprdump
Jul 20 11:05:00 someapp kernel: [  419]     0   419    27501       32      10        0             0 agetty
Jul 20 11:05:00 someapp kernel: [  855]     0   855    22883      258      43        0             0 master
Jul 20 11:05:00 someapp kernel: [  862]    89   862    22926      254      44        0             0 qmgr
Jul 20 11:05:00 someapp kernel: [23631]     0 23631    20698      211      43        0         -1000 sshd
Jul 20 11:05:00 someapp kernel: [12884]     0 12884    81885     3754      80        0             0 firewalld
Jul 20 11:05:00 someapp kernel: [18130]     0 18130    33359      291      65        0             0 sshd
Jul 20 11:05:00 someapp kernel: [18132]  1000 18132    33791      748      64        0             0 sshd
Jul 20 11:05:00 someapp kernel: [18133]  1000 18133    28867      122      13        0             0 bash
Jul 20 11:05:00 someapp kernel: [18428]    99 18428   208627    42909     151        0             0 node
Jul 20 11:05:00 someapp kernel: [18486]    89 18486    22909      250      46        0             0 pickup
Jul 20 11:05:00 someapp kernel: [18515]  1000 18515   352905   141851     470        0             0 npm
Jul 20 11:05:00 someapp kernel: [18520]     0 18520    33359      291      66        0             0 sshd
Jul 20 11:05:00 someapp kernel: [18522]  1000 18522    33359      294      64        0             0 sshd
Jul 20 11:05:00 someapp kernel: [18523]  1000 18523    28866      115      12        0             0 bash
Jul 20 11:05:00 someapp kernel: Out of memory: Kill process 18515 (npm) score 559 or sacrifice child
Jul 20 11:05:00 someapp kernel: Killed process 18515 (npm) total-vm:1411620kB, anon-rss:567404kB, file-rss:0kB

Ответ 6

Как заявили dwc и Adam Jaskiewicz, виновником, скорее всего, является OOM Killer. Однако следующий вопрос, который следует ниже: Как это предотвратить?

Существует несколько способов:

  • Дайте вашей системе больше оперативной памяти, если сможете (легко, если ее VM)
  • Убедитесь, что убийца OOM выбирает другой процесс.
  • Отключить OOM Killer
  • Выберите дистрибутив Linux, который отключен с отключенным OOM Killer.

Я нашел (2), что особенно легко реализовать, благодаря этой статье.

Ответ 7

Модуль PAM для ограничения ресурсов вызвал именно те результаты, которые вы описали: Мой процесс умер таинственным образом с текстом, убитым в окне консоли. Нет выхода журнала, ни в syslog, ни в kern.log. Программа top помогла мне обнаружить, что ровно через минуту использования процессора мой процесс убит.

Ответ 8

Инструмент, такой как systemtap (или трассировщик), может контролировать логику передачи сигналов ядра и отчет. например, https://sourceware.org/systemtap/examples/process/sigmon.stp

# stap .../sigmon.stp -x 31994 SIGKILL
   SPID     SNAME            RPID  RNAME            SIGNUM SIGNAME
   5609     bash             31994 find             9      SIGKILL

Блок фильтрации if в том, что script можно настроить по вкусу или устранить для отслеживания общесистемного трафика сигналов. Причины могут быть дополнительно изолированы путем сбора обратных трасс (добавьте print_backtrace() и/или print_ubacktrace() к зонду, для ядра и пользовательского пространства - соответственно).

Ответ 9

В среде lsf (в интерактивном режиме или в противном случае), если приложение превышает использование памяти за пределами определенного порогового значения администраторами в очереди или запросом ресурса в представлении очереди, процессы будут убиты, чтобы другие пользователи не стали жертвами к потенциальному бегу. Он не всегда отправляет электронное письмо, когда оно это делает, в зависимости от его настройки.

Одним из решений в этом случае является поиск очереди с большими ресурсами или определение больших требований к ресурсам в представлении.

Вы также можете просмотреть man ulimit

Хотя я не помню ulimit, что привело к Killed, это было некоторое время, поскольку мне это нужно.

Ответ 10

У нас возникали проблемы с Linux на клиентском сайте (думаю, я думаю, Red Hat) с OOMKiller (убийцей без памяти), убивающим как наше основное приложение (то есть причину существования сервера), так и процессы базы данных,

В каждом случае OOMKiller просто решил, что процессы используют много ресурсов... машина не собиралась терпеть неудачу из-за нехватки ресурсов. Ни приложение, ни база данных не имеют проблем с утечками памяти (или любой другой утечкой ресурсов).

Я не эксперт по Linux, но я скорее собирал алгоритм для решения, когда что-то убивать, а что убивать сложно. Кроме того, мне сказали (я не могу сказать, насколько это точно), что OOMKiller запекается в ядро, и вы не можете просто не запускать его.

Ответ 11

В моем случае это происходило с работником очереди Laravel. В системных журналах не было упоминаний о каких-либо убийствах, поэтому я посмотрел дальше, и оказалось, что рабочий в основном убивал себя из-за задания, которое превысило лимит памяти (по умолчанию установлено 128M).

Запуск работника очереди с --timeout=600 и --memory=1024 проблему для меня.

Ответ 12

Пользователь имеет возможность убивать свои собственные программы, используя kill или Control + C, но у меня создается впечатление, что не то, что произошло, и что пользователь пожаловался вам.

У root есть возможность, конечно, убивать программы, но если у кого-то есть root на вашей машине и у вас есть проблемы с убийством, у вас больше проблем.

Если вы не являетесь системным администратором, sysadmin может установить квоты на использование CPU, RAM, ort и автоматическое уничтожение процессов, превышающих их.

Кроме этих догадок, я не уверен, что больше не будет информации о программе.

Ответ 13

В последнее время я столкнулся с этой проблемой. Наконец, я обнаружил, что мои процессы были убиты сразу после того, как обновление Opensuse zypper было вызвано автоматически. Чтобы отключить обновление zypper, я решил проблему.