Структура программного комплекса

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

В таблице перечислены параметры настроек.

Параметры настроек

Имя параметра

Функция

Значение по умолчанию

socket

Путь к сокету демона, посредством которого отправляются команды.

/run/ls/ls.sock

srv_log_level

Уровень логирования событий: error, warn, info, debug, trace, alloc, all.

error — выводить только критические ошибки.

srv_log_out

Файл, в который выводятся события, в формате file://tmp/log.txt или console (вывод в консоль) или syslog (вывод в системный журнал).

Вывод в консоль.

pidfile

Путь к pid-файлу.

/run/ls/klsd.pid

cli_log_level

Уровень логирования событий для клиентских приложений: error, warn, info, debug, trace, alloc, all.

error — выводить только критические ошибки.

cli_log_out

Файл, в который выводятся события для клиентских приложений, в формате file://tmp/log.txt или console (вывод в консоль) или syslog (вывод в системный журнал).

Вывод в консоль.

top_slice

Путь к корню cgroups службы лимитирования.

/sys/fs/cgroup/klsd.slice

start_mode

Режим запуска сервиса klsd: notify или forking.

notify

cleanup

Режим завершения работы сервиса klsd. Может быть установлен no или yes. yes — при остановке службы все LS-контейнеры будут закрыты, сессии завершены, процессы в LS остановлены. no — все процессы в LS будут продолжаться пока не завершатся сами.

no

Пример файла настроек:

socket=/run/ls/ls.sock
srv_log_level = info
srv_log_out=file://var/log/klsd.log

Рекомендуется использовать значения параметров по умолчанию.

Утилита управления лимитами

Утилита управления лимитами — /usr/sbin/lsctl. Запускать утилиту следует от имени привилегированного пользователя или root. Утилита имеет большой набор параметров для управления лимитами.

Типы лимитов по лимитируемому ресурсу

  • CPU

Параметр

Описание

Формат принимаемых значений

--cpu

Разрешённый процент использования ядер процессора, задаётся в %. 100% соответствует одному ядру.

--cpu=100, --cpu=25%

Например в системе 16 ядер, если для LS установлено 25%, это значит, что все процессы, помещённые в данный LS, при пиковой вычислительной нагрузке не будут потреблять более 25% от одного ядра, значение же 400%, позволит использовать 4 ядра процессора.

  • PMEM

Параметр

Описание

Формат принимаемых значений

--pmem

Устанавливает число байт физической оперативной памяти, доступной всем процессам, помещённым в данный LS, в совокупности.

--pmem=100000000 (примерно 100 Мегабайт), --pmem=100000K (100000 Килобайт), --pmem=100M (100 Мегабайт), --pmem=1G (1 Гигабайт)``

  • SMEM

Параметр

Описание

Формат принимаемых значений

--smem

Разрешённый размер файла подкачки для данного LS.

--smem=100000000 (примерно 100 Мегабайт), --smem=100000K (100000 Килобайт), --smem=100M (100 Мегабайт), --smem=1G (1 Гигабайт)

  • NPROC

Параметр

Описание

Формат принимаемых значений

--nproc

Максимальное разрешённое число процессов, одновременно существующих в LS.

--nproc=10

Типы лимитов по назначению

По назначению лимиты делятся на следующие:

  • лимит по умолчанию

  • лимит, заданный непосредственно 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, они остались неизменными.