Способы увеличения производительности в многопоточном режиме (200 потоков)

Поддержка
  • Всем привет!

    Есть скрипт, который работает в 200 потоков: 180 потоков без браузера (http-клиент) и еще 20 потоков с браузером.
    Все потоки постоянно активны: парсят, работают с БД, перезапускаются при необходимости и т.д.
    Текущие параметры сервера: 24х4 ГГц, 24 Гб RAM, SSD-диск
    Текущая нагрузка на сервере: ~35% по ЦП и ~50% по памяти (это средние данные по часу, которые дает хостер).

    Проблема
    Скрипт периодически подвисает, что выражается в задержке выполнения действий внутри потоков на 0.5-3 сек (что критично для моего скрипта). Задержки встречаются чаще в моменты высокой нагрузки (очевидно): когда много потоков перезапускаются или когда много потоков массово одновременно что-то делают.

    Что уже сделано

    1. Давно выставлен плавный старт браузеров, не более 1 одновременно
    2. Отжата галка "Перезапускать процесс в начале работы потока"
    3. Я пробовал другой более мощный сервер (32 ядра, 120 ГБ памяти, NVMe диск) - ничего не меняется.
    4. Уменьшение числа потоков ниже примерно 130-140 штук сильно улучшает ситуацию и задержек почти нет, но это не вариант (хотелось бы еще больше, чем 200 потоков).

    Вопрос: в какую сторону можно еще покопать, чтобы улучшить производительность и уменьшить задержки? Может ли помочь разделение скрипта на два по 100 потоков и запуск на одном сервере? Может для BAS на 200 потоков нужно какое-то особенное железо? В общем буду рад любым советам и наводкам.

  • Особо не понятно, потоки браузера тормозят или httpclient'a ?
    Не перезапускай потоки с клиентом, пусть в цикле работают.

  • @Int64 said in Способы увеличения производительности в многопоточном режиме (200 потоков):

    Особо не понятно, потоки браузера тормозят или httpclient'a ?
    Не перезапускай потоки с клиентом, пусть в цикле работают.

    Тормозят все потоки. Но 180 http-потоков выполняют основные задачи и задержки видны именно на них. Спасибо за совет, можно попробовать. Но задержки есть и в моменты, когда нет никаких перезапусков (просто в моменты перезапусков они сильнее), как с этим быть не ясно.

  • Чуть подробнее о том, в чем выражается задержка. Есть момент (допустим 18-00-00-000), в который 100 потоков должны отправить определенный http-запрос. Они "ждут" этот момент с помощью цикла while, который проверяет текущее время каждые 100 мс. Реальное время отправки этих 100 http-запросов составляет не 18-00-00-000 - 18-00-00-100, как можно было бы предположить, а 18-00-00-000 - 18-00-03-000, то есть разброс в 3 секунды вместо 100 мс.

  • @doupiu спроси у неройсетей, какую нагрузку создает браузер и http клиент в windows кроме cpu и оперативной памяти.

  • @FastSpace Сеть, диск, GPU (GPU очень мало, т.к. браузеров минимум). Вы хотели намекнуть на что-то конкретное?

  • @doupiu мож чёт такое поможет
    https://t.me/BablosoftchatRU/414761

  • @doupiu как вариант, если вы используете внутри потоков код на nodejs, то это может быть узким местом для многопоточности, так как выполнение nodejs однопоточное.

  • @Q_Q это точно не поможет. При таких настройках, будет 180 папок, в которых будет копиться кеш, который через некоторое время будет "палить" и ломать логику (например будут видны запросы от предыдущих профилей). Мало того, кеш используется в каждом профиле по отдельности, так что никуда они не лезут "в одну папку".

  • @doupiu said in Способы увеличения производительности в многопоточном режиме (200 потоков):

    в какую сторону можно еще покопать, чтобы улучшить производительность и уменьшить задержки?

    Вариант - разбить на две копии по 90 потоков.

  • @doupiu

    BAS работает в один поток(основной процесс), если если он тормозит, то тормозит все. Масштабироваться можно только запуском множества копий одной и той же программы, но из разных папок.

  • @Ajshma said in Способы увеличения производительности в многопоточном режиме (200 потоков):

    @doupiu как вариант, если вы используете внутри потоков код на nodejs, то это может быть узким местом для многопоточности, так как выполнение nodejs однопоточное.

    Спасибо, помогла замена кубиков Node.js на чистый JS (Выполнить код). Хз почему, ведь JS же тоже однопоточный вроде 🤷

  • 0 Votes
    3 Posts
    501 Views
  • 0 Votes
    6 Posts
    535 Views
  • 0 Votes
    4 Posts
    482 Views
  • 0 Votes
    12 Posts
    1458 Views
  • 0 Votes
    7 Posts
    1653 Views