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

Вы должны использовать неизменяемые объекты передачи данных.

Пока простой объект является глубоко неизменным (это означает, что ни он, ни какие-либо его свойства не могут измениться), нет ничего плохого в использовании его на нескольких threads.

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

554
задан mikemaccana 7 July 2018 в 08:26
поделиться

7 ответов

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

380
ответ дан 22 November 2019 в 22:09
поделиться

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

Есть несколько способов:

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

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

11
ответ дан Carl 7 July 2018 в 08:26
поделиться

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

0
ответ дан poordeveloper 7 July 2018 в 08:26
поделиться

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

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

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

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

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

Где я могу найти логи OOMKiller?

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

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

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

  1. Увеличение памяти (не подкачка)
  2. Найдите утечки памяти в вашей программе и устраните их
  3. Ограничьте память, которую может использовать любой процесс (например, память JVM может быть ограничена с помощью JAVA_OPTS)
  4. См. журналы и Google :))
44
ответ дан Jadav Bheda 7 July 2018 в 08:26
поделиться

У пользователя есть способность закрыть его собственные программы, использование уничтожают или Control+C, но я получаю впечатление, это не то, что произошло, и что пользователь жаловался Вам.

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

Если Вы не системный администратор, системный администратор, возможно, настроил квоты на ЦП, RAM, использовании диска орта и автоуничтожает процессы, которые превышают их.

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

0
ответ дан 22 November 2019 в 22:09
поделиться

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

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

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

2
ответ дан 22 November 2019 в 22:09
поделиться

Это похоже на хорошую статью о предмете: Приручение уничтожителя OOM.

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

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

170
ответ дан 22 November 2019 в 22:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: