Привет, Хабр!
Меня зовут Артём, я инженер-программист в департаменте серверных решений. В статье расскажу про новый инструмент для повышения производительности, который получилось портировать и доработать для ОС Astra Linux Special Edition.
Итак, один из ключевых аспектов работы серверов — производительность серверного ПО. Повысить ее можно разными способами. Например, можно рефакторить код и оптимизировать алгоритмы, если есть доступ к исходному коду. Или производить горизонтальное или вертикальное масштабирование.
А что если я скажу, что работу серверных приложений можно оптимизировать без изменений в исходном коде и без дополнительных мощностей, необходимых для масштабирования систем?
Существует специальный класс приложений для тонкой настройки операционной системы. Они помогают выжимать максимум из имеющихся ресурсов и при правильной настройке в некоторых случаях позволяют получить прирост до 30%. Причем это очень дешевый способ повышения производительности, так как нужно просто установить соответствующую утилиту и настроить ее под сценарий использования соответствующего серверного ПО.
Одним из ярких представителей таких утилит является A-Tune. Она включена в состав дистрибутива openEuler, который на текущий момент поддерживается и развивается независимым открытым сообществом разработчиков.
Я решил проанализировать существующие на рынке решения, поскольку мы столкнулись с тем, что пользователям Astra Linux нужно было повысить производительность на серверных сценариях. Проведенный анализ программ для тюнинга выявил большой потенциал у A-Tune в сфере оптимизации производительности операционной системы Astra Linux Special Edition в варианте лицензирования «Сервер» (ОС СН ALSE Сервер).
Перечисленные особенности приложения говорят о наиболее современном подходе к тюнингу:
A-Tune определяет оптимальные параметры за счет применения алгоритмов оптимизации. Другие приложения подобного класса используют заранее подготовленную информацию о влиянии параметров на производительность ОС.
A-Tune использует машинное обучение для определения текущей нагрузки. Подобный подход интересен для серверов с динамической и скачкообразной нагрузкой.
A-Tune может распределенно управлять оптимизацией настроек сервера.
Утилита умеет работать в трех режимах:
Статический режим. Автоматизирует установку заданных параметров в системе.
Динамический режим. Автоматизирует поиск оптимальных параметров.
Распределенный режим. Позволяет конфигурировать первые два режима для большого количества машин с одной клиентской машины.
Подробнее об этих режимах расскажу ниже.
Статический режим работы A-Tune
В терминах A-Tune, профиль — это набор секций с настройками для компонента системы, где каждая секция, в свою очередь, называется плагином. Утилита в своем составе имеет уже набор готовых профилей и функционал для их применения в операционной системе, который называется статическим режимом работы.
В статическом режиме работы A-Tune применяет параметры, заданные в профиле. Зачастую параметры для тюнинга ОС применяются в разных каталогах системы и разных конфигурационных файлах, поэтому вручную конфигурировать систему под определенный сценарий нагрузки может быть весьма трудоёмко. Статический режим работы позволяет упростить применение параметров и откат измененных файлов в первоначальное состояние.
Команды для работы с профилями
# включить A-Tune
systemctl start atuned
# посмотреть список доступных профилей
atune-adm list
вывод:
Support profiles:
+---------------------------------------------+-----------+
| ProfileName | Active |
+=============================================+===========+
| arm-native-android-container-robox | false |
+---------------------------------------------+-----------+
| basic-test-suite-baseline-fio | false |
+---------------------------------------------+-----------+
| basic-test-suite-baseline-lmbench | false |
+---------------------------------------------+-----------+
| basic-test-suite-baseline-netperf | false |
+---------------------------------------------+-----------+
| default-default | false |
+---------------------------------------------+-----------+
# применить профиль из списка
atune-adm profile [профиль]
# пример применения профиля
atune-adm profile default-default
вывод:
[ SUGGEST] Bios please change the BIOS configuration NUMA to Enable
[ SUGGEST] Bootloader Need reboot to make the config change of grub effect.
[ SUCCESS] memory memory num is 0, memory interpolation is correct
[ SUGGEST] Kernel please change the kernel configuration CONFIG_NUMA_AWARE_SPINLOCKS to y
# посмотреть информацию о профиле
atune-adm info [профиль]
# задать пользовательский профиль
atune-adm define [тип сервиса] [название приложения] [название пользовательского сценария] [путь к файлу с профилем]
# удалить профиль (только для профилей, заданных пользователем)
atune-adm undefine [профиль]
Чтобы применить оптимальный профиль, нужно знать, какой из них лучше всего подходит под желаемый сценарий использования системы. Решить данную задачу призвана одна из главных особенностей утилиты — определение оптимального профиля с помощью классификаторов из sklearn и xgboost. Для определения профиля A-Tune запускает анализ рабочей нагрузки, в ходе которого собираются данные о состоянии системы через A-Tune-Collector. Данный модуль вызывает консольные команды мониторинга:
sar — выводит статистику скорости ввода/вывода, активности подкачки, активности процессов, прерываний, сетевой активности, использования оперативной памяти и подкачки, использования ЦП, активности ядра и TTY, а также многое другое.
mpstat — возвращает статистику использования процессоров в системе. Команда показывает развёрнутую статистику или всех процессов системы (mpstat -P ALL), или каждого по отдельности (mpstat -P 0), где 0 (ноль) отмечается как первый процессор.
iostat — отображает основные параметры ввода/вывода данных на диск, скорость записи и чтения данных, а также объем записанных или прочитанных данных, выводит параметры загруженности процессора.
lshw — Linux Hardware Lister, показывает детальную информацию о компонентах компьютера: процессоре, конфигурации оперативной памяти, материнской плате, BIOS информацию, конфигурацию кэша, шины и т. д. (в комплекте с утилитой также имеется база данных оборудования с USB- и PCI-интерфейсами).
perf stat — cобирает статистику производительности различных операций в ядре и пользовательском пространстве.
После вызова команд модуль парсит результаты и компонует их в вектор данных, который отправляется на вход классификатора. По результатам сопоставления входных данных с имеющимися определяется типовая нагрузка и ее название, после чего уже происходит сопоставление с наиболее подходящим профилем. В A-Tune используются классификаторы: Random Forest Classifier, Support Vector Machine Classifier и XGBoost classifier. Последний основан на градиентном бустинге деревьев.
Определение профиля с помощью классификатора осуществляется командой atune-adm analysis
, использующей подготовленные математические модели.
Определение рабочей нагрузки
# запустить определение профиля с параметрами по умолчанию (20 интервалов измерения состояния системы без применения профиля)
atune-adm analysis
# запустить определение профиля и задать число интервалов измерения
atune-adm analysis -t 5
# запустить определение профиля, используя заранее сгенерированную модель (например, с именем self_trained.m в текущей директории)
atune-adm analysis --model ./self_trained.m
# запустить определение профиля и применить оптимальный профиль
atune-adm analysis --apply
Чтобы распознать уникальные типы нагрузки, существует возможность обучения A-Tune средствами утилиты для генерации отдельной математической модели.
Шаги для генерации математической модели:
-
Создание профиля для нагрузки, которую A-Tune будет учиться распознавать. Для этого необходимо воспользоваться командой
atune-adm define
, которой на вход подается файл с пустым профилем.Общий вид команды создания профиляatune-adm define [тип сервиса] [название приложения] [название пользовательского сценария] [путь к файлу с пустым профилем]
Пример:
Создать профиль для нагрузки# пакет atune устанавливает пустой профиль, который мы можем использовать - generic_profile.conf atune-adm define bench sysbench cpu /usr/lib/atuned/profiles/generic/generic_profile.conf
Проверить результат работы команды можно выводом списка доступных профилей в утилите A-Tune:
Новый профильatune-adm list | grep bench-sysbench-cpu вывод: | bench-sysbench-cpu | false |
-
Подача нагрузки на систему и сбор данных через команду
atune-adm collection
. Для ее реализации необходимо собрать данные для двух и более классов нагрузки, чтобы обучить классификаторы (при одном классе нагрузки A-Tune сообщит об ошибке работы). Так формируется датасет с лейблом профиля, который подходит под этот тип нагрузки.
Общий вид команды сбора данныхatune-adm collection -f [имя файла] -o [путь для сохранения датасета] -b [диск, на котором находится файловая система, используемая приложением] -n [имя сетевого адаптера] -i [количество интервалов сбора данных (по умолчанию 5)] -d [длительность (в секундах) сбора данных (по умолчанию 1200)] -t [имя профиля, который мы создали ранее, или тип сервиса для существующего профиля]
Следовательно, нам нужно собрать данные с нагрузкой и без нее. Пример команд для сбора данных:
Сбор данных# запустим нагрузку, например sysbench sysbench cpu --threads=16 --time=120 --cpu-max-prime=10000 run # соберем данные под нагрузкой atune-adm collection -f testcpu -o /home/astra/atune/test/ -b sda -n enp0s3 -d 120 -t bench-sysbench-cpu # соберем данные без нагрузки, т. е. без запуска sysbench atune-adm collection -f testcpu -o /home/astra/atune/test/ -b sda -n enp0s3 -d 120 -t default
Когда работа команды завершится, в каталоге
/home/astra/atune/test
будут находиться CSV-файлы с собранной статистикой. -
Обучение математической модели на полученном датасете. Осуществляется командой
atune-adm train
.
Обучение математической моделиatune-adm train --data_path=/home/astra/atune/test/ --output_file=/home/astra/atune/test/testcpu.m
-
Классификация профиля с использованием модели. Осуществляется с помощью команды:
atune-adm analysis --model <путь к сгенерированной модели>
.
Использование модели для классификации профиляatune-adm analysis --model /home/astra/atune/test/testcpu.m
Если мы с использованием созданной модели дадим команду определения профиля под работу нашего приложения, то увидим, что A-Tune автоматически применила созданный нами в самом начале профиль. Он работает согласно той модели, которую мы обучили на собранных данных.
Динамический режим работы A-Tune
Вторым режимом работы A-Tune является динамический режим. В нем утилита дает возможность автоматически искать оптимальную конфигурацию, минимизируя затраты на ручную настройку и оценку производительности. Такой подход существенно повышает эффективность тюнинга (около 10%) и применяется в случае, когда у продвинутых пользователей повышенные требования к производительности.
Также такой подход значительно упрощает подбор оптимальных параметров. Если раньше для подбора параметров нужно было проводить исследования и собирать базу знаний, то теперь подбор параметров выполняется в автоматическом режиме.
В данном режиме A-Tune устанавливает параметры для целевого устройства и получает показатели эффективности обратной связи. Эти шаги повторяются до тех пор, пока не будут получены оптимальные параметры.
Ключевые особенности этого режима работы:
Автоматический выбор значимых параметров для уменьшения пространства поиска и повышения эффективности обучения.
Пользовательский выбор оптимального алгоритма в зависимости от сценария применения приложения, типов параметров и требуемой производительности.
Добавление характеристики текущей рабочей нагрузки и оптимальных параметров в базу знаний, чтобы улучшить эффективность последующего тюнинга.
Одно из условий запуска динамического режима работы — наличие конфигурационных yaml-файлов для сервера и клиента. Файл сервера содержит информацию о векторе управляемых параметров. Для каждого такого параметра задается его вид: дискретный или непрерывный, область допустимых значений и bash-команды для записи и чтения параметров.
Файл клиента содержит информацию о целевых функциях многокритериальной оптимизации: bash-команда для получения значения функции, вес функции, тип функции: positive — оптимум в минимуме, negative — оптимум в максимуме. Кроме того, в файле определяется алгоритм оптимизации, который будет использоваться в рамках тюнинга.
Описание файла конфигурации представлено в таблице 1.
Таблица 1 — Структура данных файла сервера
Имя |
Описание |
Тип |
Диапазон значений |
---|---|---|---|
project |
Название проекта. |
Character string |
- |
startworkload |
Скрипт для запуска оптимизируемого сервиса. |
Character string |
- |
stopworkload |
Скрипт для остановки службы, подлежащий оптимизации. |
Character string |
- |
maxiterations |
Максимальное количество итераций оптимизации, которое используется для ограничения количества итераций на клиенте. Как правило, чем больше итераций оптимизации, тем лучше эффект оптимизации, но тем больше требуется времени. |
Integer |
>10 |
object |
Параметры, которые необходимо оптимизировать (вектор управляемых параметров), и связанная с ними информация. |
- |
- |
Детальное описание вектора управляемых параметров представлено в таблице 2.
Таблица 2 — Информация о векторе управляемых параметров файла сервера
Имя |
Описание |
Тип |
Диапазон значений |
---|---|---|---|
name |
Параметр, требующий оптимизации. |
Character string |
- |
desc |
Описание оптимизируемого параметра. |
Character string |
- |
get |
Скрипт для запроса значений параметров. |
- |
- |
set |
Скрипт для настройки значений параметров. |
- |
- |
needrestart |
Флаг перезапуска службы для применения параметра. |
Enumeration |
true или false |
type |
Тип параметра. В настоящее время поддерживаются типы discrete и continuous. |
Enumeration |
дискретный или непрерывный |
dtype |
Этот параметр доступен только в том случае, если для параметра type установлено значение discrete. В настоящее время поддерживаются только int, float и string. |
Enumeration |
int, float, string |
scope |
Диапазон настройки параметров. Этот параметр действителен, только если для type установлено значение discrete, а для dtype - значение int или float, или для type установлено значение continuous. |
Integer/Float |
Значение определяется пользователем и должно находиться в допустимом диапазоне этого параметра. |
step |
Шаг значения параметра, который используется, когда для dtype установлено значение int или float. |
Integer/Float |
Это значение определяется пользователем. |
items |
Перечисляемое значение, значение параметра которого не входит в область видимости. Используется, когда для dtype установлено значение int или float. |
Integer/Float |
Значение определяется пользователем и должно находиться в допустимом диапазоне этого параметра. |
options |
Перечисляемый диапазон значений параметра value, который используется в случае, если для dtype установлено значение string. |
Character string |
Значение определяется пользователем и должно находиться в допустимом диапазоне этого параметра. |
В файле клиента используются другие параметры, которые представлены в таблице 3.
Таблица 3 — Описание структуры файла клиента
Имя |
Описание |
Тип |
Диапазон значений |
---|---|---|---|
project |
Название проекта, которое должно совпадать с именем в файле конфигурации на сервере. |
Character string |
- |
engine |
Алгоритм оптимизации. Подробное описание доступных алгоритмов оптимизации приведено в таблице 5. |
Character string |
"random", "forest", "gbrt", "bayes", "extraTrees" |
iterations |
Количество итераций оптимизации. |
Integer |
≥ 10 |
random_starts |
Количество случайных итераций. |
Integer |
< итерации |
feature_filter_engine |
Алгоритм поиска параметров, который используется для выбора важных параметров. Этот параметр необязателен. |
Character string |
"lhs" |
feature_filter_cycle |
Циклы поиска параметров, которые используются для выбора важных параметров. Этот параметр используется вместе с feature_filter_engine. |
Integer |
- |
feature_filter_iters |
Количество итераций для каждого цикла поиска параметров, которое используется для выбора важных параметров. Этот параметр используется вместе с feature_filter_engine. |
Integer |
- |
split_count |
Количество равномерно выбранных параметров в диапазоне значений параметров настройки, который используется для выбора важных параметров. Этот параметр используется вместе с feature_filter_engine. |
Integer |
- |
benchmark |
Скрипт тестирования производительности. |
- |
- |
evaluations |
Описание целевых функций многокритериальной оптимизации. |
- |
- |
Подробное описание целевой функции многокритериальной оптимизации представлено в таблице 4.
Таблица 4 — Целевая функция многокритериальной оптимизации
Имя |
Описание |
Тип |
Диапазон значений |
---|---|---|---|
name |
Название индекса оценки. |
Character string |
- |
get |
Скрипт для получения результатов оценки производительности. |
- |
- |
type |
Указывает положительный или отрицательный тип результата оценки. Значение positive указывает на то, что значение производительности минимально, а значение negative указывает на то, что значение производительности максимально. |
Enumeration |
positive или negative |
weight |
Вес индекса. |
Integer |
0-100 |
threshold |
Минимальные требования к производительности индекса. |
Integer |
Определяется пользователем. |
Таблица 5 — Описание доступных алгоритмов оптимизации
Примеры настройки серверных и клиентских файлов:Примеры настройки серверных и клиентских файлов:Обозначение в A-Tune |
Расшифровка |
Краткое описание |
Библиотека |
Справочный материал |
---|---|---|---|---|
bayes |
Байесовская линейная регрессия (англ. Bayesian linear regression). |
Подход в линейной регрессии, в котором предполагается, что шум распределен нормально. |
Нормальное распределение из sklearn |
https://ru.wikipedia.org/wiki/Байесовская_линейная_регрессия https://neerc.ifmo.ru/wiki/index.php?title=Вариации_регрессии |
gbrt |
Градиентный бустинг деревьев (англ. Gradient Boosting Regression Trees). |
Градиентный бустинг — это техника машинного обучения для задач классификации и регрессии, которая строит модель предсказания в форме ансамбля слабых предсказывающих моделей, обычно деревьев решений. |
sklearn |
http://neerc.ifmo.ru/wiki/index.php?title=XGBoost&mobileaction=toggle_view_desktop |
forest |
Случайные леса (англ. Random Forest Regressor). |
Множество решающих деревьев. В задаче регрессии их ответы усредняются. |
sklearn |
|
extraTrees |
Крайне рандомизированные деревья (Extra Trees Regressor). |
К множеству решающих деревьев добавляется случайность порогового значения для выбора ответа с каждого дерева. |
sklearn |
|
abtest |
А/В-тестирование. |
Значения параметров разбиваются на несколько групп, тестируется подстановка каждой группы и выбирается лучший результат. |
- |
|
tpe |
Древовидный парзеновский оценщик (Tree-structured Parzen Estimator (TPE)). |
В TPE задаются два различных распределения параметров: первое — при значениях целевой функции меньших, чем пороговое значение. Второе — при значениях целевой функции больших, чем пороговое значение. Далее параметры из каждого распределения образуют пару, и из каждой пары выбирается оптимальное значение. |
hyperopt |
https://neerc.ifmo.ru/wiki/index.php?title=Настройка_гиперпараметров |
gridsearch |
Поиск по сетке. |
Метод считает результат для каждого возможного сочетания значений параметров и в конце выбирает сочетание, при котором результат оптимальный. |
- |
https://neerc.ifmo.ru/wiki/index.php?title=Настройка_гиперпараметров |
lhs |
Выборка латинского гиперкуба (Latin hypercube sampling). |
Метод, который можно использовать для выборки случайных чисел, в котором выборки равномерно распределены по пространству выборки. |
lhsmdu |
Примеры настройки серверных и клиентских файлов:
Ниже приведен пример конфигурации файла YAML на сервере:
project: "compress"
maxiterations: 500
startworkload: ""
stopworkload: ""
object :
-
name : "compressLevel"
info :
desc : "The compresslevel parameter is an integer from 1 to 9 controlling the level of compression"
get : "cat /root/A-Tune/examples/tuning/compress/compress.py | grep 'compressLevel=' | awk -F '=' '{print $2}'"
set : "sed -i 's/compressLevel=\\s*[0-9]*/compressLevel=$value/g' /root/A-Tune/examples/tuning/compress/compress.py"
needrestart : "false"
type : "continuous"
scope :
- 1
- 9
dtype : "int"
-
name : "compressMethod"
info :
desc : "The compressMethod parameter is a string controlling the compression method"
get : "cat /root/A-Tune/examples/tuning/compress/compress.py | grep 'compressMethod=' | awk -F '=' '{print $2}' | sed 's/\"//g'"
set : "sed -i 's/compressMethod=\\s*[0-9,a-z,\"]*/compressMethod=\"$value\"/g' /root/A-Tune/examples/tuning/compress/compress.py"
needrestart : "false"
type : "discrete"
options :
- "bz2"
- "zlib"
- "gzip"
dtype : "string"
Ниже приведен пример настройки файла YAML на клиенте:
project: "compress"
engine : "gbrt"
iterations : 20
random_starts : 10
benchmark : "python3 /root/A-Tune/examples/tuning/compress/compress.py"
evaluations :
-
name: "time"
info:
get: "echo '$out' | grep 'time' | awk '{print $3}'"
type: "positive"
weight: 20
-
name: "compress_ratio"
info:
get: "echo '$out' | grep 'compress_ratio' | awk '{print $3}'"
type: "negative"
weight: 80
Другие примеры клиентских и серверных файлов находятся в директории /usr/share/doc/atune.
После того как подготовили файлы для поиска оптимальных параметров, нужно скопировать серверный файл в директорию /etc/atuned/tuning
. Файл клиента рекомендуется хранить в той папке, откуда запускается команда на поиск оптимальных параметров.
Для запуска оптимизации необходимо воспользоваться командой tuning
.
Общий вид команды поиска оптимальных параметров
atune-adm tuning --project [имя проекта, указанное в конфигурационных файлах] <опциональный параметр> имя_файла_клиента
Если файл клиента находится в другой директории, то последним параметром должно быть не имя файла клиента, а полный путь к нему.
Таблица 6 — Описание опциональных параметров для команды tuning
Параметр |
Описание |
---|---|
--restore, -r |
Восстановить первоначальную конфигурацию перед настройкой. |
--restart, -c |
Выполнить настройку на основе исторических результатов настройки. |
--detail, -d |
Вывести на экран подробную информацию о процессе настройки. |
--save имя_файла, -s имя_файла |
Указать имя файла для сохранения профиля. |
Пример использования динамического режима
Данный функционал был протестирован на различных рабочих нагрузках. Приведем пример, в котором производилась оптимизация параметров для работы сервера приложений Tomcat. За показания целевой функции взяли утилиту ab для оценки производительности (https://httpd.apache.org/docs/current/programs/ab.html).
Команда для бенчмарка
ab -n 8000 http://localhost:8080/
Для данной оптимизационной задачи файл сервера уже сгенерирован и находится в каталоге /etc/atuned/tuning. Файл клиента нужно составить самостоятельно:
Файл клиента "tomcat.yaml"
project: "tomcat"
engine : "gbrt"
iterations : 30
random_starts : 10
benchmark : "sh tomcat_benchmark.sh"
evaluations :
-
name: "rps"
info:
get: "echo '$out' | grep 'taken' | awk '{print $5}'"
type: "negative"
weight: 100
Чтобы запустить поиск оптимальных параметров для tomcat, нужно вызвать команду atune-adm:
Команда для поиска оптимальных параметров
atune-adm tuning --project tomcat --detail tomcat.yaml
Вывод команды tuning
Start to benchmark baseline...
1.Loading its corresponding tuning project: tomcat
2.Start to tuning the system......
Current Tuning Progress......(1/30)
Used time: 7s, Total Time: 7s, Best Performance: (rps=4.50), Performance Improvement Rate: -0.00%
The 1th recommand parameters is: vm.drop_caches=3,net.ipv4.tcp_tw_reuse=2,net.ipv4.tcp_fin_timeout=16,net.ipv4.tcp_max_tw_buckets=1015808,net.ipv4.ip_local_port_range=32768 60999,net.core.somaxconn=22144,net.ipv4.tcp_max_syn_backlog=251904,net.core.rmem_max=42991616,net.core.wmem_max=52428800,ulimit.nofile=8824,connector.maxThreads=1710,connector.minSpareThreads=55,connector.maxConnections=11700,connector.enableLookups=true,connector.acceptCount=1350,connector.connectionTimeout=23500,connector.maxHttpHeaderSize=71680,connector.tcpNoDelay=true,connector.compression=force,connector.compressionMinSize=23040,connector.disableUploadTimeout=false
The 1th evaluation value: (rps=1.82)(-59.56%)
Current Tuning Progress......(2/30)
Used time: 9s, Total Time: 9s, Best Performance: (rps=4.50), Performance Improvement Rate: -0.00%
The 2th recommand parameters is: vm.drop_caches=3,net.ipv4.tcp_tw_reuse=0,net.ipv4.tcp_fin_timeout=63,net.ipv4.tcp_max_tw_buckets=491520,net.ipv4.ip_local_port_range=8192 65535,net.core.somaxconn=41856,net.ipv4.tcp_max_syn_backlog=53248,net.core.rmem_max=3145728,net.core.wmem_max=42991616,ulimit.nofile=6490,connector.maxThreads=1370,connector.minSpareThreads=45,connector.maxConnections=8600,connector.enableLookups=true,connector.acceptCount=1300,connector.connectionTimeout=48000,connector.maxHttpHeaderSize=37888,connector.tcpNoDelay=true,connector.compression=on,connector.compressionMinSize=18432,connector.disableUploadTimeout=true
The 2th evaluation value: (rps=1.29)(-71.33%)
...
... итерация, на которой появилось улучшение ...
Current Tuning Progress......(14/30)
Used time: 54s, Total Time: 54s, Best Performance: (rps=4.50), Performance Improvement Rate: -0.00%
The 14th recommand parameters is: vm.drop_caches=3,net.ipv4.tcp_tw_reuse=1,net.ipv4.tcp_fin_timeout=22,net.ipv4.tcp_max_tw_buckets=917504,net.ipv4.ip_local_port_range=1024 65535,net.core.somaxconn=64128,net.ipv4.tcp_max_syn_backlog=37888,net.core.rmem_max=3145728,net.core.wmem_max=13631488,ulimit.nofile=10236,connector.maxThreads=1470,connector.minSpareThreads=140,connector.maxConnections=11500,connector.enableLookups=true,connector.acceptCount=1350,connector.connectionTimeout=56500,connector.maxHttpHeaderSize=60416,connector.tcpNoDelay=false,connector.compression=force,connector.compressionMinSize=24576,connector.disableUploadTimeout=true
The 14th evaluation value: (rps=2.16)(-52.00%)
Current Tuning Progress......(15/30)
Used time: 1m7s, Total Time: 1m7s, Best Performance: (rps=4.87), Performance Improvement Rate: 8.22%
The 15th recommand parameters is: vm.drop_caches=3,net.ipv4.tcp_tw_reuse=0,net.ipv4.tcp_fin_timeout=1,net.ipv4.tcp_max_tw_buckets=655360,net.ipv4.ip_local_port_range=8192 65535,net.core.somaxconn=57600,net.ipv4.tcp_max_syn_backlog=3072,net.core.rmem_max=27262976,net.core.wmem_max=18874368,ulimit.nofile=7119,connector.maxThreads=1710,connector.minSpareThreads=105,connector.maxConnections=11000,connector.enableLookups=false,connector.acceptCount=1350,connector.connectionTimeout=10000,connector.maxHttpHeaderSize=21504,connector.tcpNoDelay=true,connector.compression=on,connector.compressionMinSize=1536,connector.disableUploadTimeout=true
The 15th evaluation value: (rps=4.87)(8.22%)
...
... итоговый вывод ...
Current Tuning Progress......(30/30)
Used time: 3m24s, Total Time: 3m24s, Best Performance: (rps=4.87), Performance Improvement Rate: 8.22%
The 30th recommand parameters is: vm.drop_caches=1,net.ipv4.tcp_tw_reuse=2,net.ipv4.tcp_fin_timeout=92,net.ipv4.tcp_max_tw_buckets=622592,net.ipv4.ip_local_port_range=8192 65535,net.core.somaxconn=42624,net.ipv4.tcp_max_syn_backlog=87040,net.core.rmem_max=22020096,net.core.wmem_max=56623104,ulimit.nofile=3188,connector.maxThreads=1780,connector.minSpareThreads=45,connector.maxConnections=10100,connector.enableLookups=false,connector.acceptCount=650,connector.connectionTimeout=53000,connector.maxHttpHeaderSize=21504,connector.tcpNoDelay=false,connector.compression=force,connector.compressionMinSize=1536,connector.disableUploadTimeout=false
The 30th evaluation value: (rps=2.43)(-46.00%)
The final optimization result is: vm.drop_caches=3,net.ipv4.tcp_tw_reuse=0,net.ipv4.tcp_fin_timeout=1,net.ipv4.tcp_max_tw_buckets=655360,net.ipv4.ip_local_port_range=8192 65535,net.core.somaxconn=57600,net.ipv4.tcp_max_syn_backlog=3072,net.core.rmem_max=27262976,net.core.wmem_max=18874368,ulimit.nofile=7119,connector.maxThreads=1710,connector.minSpareThreads=105,connector.maxConnections=11000,connector.enableLookups=false,connector.acceptCount=1350,connector.connectionTimeout=10000,connector.maxHttpHeaderSize=21504,connector.tcpNoDelay=true,connector.compression=on,connector.compressionMinSize=1536,connector.disableUploadTimeout=true
The final evaluation value is: rps=4.87
Baseline Performance is: (rps=4.50)
Tuning Finished
Можем наблюдать, что автоматический поиск оптимальных параметров улучшил изначальные показания бенчмарка на 8,22%.
В A-Tune мы с командой доработали возможность сохранения значений оптимальных параметров в профиль для статического режима оптимизации, что позволило повысить удобство работы с утилитой.
Команда для сохранения профиля
atune-adm tuning --project tomcat --save tomcat_profile.conf
После этого можно сохранить профиль в список профилей A-Tune, и он станет доступен для применения.
Сохранить профиль в A-Tune
# в данном примере [тип сервиса] - servlet [название приложения] - tomcat [название пользовательского сценария] - optimized
atune-adm define servlet tomcat optimized tomcat_profile.conf
Если понадобится удалить профиль из A-Tune, то используем следующую команду.
Удалить профиль из A-Tune
atune-adm undefine servlet-tomcat-optimized
A-Tune изменяет параметры в системе во время оптимизации, поэтому в утилите предусмотрен механизм для возврата параметров в исходное состояние.
Возврат параметров в исходное состояние
atune-adm tuning --restore --project tomcat
Распределенный режим работы A-Tune
Еще одна возможность A-Tune — это распределенный режим работы, который представляет собой разнесение клиентских и серверных частей. Для взаимодействия между собой они используют TLS-протокол.
Из-за особенностей реализации меняются и команды для запуска: в обычном режиме команды A-Tune (например, analysis) будут запущены командой atune-adm analysis
, а в распределенном - atune-adm -a <ipv4 адрес сервера> -p <порт> analysis
. Настройка конфигурации происходит именно на сервере, в этом режиме A-Tune никак не влияет на клиентскую машину.
Пример команды для распределенного режима работы
atune-adm -a 10.0.2.6 -p 60001 analysis -t 5
Сравнение A-Tune и TuneD
Прародителем для утилиты A-Tune является популярный у администраторов инструмент TuneD от компании Red Hat, который также позволяет решать задачу тонкого тюнинга системы.
В TuneD используется конфигурационный файл, в котором вручную задаются условия для рекомендации того или иного профиля. Условия учитываются по следующему алгоритму:
Если указана опция virt, то вызывается
virt-what
.Если указана опция system, то поиск по регулярному выражению в файле
/etc/os-release
.Если строка начинается с «/», то производится поиск файла по заданному пути, проверяется его существование и поиск по регулярному выражению в этом файле.
Если указана опция process, то происходит поиск через
procfs.pidstats()
Если указана опция
chassis_type
, то выводится строка через/sys/devices/virtual/dmi/id/chassis_type,
или если не получается, то черезdmidecode -s chassis-type
. Потом в выведенной строке происходит поиск по регулярному выражению.
TuneD поддерживает статический и динамический режим работы. Динамический режим позволяет автоматически менять параметры системы в рамках заданного профиля. Например, переключать режим энергопотребления в зависимости от нагрузки на определенный компонент системы. Если пользователю необходимо более предсказуемое поведение, то следует установить статический режим, в котором TuneD не производит дополнительных настроек после применения профиля. В статическом режиме работы TuneD просто применяет в системе параметры, заданные в профиле.
В A-Tune и TuneD применение профилей отличается самим составом, набором и синтаксисом плагинов.
Таблица 6 — Сравнение A-Tune и TuneD
TuneD |
A-Tune |
---|---|
Стабильность | |
Стабильный проект от Red Hat. |
Относительно новый проект от открытого сообщества оpenEuler. |
Зрелость | |
Давно находится в разработке. |
В активной стадии разработки и доработки. |
Распространенность | |
Популярный и распространенный среди администраторов. |
Новый инструмент, мало распространен за пределами Китая. |
Функционал и технические возможности | |
Применение профиля в системе. |
Применение профиля в системе. |
Рекомендация профиля с помощью заданных пользователем правил. |
Рекомендация профиля с помощью методов машинного обучения. |
GUI для выбора и редактирования профилей |
|
Более широкий набор плагинов и настраиваемых параметров профилей. |
Меньшее количество плагинов и настраиваемых параметров профилей. |
Тренировка рекомендательной системы для узкопрофильных нагрузок. |
|
Поиск оптимальных параметров профиля. |
|
Сохранение оптимальных параметров в профиле. |
|
Распределенный режим работы. |
Заключение
После проделанной работы по изучению и доработке утилиты в ОС Astra Linux Special Edition 1.8 появился функционал для тюнинга и повышения производительности ОС. Использование в проекте алгоритмов машинного обучения и алгоритмов глобальной и локальной многокритериальной оптимизации призвано повысить эффективность подбора оптимальных параметров. Оно сделает тюнинг более гибким и позволит адаптироваться к изменяющимся нагрузкам. Также функционал, связанный с машинным обучением, расширяет сферу применения A-Tune по сравнению с TuneD, позволяет проводить собственные исследования в сфере тонкой настройки систем и работать с узкопрофильными нагрузками.
Эксперименты с функционалом A-Tune показали, что это приложение имеет большой потенциал в области оптимизации производительности систем.
DjAntony
В статье слово "параметр" встречается 83 раза... и ни слова - а что это за параметры системы такие волшебные?? только увидев бенчмарк, понял, что скорее всего параметры эти касаются в основном стека TCP/IP
Так и не понял, что именно подразумевается под "повышением производительности"?? эфемерный вывод самой этой утилиты практически не отражает никакой реальной картины
Я правильно понял, что про безопасность системы в версии 1.8 можно забыть??...)))
ЗЫ: Поясню: Вы встроили китайскую утилиту, которая ковыряется в ядре системы в вроде бы одну из самых защищенных российских ОС. т.е. пользователь, применивший данную утилиту, ради 0.37 rps (эфемерных подчеркиваю) рискует превратить сервер в тыкву
AstraLinux_Group Автор
Здравствуйте!
Работа с утилитой носит экспериментальный и исследовательский характер как с нашей стороны, так и со стороны пользователей. Наличие утилиты в серверном репозитории не влияет на защищенность системы, так как по умолчанию она нигде не установлена и не доступна в main репозитории. Пользователь может установить её, например, для подбора оптимальных значений в профиле tuned под свои задачи или для подбора оптимальных конфигураций серверного ПО. Всё перечисленное в статье относится только к системе с уровнем защищенности Орел.
В составе расширенного репозитория уже есть утилита tuneD, но мы продолжаем исследовать инструменты по повышению производительности. Об одном из таких исследований мы и рассказали. Кроме того, мы работаем не с бинарными файлами, а собираем из исходного кода, поэтому принцип работы самой утилиты мы изучали изнутри.