Структура программного комплекса
Программный комплекс по лимитированию (Limited Surrounding — LS) представлен следующими компонентами.
Служба
klsd.service, которая непосредственно управляет группами.Утилита
lsctl, которая обеспечивает настройку службы.
Служба klsd
Инструкцию по установке службы klsd вы можете найти в разделе «МСВСфера 9 Сервер редакция для хостинг-провайдеров, интеграция с другим программным обеспечением».
После установки пакетов проверьте, что служба лимитирования запущена. Для этого выполните следующую команду:
$ sudo systemctl status klsd
Результатом выполнения этой команды может быть следующий вывод:
● klsd.service - The Limited Surrounding daemon
   Loaded: loaded (/usr/lib/systemd/system/klsd.service; enabled; preset: disabled)
   Active: active (running) since Mon 2024-06-10 12:39:12 MSK; 5h 56min ago
   Process: 779 ExecStart=/usr/sbin/klsd (code=exited, status=0/SUCCESS)
   Main PID: 796 (klsd)
   Tasks: 1 (limit: 23164)
   Memory: 692.0K
   CPU: 285ms
   CGroup: /system.slice/klsd.service
           └─796 /usr/sbin/klsd
Этого достаточно, чтобы служба и утилита были установлены и запущены.
Также служба klsd должна появиться в списке процессов:
$ sudo ps aux | grep klsd
root       16860  0.0  0.0   6360  1548 ?        S    14:13   0:00 /usr/sbin/klsd
Или в виде дерева процессов:
systemd,1 --switched-root --system --deserialize 31
└─klsd,16860
В процессе своей работы служба klsd помещает новые процессы в LS-группы («контейнеры»).
Настройки группы, в которую помещается процесс, задают для него параметры лимитирования.
В дальнейшем такая группа будет кратко называться «LS» или «LS-контейнер».
Основные настройки klsd содержатся в файле /etc/klsd/config.
В таблице перечислены параметры настроек.
Имя параметра  | 
Функция  | 
Значение по умолчанию  | 
|---|---|---|
  | 
Путь к сокету демона, посредством которого отправляются команды.  | 
  | 
  | 
Уровень логирования событий:   | 
  | 
  | 
Файл, в который выводятся события, в формате   | 
Вывод в консоль.  | 
  | 
Путь к pid-файлу.  | 
  | 
  | 
Уровень логирования событий для клиентских приложений:   | 
  | 
  | 
Файл, в который выводятся события для клиентских приложений, в формате   | 
Вывод в консоль.  | 
  | 
Путь к корню   | 
  | 
  | 
Режим запуска сервиса   | 
  | 
  | 
Режим завершения работы сервиса   | 
  | 
  | 
Если установлено   | 
  | 
Пример файла настроек:
socket=/run/ls/ls.sock
srv_log_level = info
srv_log_out=file://var/log/klsd.log
Рекомендуется использовать значения параметров по умолчанию.
Утилита управления лимитами
Утилита управления лимитами — /usr/sbin/lsctl. Запускать утилиту следует от имени привилегированного пользователя или root.
Утилита имеет большой набор параметров для управления лимитами.
Типы лимитов по лимитируемому ресурсу
CPU
Параметр  | 
Описание  | 
Формат принимаемых значений  | 
|---|---|---|
  | 
Разрешённый процент использования ядер процессора, задаётся в %. 100% соответствует одному ядру.  | 
  | 
Например в системе 16 ядер, если для LS установлено 25%, это значит, что все процессы, помещённые в данный LS, при пиковой вычислительной нагрузке не будут потреблять более 25% от одного ядра, значение же 400%, позволит использовать 4 ядра процессора.
PMEM
Параметр  | 
Описание  | 
Формат принимаемых значений  | 
|---|---|---|
  | 
Устанавливает число байт физической оперативной памяти, доступной всем процессам, помещённым в данный LS, в совокупности.  | 
  | 
SMEM
Параметр  | 
Описание  | 
Формат принимаемых значений  | 
|---|---|---|
  | 
Разрешённый размер файла подкачки для данного LS.  | 
  | 
NPROC
Параметр  | 
Описание  | 
Формат принимаемых значений  | 
|---|---|---|
  | 
Максимальное разрешённое число процессов, одновременно существующих в LS.  | 
  | 
Типы лимитов по назначению
По назначению лимиты делятся на следующие:
лимит по умолчанию
лимит, заданный непосредственно LS-контейнеру
лимит по умолчанию, заданный в службе лимитирования
Если служба лимитирования (klsd) не находит в своей базе для вновь создаваемого LS-контейнера значения лимитов,
то она создаёт контейнер без ограничения по лимитам. Это поведение может быть изменено путём установки лимитов по умолчанию с помощью команды lsctl set --lsid=0.
Данная команда отправит сервису новое значение лимита по умолчанию (именно для сервиса) и сервис применит новые настройки.
LS-контейнер, для которого не установлен лимит, будет наследовать новые настройки лимита по умолчанию. Это называется лимит службы лимитирования по умолчанию.
Все лимиты, о которых помнила служба klsd, сбрасываются при перезагрузке системы.
Постоянные же лимиты сохраняются в базе утилиты lsctl и восстанавливаются командой lsctl apply-all (для всех контейнеров)
или lsctl apply --lsid=1000 (для конкретного контейнера).
Команда lsctl apply-all выполняется автоматически при перезапуске или при старте службы klsd, поэтому выполнять её самостоятельно нет необходимости.
Лимит по умолчанию для утилиты lsctl используется при задании лимита для нового контейнера в случае, когда
команда lsctl set --lsid=N --cpu=M --pmem=C --smem=D --nproc=H неполная. Если в команде указан только параметр --cpu, но не заданы другие параметры,
тогда для контейнера недостающие параметры берутся из настроек по умолчанию. В списке лимитов лимиты по умолчанию отображаются как контейнер с номером 0.
$ sudo lsctl list
ID      CPU     PMEM    SMEM    NPROC
0       100     2147483648      2147483648      16
...
Пример: при установке лимитов для пользователя с uid = 1000 можно не указывать все параметры (cpu, pmem, smem, nproc),
а указать только необходимые лимиты lsctl set --lsid=1000 --cpu=25%, остальные недостающие параметры унаследуются от лимита по умолчанию (контейнер 0).
$ sudo lsctl set --lsid=1000 --cpu=25%
$ sudo lsctl list
ID      CPU     PMEM    SMEM    NPROC
0       100     2147483648      2147483648      16
1000    25      2147483648      2147483648      16
...
Лимиты для pmem, smem и nproc унаследовались от default (лимита по умолчанию для lsctl).
Если же изменить лимит по умолчанию, то все LS-контейнеры так же поменяют свои унаследованные лимиты автоматически на новые значения по умолчанию.
Пример:
$ sudo lsctl set --lsid=0 --cpu=150% --pmem=1G --smem=1G --nproc=32
$ sudo lsctl list
ID      CPU     PMEM    SMEM    NPROC
0       150     1073741824      1073741824      32
1000    25      1073741824      1073741824      32
...
Не изменился только лимит cpu, так как он не был унаследован в ранее выполненной команде sudo lsctl set --lsid=1000 --cpu=25%.
Пример применения лимита по умолчанию для службы klsd. Пусть на сервере настроены лимиты для пользователей (лимиты из внутренней базы):
$ sudo lsctl list
ID      CPU     PMEM    SMEM    NPROC
0       100     1073741824      2147483648      32
1009    100     1073741824      2147483648      32
Лимиты и настроенные LS-контейнеры из сервиса klsd:
$ sudo lsctl climits
ID      CPU     PMEM    SMEM    NPROC
1009    100     1073741824      2147483648      32
После того, как какое-либо приложение входит в контейнер 1011, для которого нет настроек во внутренней базе:
$ sudo lsctl list
ID      CPU     PMEM    SMEM    NPROC
0       100     1073741824      2147483648      32
1009    100     1073741824      2147483648      32
В данном случае вывод не изменился, так как во внутренней базе нет настроек для LS-контейнера 1011.
А вот в списке контейнеров, контролируемых службой klsd, появился новый контейнер 1011, который унаследовал лимит от ID=0 из внутренней базы:
$ sudo lsctl climits
ID      CPU     PMEM    SMEM    NPROC
1009    100     1073741824      2147483648      32
1011    100     1073741824      2147483648      32
Если сейчас изменить параметры лимита для LS ID=0:
$ sudo lsctl set --lsid=0 --cpu=50%
То все LS-контейнеры, которые были описаны во внутренней базе, изменят лимиты по умолчанию:
$ sudo lsctl list
ID      CPU     PMEM    SMEM    NPROC
0       50      1073741824      2147483648      32
1009    50      1073741824      2147483648      32
И все лимиты для LS-контейнеров обновятся и в сервисе klsd.
$ sudo lsctl climits
ID      CPU     PMEM    SMEM    NPROC
1009    50      1073741824      2147483648      32
1011    50      1073741824      2147483648      32
И контейнер 1011 со всеми процессами внутри также поменяет лимит на новый по умолчанию, как показано в выводе выше.
Лимит по умолчанию и наследование
Если задать неполную команду lsctl set --lsid=0 --cpu=150%, то в этом случае лимит наследуется сам от себя и изменится только один заданный в команде параметр.
Пример:
$ sudo lsctl list
ID      CPU     PMEM    SMEM    NPROC
0       150     1073741824      1073741824      32
...
Если вызвать команду:
$ sudo lsctl set --lsid=0 --smem=2G
То в результате изменится только лимит smem для default:
$ sudo lsctl list
ID      CPU     PMEM    SMEM    NPROC
0       150     1073741824      2147483648      32
...
Как запретить изменение наследуемых параметров при последующем изменении параметров default
Если необходимо отключить наследование лимитов от default после сохранения, то можно воспользоваться следующей командой.
Пример задания лимитов для LS-контейнера:
$ sudo lsctl set --lsid=1007 --cpu=25%
$ sudo lsctl list
ID      CPU     PMEM    SMEM    NPROC
0       150     1073741824      2147483648      32
...
1007    25      1073741824      2147483648      32
Команда sudo lsctl set --lsid=1007 --cpu=25% установила лимит по cpu на уровне 25% от одного ядра.
Остальные параметры были унаследованы от лимита по умолчанию default, т.е pmem=1G, smem=2G, nproc=32.
Для демонстрации изменения лимита default выполним команду sudo lsctl set --lsid=0 --smem=1G:
$ sudo lsctl set --lsid=0 --smem=1G
$ sudo lsctl list
ID      CPU     PMEM    SMEM    NPROC
0       150     1073741824      1073741824      32
...
1007    25      1073741824      1073741824      32
Вывод выше показывает, что smem изменился как у default, так и у LS-контейнера 1007 и стал равен smem=1G.
Теперь попробуем изменить лимит LS-контейнера 1007 с параметром --force-save:
$ sudo lsctl set --lsid=1007 --cpu=200% --force-save
$ sudo lsctl list
ID      CPU     PMEM    SMEM    NPROC
0       150     1073741824      1073741824      32
...
1007    200     1073741824      1073741824      32
У LS-контейнера cpu лимит установился на уровне 200%, значения для smem, pmem и nproc были взяты от default.
А теперь если попробовать изменить лимит default:
$ sudo lsctl set --lsid=0 --smem=2G
$ sudo lsctl list
ID      CPU     PMEM    SMEM    NPROC
0       150     1073741824      2147483648      32
...
1007    200     1073741824      1073741824      32
То это никак не повлияет на лимиты LS=1007, они остались неизменными.