YellowBalancer: балансировщик процессов и потоков по группам NUMA

15.01.24

База данных - HighLoad оптимизация

Балансировщик распределения процессов 1С:Предприятия по процессорам групп NUMA (только для windows x64).

Скачать файлы

Наименование Файл Версия Размер
YellowBalancer 1.0: балансировщик процессов и потоков по группам NUMA (архив исполняемого файла)
.zip 293,49Kb
3
.zip 1.0 293,49Kb 3 Скачать
YellowBalancer 1.0: балансировщик процессов и потоков по группам NUMA (архив исходных кодов)
.zip 18,46Kb
1
.zip 1.0 18,46Kb 1 Скачать
YellowBalancer 1.1: балансировщик процессов и потоков по группам NUMA (архив исполняемого файла)
.zip 323,00Kb
2
.zip 1.1 323,00Kb 2 Скачать
YellowBalancer 1.1: балансировщик процессов и потоков по группам NUMA (архив исходных кодов)
.zip 23,50Kb
0
.zip 1.1 23,50Kb Скачать
YellowBalancer 1.2: балансировщик процессов и потоков по группам NUMA:
.zip 317,90Kb
5
.zip 1.2 317,90Kb 5 Скачать
YellowBalancer 1.2: балансировщик процессов и потоков по группам NUMA (архив исходных кодов)
.zip 24,19Kb
2
.zip 1.2 24,19Kb 2 Скачать
YellowBalancer 1.4: балансировщик процессов и потоков по группам NUMA:
.zip 322,61Kb
3
.zip 1.4 322,61Kb 3 Скачать

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 группы на другую замечено не было. Но т.к. процессоры стали загружаться более равномерно, то общая производительность системы выросла.

На текущий момент распределение процессов происходит следующим образом:

  1. Выбираются процессы, указанные в настройке "processes".
  2. Выбранные процессы сортируются по общему user time.
  3. Выбранные процессы распределяются по NUMA группам по алгоритму round robin.

Анализ загрузки CPU по NUMA группам при распределение процессов и потоков на текущий момент не используется.

С исходными кодами можно ознакомиться на Github. Для сборки необходима библиотека boost 1.79.0 или выше.

Проверено на ОС:

  • Windows 10 Home Edition
  • Windows Server 2012
  • Windows Server 2016

См. также

Оптимизация нагрузки на ЦП сервера СУБД используя типовые индексы

HighLoad оптимизация Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Анализ простого плана запроса. Оптимизация нагрузки на ЦП сервера СУБД используя типовые индексы.

13.03.2024    2998    spyke    27    

42

Быстродействие типовой 1С

HighLoad оптимизация Платформа 1С v8.3 Бесплатно (free)

Оказывается, в типовых конфигурациях 1С есть, что улучшить!

13.03.2024    5119    vasilev2015    19    

37

Анализируем SQL сервер глазами 1С-ника

HighLoad оптимизация Инструменты администратора БД Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Обработка для простого и удобного анализа настроек, нагрузки и проблем с SQL сервером с упором на использование оного для 1С. Анализ текущих зааросов на sql, ожиданий, конвертация запроса в 1с и рекомендации где может тормозить

1 стартмани

15.02.2024    7661    159    ZAOSTG    68    

96

Удаление строк из таблицы значений различными способами с замером производительности

HighLoad оптимизация Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Встал вопрос: как быстро удалить строки из ТЗ? Рассмотрел пять вариантов реализации этой задачи. Сравнил их друг с другом на разных объёмах данных с разным процентом удаляемых строк. Также сравнил с выгрузкой с отбором по структуре.

09.01.2024    5992    doom2good    48    

63

Опыт оптимизации 1С на PostgreSQL

HighLoad оптимизация Бесплатно (free)

При переводе типовой конфигурации 1C ERP/УТ/КА на PostgreSQL придется вложить ресурсы в доработку и оптимизацию запросов. Расскажем, на что обратить внимание при потерях производительности и какие инструменты/подходы помогут расследовать проблемы после перехода.

20.11.2023    8882    ivanov660    6    

76

ТОП проблем/задач у владельцев КОРП лицензий 1С на основе опыта РКЛ

HighLoad оптимизация Бесплатно (free)

Казалось бы, КОРП-системы должны быть устойчивы, быстры и надёжны. Но, работая в рамках РКЛ, мы видим немного другую картину. Об основных болевых точках КОРП-систем и подходах к их решению пойдет речь в статье.

15.11.2023    5110    a.doroshkevich    20    

72

Начните уже использовать хранилище запросов

HighLoad оптимизация Запросы

Очень немногие из тех, кто занимается поддержкой MS SQL, работают с хранилищем запросов. А ведь хранилище запросов – это очень удобный, мощный и, главное, бесплатный инструмент, позволяющий быстро найти и локализовать проблему производительности и потребления ресурсов запросами. В статье расскажем о том, как использовать хранилище запросов в MS SQL и какие плюсы и минусы у него есть.

11.10.2023    16197    skovpin_sa    14    

98
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. cdiamond 233 10.10.22 09:38 Сейчас в теме
Хотелось бы увидеть результаты нагрузочных тестов с балансировщиком и без него. Каков реальный прирост с именно с пользовательской точки зрения?
AllexSoft; +1 Ответить
2. sdf1979 195 10.10.22 17:32 Сейчас в теме
(1)Вечер добрый. Когда все rphost'ы на одной Numa группе, которая в итоге загружена в 100% cpu, а вторая группа загружена на 5-10% - какое тут может быть нагрузочное тестирование? Доходит до того, что снимаются дампы с нулевым смещением из-за фриза рабочих процессов. Отдаем себе отчёт, что переключение thread не бесплатно, поэтому в планах внедрить более интеллектуальное переключение.
3. cdiamond 233 10.10.22 17:47 Сейчас в теме
(2) Если фризы то конечно дело плохо.
Я задавая вопрос имел ввиду что если нагрузка не такая экстремальная и если учитывать что процессы rphost используют также и разделяемую память, то доступ к этой памяти от "дальнего" узла NUMA будет стоить гораздо больше, чем для "ближнего" узла, поэтому одна часть rphostов по идее должна быть быстрой, а другая часть наоборот медленнее, а если медленный rphost будет еще и блокировки накладывать, то результат может быть непредсказуемым. Поэтому интересен результат пользовательский.
Update Кстати можно же наверно реализовать так, чтобы все процессы раскидывало с учетом баз, т.е. все процессы одной базы были на одном узле, вторая база на другом и т.д.?
4. sdf1979 195 10.10.22 21:40 Сейчас в теме
(3)Управлять можно достаточно гибко. API позволяет привязывать не только process, но и thread к Numa группе и конкретному логическому процессору, т.к. называемая affinity mask. У нас проблемы возникают на рабочем сервере, где только фоновые задачи. На них две Numa группы. Мы стараемся держать четное количество рабочих процессов. Поэтому такое простое распределение нам очень зашло. Хотелось бы действительно провести нагрузочное тестирование до и после переезда, но пока не хватает и рук и времени.
5. Дмитрий74Чел 234 11.10.22 09:24 Сейчас в теме
А вы пробовали писать в техподдержку 1С? Хотелось бы чтобы вендор решал проблему, а не самим придумывать обходные пути.
6. sdf1979 195 11.10.22 10:09 Сейчас в теме
(5)Про эту проблему вендор знает давно. И даже если вот прям сейчас начнет её решать, то нужно будет ждать нового релиза. А у нас проблема здесь и сейчас.
Upiterus; brr; +2 Ответить
7. triviumfan 93 11.10.22 11:50 Сейчас в теме
Платформа старовата, конечно, но наверняка они так и не исправили распределение нагрузки между numa.
Рарус когда-то предлагал изменить настройки в BIOS параметра NUMA Group Size Optimization с Clustered на Flat
ВайзАдвайз предлагает манипулировать количеством рабочих процессов (хз причём тут это).
А вообще тема интересная. Лайкос.
ЗЫ: А платформа ведь не корп?
8. sdf1979 195 11.10.22 15:05 Сейчас в теме
(7)Платформа то КОРП. Но балансировщику все равно, хоть процессы notepad раскидывать.
9. Lars Ulrich 615 11.10.22 18:44 Сейчас в теме
(7) Возможность настройки в BIOS как в примере у Раруса может варьироваться между производителями аппаратной части. В статье речь шла именно про HP, а, например, у Dell раньше такого не было.

Манипуляция с количеством рабочих процессов на практике действительно работала, утилизация повышалась. Но в этом случае появлялись накладные расходы на обслуживание большого количества самих рабочих процессов.
10. sdf1979 195 11.10.22 19:30 Сейчас в теме
(9)У нас Dell, админы сказали нет такой возможности. Два сокета по 18 процов. Итого с гипертрейлингом 72 на все. И всегда будет две группы Numa.
12. triviumfan 93 12.10.22 11:22 Сейчас в теме
(9)
Манипуляция с количеством рабочих процессов на практике действительно работала

И успешно работает, Антон Дорошкевич подтвердил.
11. geron4 193 12.10.22 08:50 Сейчас в теме
Насколько мне известно, 1С никак не решает проблему неравномерной загрузки ядер CPU, когда количество выделенных ядер для виртуальной машины превышает значение NUMA. Решение давно существует, делайте кластер 1С из нескольких ВМ, на ВМ не превышайте значение NUMA, т.е. кол-во vCPU <= NUMA.
triviumfan; +1 Ответить
13. sdf1979 195 12.10.22 16:19 Сейчас в теме
(11)К сожелению ВМ не бесплатна с точки зрения cpu.
14. moksxxx 16.10.22 15:30 Сейчас в теме
Возможно программа "Process Lasso" как-то решит проблему.
15. sdf1979 195 16.10.22 16:26 Сейчас в теме
(14)Думаю решит, но есть нюанс - требуемый функционал платный.
16. moksxxx 17.10.22 00:45 Сейчас в теме
(15) Если надо ВСЁ лицензионное и 11 000 руб серверная лицензия Process Lasso за бессрочную лицензию, которая включает в себя все будущие версии продукта (Lifetime licenses https://bitsum.com/get-process-lasso-server-edition/), для организации имеющей сервер с 64 проц., лицензии на M$ сервер и M$ SQL, лицензии на сервер 1С и конфигурации, такая проблема, то возникает вопрос - а надо ли связываться с такой организацией, рассчитывающей поиметь все свои хотелки ещё и задаром, так мечтать вроде как еще не запретили...
17. sdf1979 195 17.10.22 09:51 Сейчас в теме
(16)Давайте не переходить к обсуждению организации и что она себе может позволить. Есть проблема, она успешно решена собственными силами. Исходные коды решения выложены на Github. Кто хочет - можно использовать как есть, можно свою ветку сделать. А можно купить и Process Lasso (с закрытым исходным кодом) и использовать его. Каждый делает выбор тот, который считает наиболее приемлемым.
18. Shmell 533 02.12.22 07:21 Сейчас в теме
Небольшой вопрос автору:

Имеется 3 Numa узла по 6 ядер. На третьем Numa узле - привязан mssql сервер. Лицензия 1С - Проф. Как отработает служба YellowBalancer? Она возьмет все rphost и раскидает по всем доступным трем узлам? Можно ли ограничить количество узлов или задать в настройках - на какие узлы раскидывать?
19. sdf1979 195 05.12.22 14:54 Сейчас в теме
(18) День добрый. На текущий момент в балансировке участвуют все numa группы, настройки по каким numa группам балансировать нет.
20. Nabi911 13.01.23 13:12 Сейчас в теме
Добрый день, попробовали балансировщик версия 1.1 используется Windows server 2019 , в логах системы идет следующая ошибка

2023-01-13 01:32:06.448;ERROR;Error get numa groups for process
2023-01-13 01:32:16.472;INFO;AVG for \\SERVER-001\Processor Information(_Total)\% Processor Time=53.207341
2023-01-13 01:32:16.476;INFO;AVG for \\SERVER-001\Processor Information(0,_Total)\% Processor Time=97.391672
2023-01-13 01:32:16.482;INFO;AVG for \\SERVER-001\Processor Information(1,_Total)\% Processor Time=9.023011
2023-01-13 01:32:16.486;INFO;AVG USER_TIME=12265625 for process rphost.exe with pid 18852
2023-01-13 01:32:16.491;INFO;AVG USER_TIME=364583 for process rphost.exe with pid 23332
2023-01-13 01:32:16.495;INFO;AVG USER_TIME=338541 for process rphost.exe with pid 38592
2023-01-13 01:32:16.498;INFO;AVG USER_TIME=312500 for process rphost.exe with pid 11420
2023-01-13 01:32:16.502;INFO;AVG USER_TIME=234375 for process rphost.exe with pid 46088
2023-01-13 01:32:16.506;INFO;AVG USER_TIME=208333 for process rphost.exe with pid 39612
2023-01-13 01:32:16.511;INFO;AVG USER_TIME=130208 for process rphost.exe with pid 31896
2023-01-13 01:32:16.515;ERROR;Error get numa groups for process

балансировщик запущен как приложение с правами Администратора, settings.json из примера. Можете подсказать в чем проблема? Система 2-х процессорная
21. sdf1979 195 04.02.23 17:14 Сейчас в теме
(20)Добрый день, ошибку поправил. Спасибо за обращение.
22. hudojnic 20.03.23 12:20 Сейчас в теме
Доброго дня!

Столкнулись с проблемой при которой при многократном назначении numa групп одному процессу, в какой-то момент очередная установка affinty для этого процесса становиться невозможна как этой программой, так и через диспетчер задач:

2023-03-17 05:38:03.451;INFO;AVG USER_TIME=91991041666 for process rphost.exe with pid 40004
2023-03-17 05:39:14.120;INFO;AVG USER_TIME=2901666666 for process rphost.exe with pid 18660
2023-03-17 05:40:23.877;INFO;AVG USER_TIME=12578125 for process rphost.exe with pid 37936
2023-03-17 05:41:32.170;INFO;rphost.exe;pid=40004;numa=[0];new numa=[0]
2023-03-17 05:42:26.847;INFO;rphost.exe;pid=18660;numa=[0,1];new numa=[1]
2023-03-17 05:43:23.035;ERROR;Error set thread affinity!
2023-03-17 05:44:06.150;INFO;rphost.exe;pid=37936;numa=[0,1];new numa=[0]
2023-03-17 05:45:02.400;ERROR;Error set thread affinity!

Есть идеи или может кто подсказать как избежать проблемы?
23. sdf1979 195 21.03.23 11:13 Сейчас в теме
(22)Добрый день!
Какую версию используете? Какая версия windows server?
24. hudojnic 22.03.23 17:10 Сейчас в теме
(23)
акая версия windows server?

Последнюю доступную на GitHub на 10 марта. Сервер 2019 Standart. Заметили что если просто менять руками через диспетчер affinity mask для rphost'а, то через некоторое количество операций смены может возникнуть ошибка access denied. С чем связано пока не понятно.
25. sdf1979 195 29.03.23 09:32 Сейчас в теме
(24)Добрый день! Сейчас в случае невозможность установить привязку для thread в лог выводится результат функции заглушки "ERROR;Error set thread affinity!" без описания ошибки. На наших серверах воспроизвести не удалось. Написал в личку, если есть возможность можно попробовать локализовать ошибку и исправить её.
26. user2035136 10.01.24 12:09 Сейчас в теме
Скрипт всегда кидает с 0 numa на 0, хотя видит numa 1
Вывод консоли
27. sdf1979 195 10.01.24 18:10 Сейчас в теме
(26) Не сталкивались с подобным поведением. Напишите в личку, что бы не разводить полемику тут, постараюсь помочь.
28. sdf1979 195 15.01.24 18:44 Сейчас в теме
(26) В версии 1.4 добавлена возможность балансировки по numa-узлам при единственной numa-группе.
Оставьте свое сообщение