A-Tune: тонкая настройка системы с использованием машинного обучения
Привет, Хабр!
Меня зовут Артём, я инженер-программист в департаменте серверных решений. В статье расскажу про новый инструмент для повышения производительности, который получилось портировать и доработать для ОС 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 [профиль]
Рисунок 1. Статический режим работы утилиты A-Tune. Определение профиля
Чтобы применить оптимальный профиль, нужно знать, какой из них лучше всего подходит под желаемый сценарий использования системы. Решить данную задачу призвана одна из главных особенностей утилиты — определение оптимального профиля с помощью классификаторов из 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 устанавливает параметры для целевого устройства и получает показатели эффективности обратной связи. Эти шаги повторяются до тех пор, пока не будут получены оптимальные параметры.
Ключевые особенности этого режима работы:
Автоматический выбор значимых параметров для уменьшения пространства поиска и повышения эффективности обучения.
Пользовательский выбор оптимального алгоритма в зависимости от сценария применения приложения, типов параметров и требуемой производительности.
Добавление характеристики текущей рабочей нагрузки и оптимальных параметров в базу знаний, чтобы улучшить эффективность последующего тюнинга.
Рисунок 2. Общие принципы функционирования динамического режима работы
Одно из условий запуска динамического режима работы — наличие конфигурационных 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 | https://scikit-learn.ru/1–11-ensemble-methods/ https://ru.wikipedia.org/wiki/Метод_случайного_леса |
extraTrees | Крайне рандомизированные деревья (Extra Trees Regressor). | К множеству решающих деревьев добавляется случайность порогового значения для выбора ответа с каждого дерева. | sklearn | https://scikit-learn.ru/1–11-ensemble-methods/ |
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 | https://www.codecamp.ru/blog/latin-hypercube-sampling/ |
Примеры настройки серверных и клиентских файлов:
Ниже приведен пример конфигурации файла 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
. Настройка конфигурации происходит именно на сервере, в этом режиме A-Tune никак не влияет на клиентскую машину.
Пример команды для распределенного режима работы
atune-adm -a 10.0.2.6 -p 60001 analysis -t 5
Рисунок 3. Расположение частей модуля в стандартном и распределенных режимах работы
Сравнение 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 показали, что это приложение имеет большой потенциал в области оптимизации производительности систем.