Нагрузка ЦП 100% на запросах

  • Автор темы Автор темы dihard
  • Дата начала Дата начала

dihard

Client
Регистрация
08.11.2019
Сообщения
318
Реакции
51
Баллы
28
Добрый день, появилась такая проблема, есть шаблон работает без браузера. При 100 потоках нагрузка на ЦП за 1-2 минуты возрастает до 100%.
Есть ли какие-то способы снизить ее. И в чем может быть дело, почему шаблон на GET запросах так много потребляет.

Что используется в проекте JSON, GET, Regex и работа с текстом
 
Последнее редактирование:
Добрый день, появилась такая проблема, есть шаблон работает без браузера. При 100 потоках нагрузка на ЦП за 1-2 минуты возрастает до 100%.
Есть ли какие-то способы снизить ее. И в чем может быть дело, почему шаблон на GET запросах так много потребляет.

Что используется в проекте JSON, GET, Regex и работа с текстом
Что бы вам ответили по теме, нужно:

1. Отправлять пример шаблона и как повторить проблему
2. Давать ссылку запроса что бы могли повторить проблему
3. Если выше дать не можете, хотя бы пример шаблона но с другим сайтом, что бы убедится что на всех сайтах у вас такая же проблема
4. Дать характеристики вашего пк\сервера (+версию винды) - и уточнить то ли это виртуалка, то ли выделенный сервер, то ли домашний пк
5. Отправить скрин диспетчера задач и показать что конкретно у вас нагружает ЦП
6. Написать версию зеннопостера и что еще паралельно было запущено

И в таком случае у вас будет шанс что бы вам оперативно ответили
 
  • Спасибо
Реакции: dihard
Добрый день, появилась такая проблема, есть шаблон работает без браузера. При 100 потоках нагрузка на ЦП за 1-2 минуты возрастает до 100%.
Есть ли какие-то способы снизить ее. И в чем может быть дело, почему шаблон на GET запросах так много потребляет.

Что используется в проекте JSON, GET, Regex и работа с текстом
Запросы как отправляются ? Встроенный кубик, библа какая на c# или курл ?
 
  • Спасибо
Реакции: dihard
Да, Regex действительно может приводить к загрузке ЦП.
Есть 4 возможных пути, на мой взгляд:

1. Если используете 1 файл большого объема - разбейте на несколько маленьких.
2. Заменить регулярку на более простую (уже говорили выше)
3. Если файл маленький используйте стандартные списки в таком режиме, а не берите строки напрямую с файла через метод по типу "FileSystem.FileGetLines"
4. Используйте при работе стандартные списки в таком режиме
w5TnkGrYT7eM4WwCxhPhiw.png
 
  • Спасибо
Реакции: dihard
Запросы как отправляются ? Встроенный кубик, библа какая на c# или курл ?
Запросы отправляются через кубик C# методом HttpGet . Получается через цикл for 20 сайтов по 2 GET запросы на каждый. И в этом же цикле делается regex на каждый GET запрос
 
Последнее редактирование:
Да, Regex действительно может приводить к загрузке ЦП.
Есть 4 возможных пути, на мой взгляд:

1. Если используете 1 файл большого объема - разбейте на несколько маленьких.
2. Заменить регулярку на более простую (уже говорили выше)
3. Если файл маленький используйте стандартные списки в таком режиме, а не берите строки напрямую с файла через метод по типу "FileSystem.FileGetLines"
4. Используйте при работе стандартные списки в таком режиме
w5TnkGrYT7eM4WwCxhPhiw.png
Спасибо за Ваш комментарий, первые 2 пункта понял, а вот 3-4 немного не понял про стандартный списки. Я использую кубик c# и через lock беру строку с удалением. В кубике получается 3-4 строчки. В самом файле очень много строк более 100 тыс
 
Что бы вам ответили по теме, нужно:

1. Отправлять пример шаблона и как повторить проблему
2. Давать ссылку запроса что бы могли повторить проблему
3. Если выше дать не можете, хотя бы пример шаблона но с другим сайтом, что бы убедится что на всех сайтах у вас такая же проблема
4. Дать характеристики вашего пк\сервера (+версию винды) - и уточнить то ли это виртуалка, то ли выделенный сервер, то ли домашний пк
5. Отправить скрин диспетчера задач и показать что конкретно у вас нагружает ЦП
6. Написать версию зеннопостера и что еще паралельно было запущено

И в таком случае у вас будет шанс что бы вам оперативно ответили
Спасибо за Ваш комментарий, если проблему не удастся решить, буду выполнять Ваши пункты. Если проблему решу отвечу в этой теме, может кому поможет, если тоже столкнется с этим
 
Для понимания, упрощенная версия логики кубика на c# , это основной код и 90% всего шаблона в нем

C#:
Развернуть Свернуть Копировать
IZennoTable table = project.Tables["tb"]; // Беру таблицу

var jsonData = project.Json[0][1]; // Упрощаю JSON, чтобы на прямую не обращаться к нему

int data = jsonData.Count; //Определяю количество строк

if (data > 0) { //Проверка на ноль

  for (int i = 1; i < data; i++) { //Обход всех строк JSON

    var EData = jsonData[i][14]; // Второе упрощение JSON

    //Блоки обработка текста JSON

    string data1 = EData[5]?.ToString() ?? string.Empty;

    string data2 = EData[9]?.ToString() ?? string.Empty;

    string data3 = EData[3]?.ToString() ?? string.Empty;

    string data4 = EData[6]?.ToString() ?? string.Empty;

    //Последний блок GET запросы на сайты

    string url = EData[2]?.ToString();

    Html = ZennoPoster.HttpGet(url, "", "utf-8", InterfacesLibrary.Enums.Http.ResponceType.BodyOnly, 5000, "", "", true, 3);

    string Pattern = @ "[РЕГУЛЯРКА]";

    Match regMatch = Regex.Match(Html, Pattern, RegexOptions.IgnoreCase);

    if (regMatch.Success) {

      PageUrl = regMatch.Groups[1].Value;

      // Если URL относительный, преобразуем его в абсолютный

      if (!PageUrl.StartsWith("http")) {

        Uri baseUri = new Uri(url);

        PageUrl = new Uri(baseUri, PageUrl).ToString();

      }

      //2 GET

      string Html2 = ZennoPoster.HttpGet(PageUrl, "", "utf-8", InterfacesLibrary.Enums.Http.ResponceType.BodyOnly, 5000, "", "", true, 3);

      string Pattern2 = @ "[РЕГУЛЯРКА2]";

      MatchCollection reg2Matches = Regex.Matches(Html2, Pattern2);

      HashSet < string > unique = new HashSet < string > ();

      foreach(Match reg2Matche in reg2Matches) {

        unique.Add(reg2Matche.Value); // Добавляем в HashSet

      }

      data5 = string.Join("\n", unique);

    }
 
Последнее редактирование:
Для понимания, упрощенная версия логики кубика на c# , это основной код и 90% всего шаблона в нем

C#:
Развернуть Свернуть Копировать
IZennoTable table = project.Tables["tb"]; // Беру таблицу

var jsonData = project.Json[0][1]; // Упрощаю JSON, чтобы на прямую не обращаться к нему

int data = jsonData.Count; //Определяю количество строк

if (data > 0) { //Проверка на ноль

  for (int i = 1; i < data; i++) { //Обход всех строк JSON

    var EData = jsonData[i][14]; // Второе упрощение JSON

    //Блоки обработка текста JSON

    string data1 = EData[5]?.ToString() ?? string.Empty;

    string data2 = EData[9]?.ToString() ?? string.Empty;

    string data3 = EData[3]?.ToString() ?? string.Empty;

    string data4 = EData[6]?.ToString() ?? string.Empty;

    //Последний блок GET запросы на сайты

    string url = EData[2]?.ToString();

    Html = ZennoPoster.HttpGet(url, "", "utf-8", InterfacesLibrary.Enums.Http.ResponceType.BodyOnly, 5000, "", "", true, 3);

    string Pattern = @ "[РЕГУЛЯРКА]";

    Match regMatch = Regex.Match(Html, Pattern, RegexOptions.IgnoreCase);

    if (regMatch.Success) {

      PageUrl = regMatch.Groups[1].Value;

      // Если URL относительный, преобразуем его в абсолютный

      if (!PageUrl.StartsWith("http")) {

        Uri baseUri = new Uri(url);

        PageUrl = new Uri(baseUri, PageUrl).ToString();

      }

      //2 GET

      string Html2 = ZennoPoster.HttpGet(PageUrl, "", "utf-8", InterfacesLibrary.Enums.Http.ResponceType.BodyOnly, 5000, "", "", true, 3);

      string Pattern2 = @ "[РЕГУЛЯРКА2]";

      MatchCollection reg2Matches = Regex.Matches(Html2, Pattern2);

      HashSet < string > unique = new HashSet < string > ();

      foreach(Match reg2Matche in reg2Matches) {

        unique.Add(reg2Matche.Value); // Добавляем в HashSet

      }

      data5 = string.Join("\n", unique);

    }
А регулярка сложная ?
Json в этом коде откуда берется ? Парсится где и как, насколько жирный ?

Я бы искал методом исключения. Сначала убрал бы запросы и регулярку, проверить для начала json
Потом бы запросы добавил без регулярки. Ну в общем можно и наоборот , это уже как удобнее.
 
Для понимания, упрощенная версия логики кубика на c# , это основной код и 90% всего шаблона в нем

C#:
Развернуть Свернуть Копировать
IZennoTable table = project.Tables["tb"]; // Беру таблицу

var jsonData = project.Json[0][1]; // Упрощаю JSON, чтобы на прямую не обращаться к нему

int data = jsonData.Count; //Определяю количество строк

if (data > 0) { //Проверка на ноль

  for (int i = 1; i < data; i++) { //Обход всех строк JSON

    var EData = jsonData[i][14]; // Второе упрощение JSON

    //Блоки обработка текста JSON

    string data1 = EData[5]?.ToString() ?? string.Empty;

    string data2 = EData[9]?.ToString() ?? string.Empty;

    string data3 = EData[3]?.ToString() ?? string.Empty;

    string data4 = EData[6]?.ToString() ?? string.Empty;

    //Последний блок GET запросы на сайты

    string url = EData[2]?.ToString();

    Html = ZennoPoster.HttpGet(url, "", "utf-8", InterfacesLibrary.Enums.Http.ResponceType.BodyOnly, 5000, "", "", true, 3);

    string Pattern = @ "[РЕГУЛЯРКА]";

    Match regMatch = Regex.Match(Html, Pattern, RegexOptions.IgnoreCase);

    if (regMatch.Success) {

      PageUrl = regMatch.Groups[1].Value;

      // Если URL относительный, преобразуем его в абсолютный

      if (!PageUrl.StartsWith("http")) {

        Uri baseUri = new Uri(url);

        PageUrl = new Uri(baseUri, PageUrl).ToString();

      }

      //2 GET

      string Html2 = ZennoPoster.HttpGet(PageUrl, "", "utf-8", InterfacesLibrary.Enums.Http.ResponceType.BodyOnly, 5000, "", "", true, 3);

      string Pattern2 = @ "[РЕГУЛЯРКА2]";

      MatchCollection reg2Matches = Regex.Matches(Html2, Pattern2);

      HashSet < string > unique = new HashSet < string > ();

      foreach(Match reg2Matche in reg2Matches) {

        unique.Add(reg2Matche.Value); // Добавляем в HashSet

      }

      data5 = string.Join("\n", unique);

    }
Предположение: Вы работаете с таблицей, а таблица может работать паралельно только с одним потоком, поэтому и может зависать так как стоит в очереди в таблицу, еще и на запросах, где скорость исчесляется в секундах, а вы в 100 потоков...

Переведите например на блокнот или .csv как текстовик и будет вам счастье, либо на базу данных mysql.

Если нужно в таблицу сохранять, ну тогда создавайте сначала для каждого потока допустим отдельный с# список а в конце заливку попробуйте делать, если не поможет, тогда заливайте в отдельные таблицы каждому потоку, а в конце уже обьедените.

Так же вы точно отключили использование инстанса в боте? Если у вас браузерное окно появляется при старте бота, значит они и кушают ваш цп
 
  • Спасибо
Реакции: dihard
Предположение: Вы работаете с таблицей, а таблица может работать паралельно только с одним потоком, поэтому и может зависать так как стоит в очереди в таблицу, еще и на запросах, где скорость исчесляется в секундах, а вы в 100 потоков...

Переведите например на блокнот или .csv как текстовик и будет вам счастье, либо на базу данных mysql.

Если нужно в таблицу сохранять, ну тогда создавайте сначала для каждого потока допустим отдельный с# список а в конце заливку попробуйте делать, если не поможет, тогда заливайте в отдельные таблицы каждому потоку, а в конце уже обьедените.

Так же вы точно отключили использование инстанса в боте? Если у вас браузерное окно появляется при старте бота, значит они и кушают ваш цп
Спасибо за комментарий, стоит попробывать., я замечал что если 1 поток долльше обрабатывает json, остальные тоже ждут. Стоит попробывать.
Стоит не использывать браузер
 
А регулярка сложная ?
Json в этом коде откуда берется ? Парсится где и как, насколько жирный ?

Я бы искал методом исключения. Сначала убрал бы запросы и регулярку, проверить для начала json
Потом бы запросы добавил без регулярки. Ну в общем можно и наоборот , это уже как удобнее.
Я бы не сказал, регулярки простые, json не жирный
 
Спасибо за комментарий, стоит попробывать., я замечал что если 1 поток долльше обрабатывает json, остальные тоже ждут. Стоит попробывать.
Стоит не использывать браузер
У тебя сверхнагрузка на ЦП , а не зависание потоков...
Ну сам подумай, если потоки ожидают друг друга в очереди, нагрузка же должна быть как у одного потока...

Гадать можно до бесконечности, уходя от темы в такие дали, что уххх... Но тебе надо делать отладку... По шагам исключая в коде части логики... Так и выйдешь на проблемную часть. А как выйдешь, уже скидывай сюда что нашел , опять будем репу чесать.
 
  • Спасибо
Реакции: dihard
Для понимания, упрощенная версия логики кубика на c# , это основной код и 90% всего шаблона в нем

C#:
Развернуть Свернуть Копировать
IZennoTable table = project.Tables["tb"]; // Беру таблицу

var jsonData = project.Json[0][1]; // Упрощаю JSON, чтобы на прямую не обращаться к нему

int data = jsonData.Count; //Определяю количество строк

if (data > 0) { //Проверка на ноль

  for (int i = 1; i < data; i++) { //Обход всех строк JSON

    var EData = jsonData[i][14]; // Второе упрощение JSON

    //Блоки обработка текста JSON

    string data1 = EData[5]?.ToString() ?? string.Empty;

    string data2 = EData[9]?.ToString() ?? string.Empty;

    string data3 = EData[3]?.ToString() ?? string.Empty;

    string data4 = EData[6]?.ToString() ?? string.Empty;

    //Последний блок GET запросы на сайты

    string url = EData[2]?.ToString();

    Html = ZennoPoster.HttpGet(url, "", "utf-8", InterfacesLibrary.Enums.Http.ResponceType.BodyOnly, 5000, "", "", true, 3);

    string Pattern = @ "[РЕГУЛЯРКА]";

    Match regMatch = Regex.Match(Html, Pattern, RegexOptions.IgnoreCase);

    if (regMatch.Success) {

      PageUrl = regMatch.Groups[1].Value;

      // Если URL относительный, преобразуем его в абсолютный

      if (!PageUrl.StartsWith("http")) {

        Uri baseUri = new Uri(url);

        PageUrl = new Uri(baseUri, PageUrl).ToString();

      }

      //2 GET

      string Html2 = ZennoPoster.HttpGet(PageUrl, "", "utf-8", InterfacesLibrary.Enums.Http.ResponceType.BodyOnly, 5000, "", "", true, 3);

      string Pattern2 = @ "[РЕГУЛЯРКА2]";

      MatchCollection reg2Matches = Regex.Matches(Html2, Pattern2);

      HashSet < string > unique = new HashSet < string > ();

      foreach(Match reg2Matche in reg2Matches) {

        unique.Add(reg2Matche.Value); // Добавляем в HashSet

      }

      data5 = string.Join("\n", unique);

    }
юзай leaf.xnet? зенновские запросфы работают через одно место
 
У тебя сверхнагрузка на ЦП , а не зависание потоков...
Ну сам подумай, если потоки ожидают друг друга в очереди, нагрузка же должна быть как у одного потока...

Гадать можно до бесконечности, уходя от темы в такие дали, что уххх... Но тебе надо делать отладку... По шагам исключая в коде части логики... Так и выйдешь на проблемную часть. А как выйдешь, уже скидывай сюда что нашел , опять будем репу чесать.
Логично, исключу части кода, выясню какая часть вешает весь проект. С этого начнем
 
Спасибо за Ваш комментарий, первые 2 пункта понял, а вот 3-4 немного не понял про стандартный списки. Я использую кубик c# и через lock беру строку с удалением. В кубике получается 3-4 строчки. В самом файле очень много строк более 100 тыс


Что бы детально понять в чем именно дело, можете использовать трассировку, как раз поймете на что тратится время.
Вот здесь автор хорошо описал механизм работы.

Вам нужно нажать на ваш проект в ZennoPoster, пр.кн мыши "Трассировать выполнение".
Запустить проект к примеру в 10 выполнений.
После отработки проекта - скопировать папку "C:\пользователь\пользователь\Documents\ZennoLab\Traces" в папку с "Analizator_Trassirovki.zp"
Запустить "Analizator_Trassirovki.zp"

Тем самым вы получите ID действий, на которые тратится наибольшее количество времен
 
  • Спасибо
Реакции: dihard
Что бы детально понять в чем именно дело, можете использовать трассировку, как раз поймете на что тратится время.
Вот здесь автор хорошо описал механизм работы.

Вам нужно нажать на ваш проект в ZennoPoster, пр.кн мыши "Трассировать выполнение".
Запустить проект к примеру в 10 выполнений.
После отработки проекта - скопировать папку "C:\пользователь\пользователь\Documents\ZennoLab\Traces" в папку с "Analizator_Trassirovki.zp"
Запустить "Analizator_Trassirovki.zp"

Тем самым вы получите ID действий, на которые тратится наибольшее количество времен
Спасибо
 
Трассировка это хорошо... Но что делать если весь код в одном кубике ? ;)
 
И так методом удаление отдельных частей кода, выяснил, когда нету этого кода ЦП загружается на 35% максимум

C#:
Развернуть Свернуть Копировать
HashSet<string> uniqueData = new HashSet<string>(); // Создаю коллекцию, которая хранит уникальные элементы, чтобы убрать дубли

    // Собираем все найденные данные
    foreach (Match dataMatch in dataMatches) { //dataMatches то что нашла моя регуляка
        uniqueData.Add(dataMatch.Value); // Добавляем найденные данные в HashSet отсеявая повторные данные
    }
//дальше передаю их в свою переменную

Собственно сам вопрос, почему эта часть нагружает все ЦП? Таких частей 2шт, но даже 1 грузит на 100%
Есть предположения только то что количество найденных совпадений слишком велико, отсюда нагрузка

Чем можно заменить, List+Distinct() , Parallel.ForEach? Что менее затратно для ЦП, может есть какой-то другой способ

UPDATE: Попробывал List+Distinct() , Parallel.ForEach нагрузка 100% , убираю этот блок опять и 35% максимум. Что делать то?
UPDATE2: УБрал HashSet и сразу через цикл foreach кладу в свою переменную - нагрузка 100%. То есть дело в цикле foreach или дело и в HashSet тоже., так как в Parallel.ForEach не было цикла foreach , но там тоже нагрузка Есть идеи?
 
Последнее редактирование:
Ошибочка вышла, когда я убирал блоки, я не посмотрел что приходит с регулярки, там ничего не приходила, заменил код на
C#:
Развернуть Свернуть Копировать
data= string.Join(", ", dataMatches.Cast<Match>().Select(match => match.Value));
Убрав HashSet и цикл. Нагрузка 100% . Вывод результатов приходит видимо очень много и при обработке ЦП загружено.


C#:
Развернуть Свернуть Копировать
// Регулярное выражение для поиска адресов электронной почты
    string emailPattern = @"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}";
    MatchCollection emailMatches = Regex.Matches(combinedHtml, emailPattern);
    HashSet<string> uniqueEmails = new HashSet<string>();
    
    // Собираем все найденные адреса электронной почты
    foreach (Match emailMatch in emailMatches) {
        uniqueEmails.Add(emailMatch.Value); // Добавляем найденные адреса в HashSet
    }

    // Преобразуем уникальные адреса электронной почты в строку
    email = string.Join("\n", uniqueEmails);

Добавлю блок как есть, без редактирование, просто обработка и поиск email, ничего секретного нету. Собственно проблема при обработке регулярно выражения. Если есть идеи, буду благодарен
 
Так а сколько же регулярка находит ? Можно в лог вывести количество...
 
Так а сколько же регулярка находит ? Можно в лог вывести количество...
Проверил 1 поток, получилось 150, количество будет прыгать , от 0 до собственно бесконечности, так как идет обход разных сайтов, за раз беру 20 штук сайтов. В этот поток получил из 20 сайтов без удаления дублей - 150 штук
 
Стоит учитывать потоков 100
 
Если щем только 1 совпадение

C#:
Развернуть Свернуть Копировать
Match emailMatch = Regex.Match(combinedHtml, emailPattern);

        // Проверяем, найдено ли совпадение
        if (emailMatch.Success)
        {
            email = emailMatch.Value; // Возвращаем первое найденное совпадение
        }

Даже так может выдать 100% но не сразу, через минут 5
 
Последнее редактирование:
Дамы(если есть) и господа, проблема решена. Решение крылось в зарядке iPhone, я отсоединил ноут от сети и подключил телефон, попробывал прогнать код и к моему удивления загрузка ЦП макс на 30%. Выяснил что когда ноут подключен к сети, включался режим максимальной производительности и он вешал все ЦП.:bk:
 
Дамы(если есть) и господа, проблема решена. Решение крылось в зарядке iPhone, я отсоединил ноут от сети и подключил телефон, попробывал прогнать код и к моему удивления загрузка ЦП макс на 30%. Выяснил что когда ноут подключен к сети, включался режим максимальной производительности и он вешал все ЦП.:bk:
Нежданчик :)

Вот только один вопрос... А как зенка без сети то работает ?
 
Дамы(если есть) и господа, проблема решена. Решение крылось в зарядке iPhone, я отсоединил ноут от сети и подключил телефон, попробывал прогнать код и к моему удивления загрузка ЦП макс на 30%. Выяснил что когда ноут подключен к сети, включался режим максимальной производительности и он вешал все ЦП.:bk:
Винда 10 или 11?
Попробуй поставить сборку винды, где вырезаны все свистелки-перделки, ну и с разделом электропитание поиграйся.
А вообще, ноут не лучшее решение для зенки, проверено не одним вопрошающим тут на форуме - "Почему у меня зенка..."
 

Похожие темы

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)