Мое приложение работает в Linux как фоновый процесс. В настоящее время он запускается из командной строки в окне терминала.
Недавно пользователь некоторое время выполнял приложение, и оно загадочным образом умерло. Текст:
убитый
был на терминале. Это случилось два раза. Я спросил, использует ли кто-то в другом Терминале команду kill для уничтожения процесса? Нет.
При каких условиях Linux решит убить мой процесс? Я полагаю, что оболочка показала «kill», потому что процесс умер после получения сигнала kill (9). Если Linux отправил сигнал уничтожения, должно ли быть какое-то сообщение в системном журнале, объясняющее, почему оно было убито?
/var/log/messages
(3) Оболочка, под которой запущен процесс, который является процессом, который печатаетKilled
уведомление, когда состояние выхода изwaitpid(2)
указывает, что дочерний процесс умер от сигнала 9./var/log/syslog
Ответы:
Если пользователь или системный администратор не убили программу, возможно, ядро. Ядро будет убивать процесс только в исключительных обстоятельствах, таких как чрезвычайное истощение ресурсов (например, mem + swap исчерпание).
источник
dmesg
чтобы просмотреть журнал ядра: здесь я обнаружил, что процессы Python, убитые ядром из-за чрезмерного потребления виртуальной памяти.Пытаться:
Где
-B100
обозначает количество строк до того, как произошло уничтожение.Опустить -T в Mac OS.
источник
info egrep
: "egrep - это то же самое, что и grep -E. ... Прямой вызов как egrep или fgrep устарел"'killed process'
вы можете просто использоватьgrep
вместоegrep
других изменений. Для более сложного паттерна вы должны заменить заменить, например,egrep -i -B100 'foo|ba[rz]'
наgrep -E -i -B100 'foo|ba[rz]'
. Этот Q & A дает больше деталей.dmesg -T
для того, чтобы получить читаемые метки времениЭто похоже на хорошую статью на эту тему: Укрощение убийцы ООМ .
Суть в том, что Linux преодолеваетПамять. Когда процесс запрашивает больше места, Linux предоставит ему это пространство, даже если это запрашивается другим процессом, при условии, что никто фактически не использует всю запрашиваемую им память. Процесс получит исключительное использование памяти, которую он выделил, когда он фактически использует ее, а не когда он запрашивает ее. Это делает распределение быстрым и может позволить вам «обмануть» и выделить больше памяти, чем у вас есть на самом деле. Однако, как только процессы начнут использовать эту память, Linux может понять, что она слишком щедра в распределении памяти, которой у нее нет, и ей придется убить процесс, чтобы освободить его. Уничтожаемый процесс основан на оценке, учитывающей время выполнения (длительные процессы безопаснее), использование памяти (жадные процессы менее безопасны) и некоторые другие факторы, включая значение, которое вы можете настроить, чтобы сделать процесс менее вероятным уничтожение. Все это описано в статье более подробно.
Редактировать: И вот еще одна статья, которая довольно хорошо объясняет, как выбирается процесс (аннотировано некоторыми примерами кода ядра). Самое замечательное в этом то, что он включает в себя некоторые комментарии к обоснованию различных
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
Надеюсь, что это поможет вам.
Некоторые типичные решения:
источник
Это Linux из нехватки памяти (OOM) . Ваш процесс был выбран из - за « вредность » - сочетание Давности, житель размера (память используется, а не просто выделяется) и другие факторы.
Вы увидите сообщение вроде:
источник
Как заявили dwc и Адам Яскевич, виновник, скорее всего, убийца ООМ. Тем не менее, следующий вопрос, который следует: как я могу предотвратить это?
Есть несколько способов:
Благодаря этой статье я нашел, что (2) особенно легко реализовать .
источник
Модуль PAM для ограничения ресурсов вызвал именно те результаты, которые вы описали: мой процесс загадочным образом заглох с текстом « Killed» в окне консоли. Нет вывода журнала, ни в системном журнале, ни в kern.log . Верхняя программа помогла мне узнать , что именно после того, как одна минута использования процессора мой процесс погибает.
источник
Такой инструмент, как systemtap (или трассировщик), может контролировать логику передачи сигналов ядра и создавать отчеты. например, https://sourceware.org/systemtap/examples/process/sigmon.stp
Блок фильтрации
if
в этом сценарии может быть настроен по вкусу или исключен для отслеживания общесистемного сигнального трафика. Причины могут быть дополнительно изолированы путем сбора обратных следов (добавьте aprint_backtrace()
и / илиprint_ubacktrace()
к зонду для ядра и пользовательского пространства соответственно).источник
В среде lsf (интерактивной или иной), если приложение превышает использование памяти сверх некоторого заданного порога администраторами в очереди или запросом ресурсов при отправке в очередь, процессы будут убиты, поэтому другие пользователи не станут жертвами потенциального убегай. При этом он не всегда отправляет электронное письмо, в зависимости от того, как он настроен.
Одним из решений в этом случае является поиск очереди с большими ресурсами или определение больших требований к ресурсам в представлении.
Вы также можете рассмотреть
man ulimit
Хотя я не помню , в
ulimit
результате чегоKilled
его было некоторое время , так как я нуждался в этом.источник
У нас периодически возникали проблемы под Linux на сайте заказчика (я думаю, в Red Hat), когда OOMKiller (убийца нехватки памяти) убивал как наше основное приложение (т. Е. Причину существования сервера), так и процессы базы данных.
В каждом случае OOMKiller просто решал, что процессы используют слишком много ресурсов ... машина даже не собирается выходить из строя из-за нехватки ресурсов. Ни у приложения, ни у его базы данных нет проблем с утечками памяти (или любой другой утечкой ресурсов).
Я не эксперт по Linux, но скорее собрал его алгоритм для решения, когда убивать что-то, а что убивать - это сложно. Кроме того, мне сказали (я не могу говорить о точности этого), что OOMKiller запекается в ядре, и вы просто не можете его запустить.
источник
echo "2" > /proc/sys/vm/overcommit_memory
sudo echo "2" > /proc/sys/vm/overcommit_memory
/ proc / sys / vm / overcommit_memory: В доступе отказаноecho 2 | sudo tee /proc/sys/vm/overcommit_memory
В моем случае это происходило с работником очереди Laravel. В системных журналах не было упоминаний о каких-либо убийствах, поэтому я посмотрел дальше, и оказалось, что рабочий в основном убивал себя из-за задания, которое превысило ограничение памяти (которое по умолчанию установлено на 128 МБ).
Запуск работника очереди с
--timeout=600
и--memory=1024
исправил проблему для меня.источник
Пользователь имеет возможность убивать свои собственные программы, используя kill или Control + C, но у меня складывается впечатление, что это не то, что произошло, и что пользователь пожаловался вам.
Конечно, root имеет возможность убивать программы, но если кто-то имеет root на вашей машине и убивает вещи, у вас большие проблемы.
Если вы не являетесь системным администратором, возможно, системный администратор установил квоты на использование ЦП, ОЗУ, использование орт-диска и процессы автоматического уничтожения, которые превышают их.
Кроме этих догадок, я не уверен без дополнительной информации о программе.
источник
Я столкнулся с этой проблемой в последнее время. Наконец, я обнаружил, что мои процессы были уничтожены сразу после автоматического вызова обновления OpenSuse zypper. Чтобы отключить обновление zypper решил мою проблему.
источник
Решил эту проблему, увеличив размер свопа :
/ubuntu/1075505/how-do-i-increase-swapfile-in-ubuntu-18-04
источник