UPDATE 15.01.2024 YellowBalancer 1.4
Добавлена поддержка балансировки по numa-узлам в случае наличия только одной numa-группы.
UPDATE 04.02.2023 YellowBalancer 1.2
Добавлена поддержка работы в Windows Server 2019. Для тестирования доступа к процессам, конфигурации numa, счетчикам производительности добавлен режим запуска в консоли test. Благодарность Nabi911 за выявленную ошибку и содействие в исправлении.
UPDATE 06.11.2022 YellowBalancer 1.1
В версии 1.1 для решения о принятии балансировки используется информация о загрузке cpu по каждой numa группе. При запуске программы создаются файл settings.json с настройками по умолчанию (файл не совместим с файлом настроек от версии 1.0)
{ "switching_frequency_in_seconds" : 10, "cpu_analysis_period_in_seconds" : 60, "log_storage_duration_in_hours" : 24, "maximum_cpu_value" : 70, "delta_cpu_values" : 30, "processes" : ["rphost.exe"] }
switching_frequency_in_seconds - частота анализа выполнения балансировки, если необходимо (в секундах)
cpu_analysis_period_in_seconds - период скользящего окна загрузки CPU numa групп и USER_TIME процессов (в секундах)
log_storage_duration_in_hours - период хранения логов (в часах)
maximum_cpu_value - максимальное значение CPU любой numa группы, при котором принимается решение о балансировке (в процентах)
delta_cpu_values - разница потребления CPU между самой загруженной numa группой и самой незагруженной, при котором принимается решение о балансировке (в процентах)
processes - процессы, которые необходимо привязывать к numa группам.
Алгоритм балансировки:
1. Скользящим окном (длительность в параметре cpu_analysis_period_in_seconds) собирается загрузка CPU по numa группам. Показания cpu собираются раз в секунду.
2. Периодически (параметр switching_frequency_in_seconds) анализируются процессы, подлежащие балансировке (указанные в processes). По ним собирается потребление USER_TIME. Так же анализируется средняя загрузка CPU по каждой numa группе.
3. Если среднее значение CPU максимально загруженной numa группы превышает значение параметра maximum_cpu_value и разница CPU между самой загруженной numa группой и самой не загруженной превышает значение, указанное в параметре delta_cpu_values, то принимается решение о необходимости балансировки.
4. Процессы, подлежащие балансировке, сортируются по убыванию среднего USER_TIME и привязываются к numa группам по round robin.
YellowBalancer 1.0
При эксплуатации высоконагруженных систем на базе 1С:Предприятие на серверах, имеющих больше 64 процессоров и имеющих более одной группы NUMA столкнулись с неравномерным распределением процессов 1С по группам NUMA (см. скриншот "Потребление CPU без употребления потоками.png"). Для начала пробовали силами дежурной смены менять привязку процессов 1С:Предприятие к группам NUMA через Task Manager. Но это было возможно в основном только один раз. При повторной попытке через некоторое время возникала ошибка "Отказано в доступе". Было принято решение, использую API OS Windows, попробовать самим управлять распределением процессов и потоков по группам NUMA. В результате было создано приложение - служба windows. С результатом стороннего управления распределения загрузки по группам NUMA можно видеть на скриншоте "Потребление CPU с управлением потоками.png". Какого-то отрицательного воздействия при переключения thread с одной NUMA группы на другую замечено не было. Но т.к. процессоры стали загружаться более равномерно, то общая производительность системы выросла.
На текущий момент распределение процессов происходит следующим образом:
- Выбираются процессы, указанные в настройке "processes".
- Выбранные процессы сортируются по общему user time.
- Выбранные процессы распределяются по NUMA группам по алгоритму round robin.
Анализ загрузки CPU по NUMA группам при распределение процессов и потоков на текущий момент не используется.
С исходными кодами можно ознакомиться на Github. Для сборки необходима библиотека boost 1.79.0 или выше.
Проверено на ОС:
- Windows 10 Home Edition
- Windows Server 2012
- Windows Server 2016