LimitMEMLOCK=: блокировка памяти от вытеснения
Задаёт, сколько памяти процессы службы могут заблокировать от вытеснения в подкачку. По умолчанию предел очень мал — порядка десятков килобайт.
Что делает
Блокировка нужна двум видам программ. Базам данных — чтобы важные структуры не уходили в подкачку и не портили время ответа. Программам с секретами — чтобы ключи не попали на диск в файл подкачки.
Для служб, которым это нужно, предел ставят в infinity. Elasticsearch, MongoDB и часть баз явно требуют такого значения и отказываются работать без него или предупреждают.
Где ставится. В секции [Service].
Значения
| Значение | Что происходит |
|---|---|
infinity | без ограничения; обычный выбор для баз данных. |
8G | явный предел с суффиксом. |
64K | близко к значению по умолчанию. |
Пример
База данных с заблокированной памятью.
[Service]
LimitMEMLOCK=infinity
LimitNOFILE=65535
MemoryMax=8G
Предел памяти и блокировка не противоречат друг другу: первый ограничивает объём, второй запрещает вытеснение.
Типичные ошибки
Без повышения предела программа либо не запускается, либо молча работает без блокировки — второе хуже, потому что незаметно.
Блокировка памяти уменьшает объём, доступный остальным: значение infinity для всех служб подряд ставить не стоит.
В контейнере предел может быть ограничен извне, и unit-файл его не поднимет.
Связанные ошибки
- status=205/LIMITS в systemdКод 205/LIMITS: systemd не смог применить ограничения ресурсов из Limit*=. Обычно значение недопустимо или превышает жёсткий предел.
- Failed with result 'oom-kill'Состояние oom-kill: процесс службы убит из-за нехватки памяти. Как понять, упёрлись в предел службы или в память машины.
Рядом стоящие параметры
Где важен на практике
Источники
- systemd.exec(5)
- Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)