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

dihard

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

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

Gunjubasik

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

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

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

И в таком случае у вас будет шанс что бы вам оперативно ответили
 
  • Спасибо
Реакции: dihard

Alex91

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

Что используется в проекте JSON, GET, Regex и работа с текстом
Запросы как отправляются ? Встроенный кубик, библа какая на c# или курл ?
 
  • Спасибо
Реакции: dihard

Akcium

Client
Регистрация
16.12.2020
Сообщения
264
Благодарностей
129
Баллы
43

lederer

Client
Регистрация
13.04.2013
Сообщения
176
Благодарностей
87
Баллы
28
Да, Regex действительно может приводить к загрузке ЦП.
Есть 4 возможных пути, на мой взгляд:

1. Если используете 1 файл большого объема - разбейте на несколько маленьких.
2. Заменить регулярку на более простую (уже говорили выше)
3. Если файл маленький используйте стандартные списки в таком режиме, а не берите строки напрямую с файла через метод по типу "FileSystem.FileGetLines"
4. Используйте при работе стандартные списки в таком режиме
 
  • Спасибо
Реакции: dihard

dihard

Client
Регистрация
08.11.2019
Сообщения
279
Благодарностей
47
Баллы
28
Запросы как отправляются ? Встроенный кубик, библа какая на c# или курл ?
Запросы отправляются через кубик C# методом HttpGet . Получается через цикл for 20 сайтов по 2 GET запросы на каждый. И в этом же цикле делается regex на каждый GET запрос
 
Последнее редактирование:

dihard

Client
Регистрация
08.11.2019
Сообщения
279
Благодарностей
47
Баллы
28
Да, Regex действительно может приводить к загрузке ЦП.
Есть 4 возможных пути, на мой взгляд:

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

dihard

Client
Регистрация
08.11.2019
Сообщения
279
Благодарностей
47
Баллы
28
Что бы вам ответили по теме, нужно:

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

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

dihard

Client
Регистрация
08.11.2019
Сообщения
279
Благодарностей
47
Баллы
28
Для понимания, упрощенная версия логики кубика на 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);

    }
 
Последнее редактирование:

Alex91

Активный пользователь
Регистрация
15.08.2024
Сообщения
439
Благодарностей
116
Баллы
43
Для понимания, упрощенная версия логики кубика на 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
Потом бы запросы добавил без регулярки. Ну в общем можно и наоборот , это уже как удобнее.
 

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 587
Благодарностей
1 385
Баллы
113
Для понимания, упрощенная версия логики кубика на 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

dihard

Client
Регистрация
08.11.2019
Сообщения
279
Благодарностей
47
Баллы
28
Предположение: Вы работаете с таблицей, а таблица может работать паралельно только с одним потоком, поэтому и может зависать так как стоит в очереди в таблицу, еще и на запросах, где скорость исчесляется в секундах, а вы в 100 потоков...

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

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

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

dihard

Client
Регистрация
08.11.2019
Сообщения
279
Благодарностей
47
Баллы
28
А регулярка сложная ?
Json в этом коде откуда берется ? Парсится где и как, насколько жирный ?

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

Alex91

Активный пользователь
Регистрация
15.08.2024
Сообщения
439
Благодарностей
116
Баллы
43
Спасибо за комментарий, стоит попробывать., я замечал что если 1 поток долльше обрабатывает json, остальные тоже ждут. Стоит попробывать.
Стоит не использывать браузер
У тебя сверхнагрузка на ЦП , а не зависание потоков...
Ну сам подумай, если потоки ожидают друг друга в очереди, нагрузка же должна быть как у одного потока...

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

Vlad_Curnoi

Client
Регистрация
09.08.2017
Сообщения
476
Благодарностей
200
Баллы
43
Для понимания, упрощенная версия логики кубика на 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? зенновские запросфы работают через одно место
 

dihard

Client
Регистрация
08.11.2019
Сообщения
279
Благодарностей
47
Баллы
28
У тебя сверхнагрузка на ЦП , а не зависание потоков...
Ну сам подумай, если потоки ожидают друг друга в очереди, нагрузка же должна быть как у одного потока...

Гадать можно до бесконечности, уходя от темы в такие дали, что уххх... Но тебе надо делать отладку... По шагам исключая в коде части логики... Так и выйдешь на проблемную часть. А как выйдешь, уже скидывай сюда что нашел , опять будем репу чесать.
Логично, исключу части кода, выясню какая часть вешает весь проект. С этого начнем
 

lederer

Client
Регистрация
13.04.2013
Сообщения
176
Благодарностей
87
Баллы
28
Спасибо за Ваш комментарий, первые 2 пункта понял, а вот 3-4 немного не понял про стандартный списки. Я использую кубик c# и через lock беру строку с удалением. В кубике получается 3-4 строчки. В самом файле очень много строк более 100 тыс

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

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

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

dihard

Client
Регистрация
08.11.2019
Сообщения
279
Благодарностей
47
Баллы
28
Что бы детально понять в чем именно дело, можете использовать трассировку, как раз поймете на что тратится время.
Вот здесь автор хорошо описал механизм работы.

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

Тем самым вы получите ID действий, на которые тратится наибольшее количество времен
Спасибо
 

Alex91

Активный пользователь
Регистрация
15.08.2024
Сообщения
439
Благодарностей
116
Баллы
43
Трассировка это хорошо... Но что делать если весь код в одном кубике ? ;-)
 

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