Что убило мой процесс и почему?
мое приложение работает как фоновый процесс на Linux. В настоящее время он запускается в командной строке в окне терминала.
недавно пользователь некоторое время выполнял приложение, и оно таинственно умерло. Текст:
убил
был на терминале. Это случилось два раза. Я спросил, Если кто-то на другом терминале использовал команду kill, чтобы убить процесс? Нет.
при каких условиях будет решать Linux чтобы убить мой процесс? Я считаю, что оболочка отображается "убита", потому что процесс умер после получения сигнала kill(9). Если Linux отправил сигнал убийства, должно ли быть сообщение в системном журнале где-то, что объясняет, почему он был убит?
12 ответов:
Если пользователь или системный администратор не убил программу, возможно, ядро. Ядро убьет процесс только в исключительных обстоятельствах, таких как крайнее истощение ресурсов (думаю, что mem+swap exhaustion).
попробуй:
dmesg -T| grep -E -i -B100 'killed process'здесь
-B100обозначает количество строк до того, как произошло убийство.пропустить - T на Mac OS.
Это выглядит как хорошая статья на эту тему: Укрощение убийцы ООМ.
суть в том, что Linux overcommits память. Когда процесс запрашивает больше места, Linux предоставит ему это пространство, даже если оно будет востребовано другим процессом, исходя из предположения, что никто на самом деле не использует всю память, которую они просят. Процесс получит исключительное использование выделенной памяти, когда он фактически использует ее, а не когда он просит об этом. Это делает распределение быстро, и может позволить вам "обмануть" и выделить больше памяти, чем у вас есть на самом деле. Однако, как только процессы начинают использовать эту память, Linux может понять, что он был слишком щедр в выделении памяти, которой у него нет, и ему придется убить процесс, чтобы освободить некоторые из них. Процесс, который должен быть убит, основан на оценке, учитывающей время выполнения (длительные процессы безопаснее), использование памяти (жадные процессы менее безопасны) и несколько других факторов, включая значение, которое вы можете настроить, чтобы сделать процесс с меньшей вероятностью будет убит. Все это описано в статье гораздо более подробно.
Edit: и вот еще одна статья Это довольно хорошо объясняет, как выбирается процесс (аннотированный некоторыми примерами кода ядра). Самое замечательное в этом то, что он включает в себя некоторые комментарии к мышление за различные
badness()правила.
позвольте мне сначала объяснить, когда и почему вызывается OOMKiller?
скажем, у вас есть 512 ОЗУ + 1 ГБ памяти подкачки. Поэтому в теории, ваш процессор имеет доступ к общей сложности 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:)
Это Linux out of memory manager (OOM). Ваш процесс был выбран из-за 'зло' - сочетание новизны, резидентного размера (используемой памяти, а не только выделенной) и других факторов.
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
Как заявили dwc и Адам Яскевич, виновником, скорее всего, является убийца ООМ. Однако следующий вопрос: как мне это предотвратить?
есть несколько способов:
- дайте вашей системе больше оперативной памяти, если вы можете (легко, если его VM)
- убедитесь, что убийца OOM выбирает другой процесс.
- отключить OOM Killer
- выберите дистрибутив Linux, который поставляется с отключенным убийцей OOM.
I найдено (2), чтобы быть особенно легко реализовать, благодаря в этой статье.
инструмент, такой как 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блок в этом скрипте может быть скорректирован по вкусу или устранен для отслеживания общесистемного сигнального трафика. Причины могут быть дополнительно изолированы путем сбора обратных следов (добавитьprint_backtrace()и/илиprint_ubacktrace()на зонд, для ядра и пользовательского пространства - соответственно).
The модуль PAM для ограничения ресурсов вызвал именно те результаты, которые вы описали: мой процесс таинственно умер с текстом убил в окне консоли. Нет выхода журнала, ни в syslog, ни в Керн.журнал. Элемент top программа помогла мне обнаружить, что ровно через одну минуту использования процессора мой процесс убивается.
в среде lsf (интерактивной или иной), если приложение превышает использование памяти за некоторым заданным порогом администраторами в очереди или запросом ресурсов в submit to the queue, процессы будут убиты, чтобы другие пользователи не стали жертвой потенциального побега. Он не всегда отправляет электронное письмо, когда он это делает, в зависимости от того, как его настроить.
одним из решений в этом случае является поиск очереди с большими ресурсами или определение больших требований к ресурсам в подчинение.
вы также можете просмотреть
man ulimitхотя я не помню
ulimitв результатеKilledпрошло некоторое время с тех пор, как мне это было нужно.
У нас были повторяющиеся проблемы под Linux на сайте клиента (Red Hat, я думаю), с OOMKiller (out-of-memory killer), убивающим как наше основное приложение (т. е. причину существования сервера), так и процессы базы данных.
в каждом случае OOMKiller просто решил, что процессы использовали много ресурсов... машина даже не собиралась отказывать из-за нехватки ресурсов. Ни приложение, ни его база данных не имеют проблем с утечками памяти (или любой другой утечка ресурсов.)
Я не эксперт Linux, но я скорее собрал его алгоритм для принятия решения, когда убить что-то и что убить сложно. Кроме того, мне сказали (я не могу говорить о точности этого), что OOMKiller запекается в ядре, и вы не можете просто не запускать его.
пользователь имеет возможность убивать свои собственные программы, используя kill или Control+C, но у меня создается впечатление, что это не то, что произошло, и что пользователь пожаловался вам.
root имеет возможность убивать программы, конечно, но если у кого-то есть root на вашей машине и убивает вещи, у вас есть большие проблемы.
Если вы не являетесь системным администратором, системный администратор может настроить квоты на использование ЦП, ОЗУ, ОРТ-диска и автоматически убивает процессы, которые превышают их.
кроме этих догадок, я не уверен, что без дополнительной информации о программе.
в последнее время я столкнулся с этой проблемой. Наконец, я обнаружил, что мои процессы были убиты сразу после того, как обновление Opensuse zypper было вызвано автоматически. Чтобы отключить обновление zypper, я решил свою проблему.
Comments