Как предотвратить завершение процесса?

Как предотвратить завершение процесса?

Есть ли способ предотвратить завершение процесса, несмотря ни на что? Я знаю об этом, niceно не уверен, что назначение rakeнаивысшего приоритета такой длительной задаче, интенсивно использующей память, предотвратит ее завершение:

nice -n -20 rake xyz

Редактировать: Автор оригинального поста, скорее всего, хотел, чтобы процесс имел высокий приоритет, даже если на сервере мало ресурсов, настолько, чтобы другие процессы завершались первыми.

решение1

Вы не можете помешать root завершить процесс. Или, если на то пошло: вы не можете помешать серверу завершить процесс, который съедает все ваши ресурсы.

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

Пример использования кода:

решение2

Теперь я понимаю, что это старый вопрос, но поскольку оба ответа игнорируют очевидное — или, в лучшем случае, царапают поверхность — я почувствовал побуждение написать свой собственный. Учитывая формулировку вопроса, первое, что пришло мне в голову, было «убийца OOM!». В одном из других ответов даже утверждается, что «нечто не убивается автоматически», что нелепо с точки зрения пользователя. Что такое убийца OOM, если не автоматизм?

TheУбийца ООМявляется вашим самым большим врагом в сценариях, подобных описанному, как показано в статье по ссылке.

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

Ваш вопрос, разобранный:

Можно ли как-то предотвратить завершение процесса в любом случае?

Нет,к счастьюнет. Например, ядро ​​будет убивать неправильно работающие процессы (например, отправляяСИГСЭГВ). Это также применимо, если ваша задача работает неправильно из-за превышения ограничений по ресурсам (см.пределы.conf,getrlimit/setrlimit). То есть, если что-то внутри вашей rakeзадачи (которое, по всей вероятности, будет использовать другие процессы для выполнения какой-то работы) разыменовывает нулевой указатель, вам все равно не повезет, и эта часть выйдет из строя, что впоследствии может привести к сбою задачи.

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

Я знаю об этом, niceно не уверен, что присвоение rakeнаивысшего приоритета такой длительной задаче, требующей большого объема памяти, предотвратит ее завершение: [...]

Это не предотвратит этого, но этоволяиспользоваться какодиннескольких эвристик для OOM killer. Так что да, на самом деле niceзначениеволяпомочь ... немного.Статья в LWNссылку на которую я уже приводил выше, дает следующую эвристику:

  • если задача имеетхорошее значение выше нуля, его счет удваивается
  • суперпользователь или прямой доступ к оборудованиюОценка задач (CAP_SYS_ADMIN, CAP_SYS_RESOURCE или CAP_SYS_RAWIO) делится на 4. Это кумулятивный показатель, т. е. оценка задачи суперпользователя с доступом к оборудованию будет делиться на 16.
  • если состояние OOM произошло в одномпроцессорный набора проверенное задание не принадлежит этому набору, его оценка делится на 8.
  • полученный результат умножается на два в степени oom_adj (т.е. баллы <<= oom_adj, когда он положительный, и баллы >>= -(oom_adj) в противном случае)

Помимо niceзначения вы также можете пойти дальше, запустив это как root (или с заданными возможностями) или, если выявляются root, вы можете быть уверены, что ваш процесс не будет подвержен уничтожению OOM killer (статья имеетПолная информация) создание cgroup:

  1. mount -t cgroup -o oom oom /mnt/oom-killer
  2. mkdir /mnt/oom-killer/invincibles
  3. echo 0 > /mnt/oom-killer/invincibles/oom.priority
  4. echo <pid> > /mnt/oom-killer/invincibles/tasks, где <pid>находится идентификатор процесса вашей задачи rake ...

Вот так. Вы можете сделать определенные группы процессов неподвластными гневу убийцы OOM.

Однако я не уверен, что этот метод кувалды — правильный.первыйлучшее, что можно сделать. Я думаю, вам следует начать с экспериментов, oom_adjчтобы увидеть, поможет ли это вашему процессу выжить в конкуренции с другими процессами. Особенно, если это сервер, общееуслугаможет быть важнее конкретной задачи, которая может быть даже не жизненно важной для сервиса. Поэтому используйте с осторожностью. Кроме того, вы можете отслеживать пожирателей памяти (sysstat и его друзья должны помочь). Если вы сделаете это через базу данных временных рядов и построите графики, вы даже можете обнаружить утечки памяти.

Если ничего из этого не помогло, вам следует перейти на страницуСайт Брендана Греггаи начатьизмерениеразличные показатели производительности; также посмотрите, можете ли вы взять одну из его книг. Например, возможно, у вас есть что-то вроде ситуации выхода из-под контроля в отношении распределения памяти внутри вашей rakeзадачи. Потому что вы подчеркиваетедолго работаетиинтенсивно использующий памятьно они не обязательно связаны. BPF и друзья позволят вам получить понимание, которое вы не получите иным способом.

решение3

Почемубыего убьют?

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

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

Если у вас ресурсоемкая задача, купите больше ресурсов. Используйте свое собственное серверное время. Или договоритесь с хостером, который позволит вам запустить ее за его счет.

Связанный контент