Всем привет!
Есть скрипт, который работает в 200 потоков: 180 потоков без браузера (http-клиент) и еще 20 потоков с браузером.
Все потоки постоянно активны: парсят, работают с БД, перезапускаются при необходимости и т.д.
Текущие параметры сервера: 24х4 ГГц, 24 Гб RAM, SSD-диск
Текущая нагрузка на сервере: ~35% по ЦП и ~50% по памяти (это средние данные по часу, которые дает хостер).
Проблема
Скрипт периодически подвисает, что выражается в задержке выполнения действий внутри потоков на 0.5-3 сек (что критично для моего скрипта). Задержки встречаются чаще в моменты высокой нагрузки (очевидно): когда много потоков перезапускаются или когда много потоков массово одновременно что-то делают.
Что уже сделано
- Давно выставлен плавный старт браузеров, не более 1 одновременно
- Отжата галка "Перезапускать процесс в начале работы потока"
- Я пробовал другой более мощный сервер (32 ядра, 120 ГБ памяти, NVMe диск) - ничего не меняется.
- Уменьшение числа потоков ниже примерно 130-140 штук сильно улучшает ситуацию и задержек почти нет, но это не вариант (хотелось бы еще больше, чем 200 потоков).
Вопрос: в какую сторону можно еще покопать, чтобы улучшить производительность и уменьшить задержки? Может ли помочь разделение скрипта на два по 100 потоков и запуск на одном сервере? Может для BAS на 200 потоков нужно какое-то особенное железо? В общем буду рад любым советам и наводкам.