Ограничение MemoryMax в systemd не применяется к сервисной юниту.

Вопрос или проблема

Я пытаюсь ограничить использование памяти службой systemd, но настройка MemoryMax, похоже, не применяется. Вот моя ситуация:

В моем файле службы /etc/systemd/system/discordsearch.service я установил следующее под [Service]:

MemoryAccounting=true
MemoryMax=2GB

Однако, когда я проверяю статус службы с помощью systemctl status discordsearch, я вижу:

Memory: 3.6G

Более того, когда я запускаю systemctl show discordsearch.service | grep Memory, я получаю:

MemoryCurrent=1195773952
MemoryAvailable=infinity
MemoryAccounting=yes
MemoryHigh=infinity
MemoryMax=infinity
MemoryLimit=infinity

Это показывает, что MemoryMax установлен в бесконечность, а не в 2GB, как я указал в файле службы.

Я попробовал следующее:

  1. Перезагрузить systemd с помощью sudo systemctl daemon-reload
  2. Перезапустить службу с помощью sudo systemctl restart discordsearch

/etc/systemd/system/discordsearch.service:

[Unit]
Description=discordsearch

[Service]
Environment="LOCALE_ARCHIVE=/nix/store/djm14qz135r1cfjsid90qryxgsw2i349-glibc-locales-2.37-45/lib/locale/locale-archive"
Environment="PATH=/nix/store/cm1sfanx42miqdzbwd5alxmg9lg96nag-yj-5.1.0/bin:/nix/store/l9mg93sgx50y88p5rr6x1vib6j1rjsds-coreutils-9.1/bin:/nix/store/yknc37wfb1hbnmgwmp4bm96rxwzsc692-findutils-4.9.0/bin:/nix/store/bj8a14pqhmvlha8hyv1p8bkd9kmykgjy-gnugrep-3.7/bin:/nix/store/agq64rvl0aj88ckm0kzaqgk2ddq8bvz8-gnused-4.9/bin:/nix/store/f9wkksb3lslf6q90i6c2r3qji7qcp0f2-systemd-253.6/bin:/nix/store/cm1sfanx42miqdzbwd5alxmg9lg96nag-yj-5.1.0/sbin:/nix/store/l9mg93sgx50y88p5rr6x1vib6j1rjsds-coreutils-9.1/sbin:/nix/store/yknc37wfb1hbnmgwmp4bm96rxwzsc692-findutils-4.9.0/sbin:/nix/store/bj8a14pqhmvlha8hyv1p8bkd9kmykgjy-gnugrep-3.7/sbin:/nix/store/agq64rvl0aj88ckm0kzaqgk2ddq8bvz8-gnused-4.9/sbin:/nix/store/f9wkksb3lslf6q90i6c2r3qji7qcp0f2-systemd-253.6/sbin"
Environment="TZDIR=/nix/store/x376xyviyrg5rafwk5a261lviv0l9paw-tzdata-2023c/share/zoneinfo"



ExecStart=/nix/store/lj1p39b4sp4k7g6qzdc0m2s6imga9yxy-HaskellNixCabalStarter-0.1.0.0/bin/discord-app
MemoryAccounting=true
MemoryMax=2GB
Restart=always
RestartSec=1
Type=simple
WorkingDirectory=%h/discordsearch

Это просто “опечатка в единице”. Из man systemd.resource-control:

Задаётся размер памяти в байтах. Если значение имеет суффикс K, M, G или T, указанный размер памяти интерпретируется как Килобайты, Мегабайты, Гигабайты или Терабайты (с основанием 1024), соответственно.

KB, MB, GB, TB недействительны и приводят к установке infinity.

Это должно было появиться в журнале systemd (journalctl):

[...] Invalid memory limit '1GB', ignoring: Invalid argument

Вы можете использовать systemd-analyze verify --user /path/to/unit/file/example.service для проверки правильности файла единицы.

Ответ или решение

Теория

Когда вы хотите ограничить использование памяти службой systemd, вы можете использовать директиву MemoryMax в файле юнита службы. Эта настройка позволяет задать максимальный объем памяти, который служба может использовать. Это особенно полезно для предотвращения неконтролируемого потребления ресурсов и обеспечения стабильной работы системы.

Однако важно помнить, что в конфигурации systemd необходимо соблюдать строго определенный синтаксический формат. Например, при указании размера памяти символы для обозначения единицы измерения должны строго соответствовать формату, предполагаемому systemd, то есть использовать только K, M, G, T для Килобайтов, Мегабайтов, Гигабайтов или Терабайтов соответственно.

Пример

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

MemoryAccounting=true
MemoryMax=2GB

Однако вместо ограничения в 2 ГБ у вас наблюдается другая ситуация: служба использует значительно больше памяти, чем запланировано. Когда вы проверяете статус службы, вы видите:

Memory: 3.6G

При выводе подробной информации о юните вы видите, что MemoryMax все еще имеет значение infinity, тогда как должно быть 2G.

MemoryMax=infinity

Применение

Проблема заключается в неправильном синтаксическом оформлении. Директива MemoryMax принимает только значения с суффиксами K, M, G или T. Использование GB вместо G приводит к тому, что systemd не распознает значение и сбрасывает его до infinity, что означает отсутствие ограничения.

Чтобы исправить ситуацию, выполните следующие шаги:

  1. Откройте файл вашего юнита службы, например, /etc/systemd/system/discordsearch.service и измените строку:

    MemoryMax=2GB

    на

    MemoryMax=2G
  2. Перезагрузите конфигурации systemd для применения изменений:

    sudo systemctl daemon-reload
  3. Перезапустите службу:

    sudo systemctl restart discordsearch
  4. Проверьте статус службы и убедитесь, что ограничение памяти применилось:

    systemctl status discordsearch
  5. Чтобы убедиться, что файл юнита не содержит ошибок, выполните:

    systemd-analyze verify /etc/systemd/system/discordsearch.service

    Это поможет выявить другие потенциальные проблемы с файлом службы.

Просмотрите логи с помощью journalctl для проверки, нет ли других предупреждений или ошибок, связанных с применением юнит-файла:

journalctl -u discordsearch

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...