Структура программного комплекса
Программный комплекс по лимитированию (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
, они остались неизменными.