Как можно запретить в Ubuntu 24 завершение процесса systemd?

На VPS система иногда завершает процессы из-за нехватки оперативной памяти. Я хотел бы настроить систему так, чтобы она в первую очередь завершала только "пользовательские" процессы, такие как php, ffmpeg и другие, перечисленные в моём списке. При этом процесс systemd должен оставаться запущенным в любых ситуациях, за исключением крайних случаев, когда все "пользовательские" процессы будут уже завершены. Как можно реализовать эту настройку?
  • 27 апреля 2025 г. 3:55
Ответы на вопрос 2
Чтобы защитить процессы systemd от завершения в Ubuntu (или любой системе на базе systemd), включая ваш VPS, можно использовать несколько методов для управления ограничениями на уровень памяти и поведения "оживления" процессов.

Вот шаги, которые могут помочь вам настроить систему так, чтобы процессы, критически важные для работы, оставались запущенными:

### 1. Настройка `oom_score_adj` для ваших процессов

Вы можете изменить `oom_score_adj` для ваших пользовательских процессов, чтобы указать, что их следует завершать в первую очередь в случае нехватки памяти. Это можно сделать в конфигурации службы, если ваши процессы работают как системные службы.

Например, если у вас есть служба для `php`:

```ini
[Service]
OOMScoreAdjust=-1000
```

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

### 2. Установка `MemoryLimit` для пользовательских процессов

Вы можете задать максимально допустимый объём памяти для ваших пользовательских процессов с помощью `MemoryLimit` в конфигурационных файлах `systemd`.

Пример:

```ini
[Service]
MemoryLimit=500M
```

В этом случае, если процесс превышает указанный лимит, он будет завершён, но системные служби с более высоким приоритетом не будут затронуты.

### 3. Создание файла конфигурации cgroup

Вы можете использовать cgroups для управления приоритетом памяти. Создайте новый cgroup и задайте ему ограничения:

```bash
sudo cgcreate -g memory:/mygroup
echo 500M | sudo tee /sys/fs/cgroup/memory/mygroup/memory.limit_in_bytes
```

Добавьте процессы в вашу группу, используя `cgclassify` или путём задания в конфигурациях systemd.

### 4. Изменение настроек systemd

Для улучшения защиты процессов, вы можете использовать параметры `ProtectSystem`, `ProtectHome`, и другие, чтобы существенно ограничить доступ к важным системным функциям и файловой системе, если это необходимо.

### 5. Рассмотрение параметров системы

Убедитесь, что у вас правильная конфигурация для `swap`. Если памяти недостаточно, система может выполнить свопирование, что может помочь предотвратить завершение процессов.

### 6. Мониторинг и автоматизация

Используйте средства мониторинга, например, `monit` или `systemd` таймеры, чтобы следить за использованием памяти и сообщать вам, когда память недостаточна, чтобы вы могли предпринять превентивные меры.

### Рекомендации по тестированию

После внесения изменений важно протестировать их в безопасной среде или на тестовом VPS, чтобы убедиться, что система работает так, как вы ожидаете.

Эти шаги помогут защитить системные процессы от завершения и управлять пользовательскими процессами более эффективно при недостатке памяти.
https://man7.org/linux/man-pages/man5/proc_pid_oom... : 
The lowest possible value, -1000, is equivalent to disabling OOM-killing entirely for that task, since it will always report a badness score of 0.
Похожие вопросы