Проблема многопоточности

Обсуждение Stimulsoft Reports.NET
Ant
Сообщения: 21
Зарегистрирован: 22 май 2013, 12:11

Проблема многопоточности

Сообщение Ant »

Доброго времени суток! Помогите с проблемой, сложно понять, что происходит, т.к. проблема возникает редко.
При запуске в нескольких потоках рендера все потоки кроме одного блокируются. Т.е. процесс идет корректно, но использует только 1 процессор.
Тестовый проект прислать затруднительно, т.к. он очень большой, сложно выделить нужную часть.
Есть ли какие-либо нюансы с многопоточным запуском?
HighAley
Сообщения: 1998
Зарегистрирован: 08 июн 2011, 11:36
Откуда: Stimulsoft Office

Re: Проблема многопоточности

Сообщение HighAley »

Здравствуйте.

Уточните, пожалуйста, вы пытаетесь построить один и то же отчёт в нескольких потоках или разные отчёты.

Спасибо.
Ant
Сообщения: 21
Зарегистрирован: 22 май 2013, 12:11

Re: Проблема многопоточности

Сообщение Ant »

Aleksey Andreyanov писал(а): Уточните, пожалуйста, вы пытаетесь построить один и то же отчёт в нескольких потоках или разные отчёты.
Шаблон один. Но каждые 1000 запусков он перекомпилируется. Примерно так:
StiReport stiReport; //экземпляр для каждого потока свой

Перед первым запуском и перед каждым 1000ым:
stiReport = new StiReport();
stiReport.LoadFromString(template);
stiReport.Compile();
stiReport.ReportCacheMode = StiReportCacheMode.Off;
stiReport.SaveReportInResources = false;

Запуск получения результата:
stiReport.RegData("header", headerTable);
stiReport.Render(false);
stiReport.Dictionary.DataStore.Clear();
stiReport.DataStore.Clear();
stiReport.DataSources.Clear();
return stiReport.SavePackedDocumentToByteArray();
Леонид
Сообщения: 329
Зарегистрирован: 23 июл 2009, 09:53
Откуда: Moscow

Re: Проблема многопоточности

Сообщение Леонид »

Добрый день!

Используете ли вы для каждого экземпляра StiReport конструкцию C#

Код: Выделить всё


// вне процедуры
object stiReportObj1 = new object();
//...
// в процедуре
lock (stiReportObj1) {}
?
Ant
Сообщения: 21
Зарегистрирован: 22 май 2013, 12:11

Re: Проблема многопоточности

Сообщение Ant »

Леонид писал(а): Используете ли вы для каждого экземпляра StiReport конструкцию C#

Код: Выделить всё


// вне процедуры
object stiReportObj1 = new object();
//...
// в процедуре
lock (stiReportObj1) {}
?
Нет, не использую.

Спасибо за внимание к вопросу
Aleksey
Сообщения: 2907
Зарегистрирован: 22 апр 2010, 06:57

Re: Проблема многопоточности

Сообщение Aleksey »

Здравствуйте,

Не могли бы вы более подробно описать свою проблему? Что значит блокируются?

Спасибо.
Ant
Сообщения: 21
Зарегистрирован: 22 май 2013, 12:11

Re: Проблема многопоточности

Сообщение Ant »

Aleksey писал(а): Не могли бы вы более подробно описать свою проблему? Что значит блокируются?
Провел дополнительные исследования :)

На моей машине 2 ядра, 4 процессора, формирование занимает 100% ЦП, работают 5 потоков. Время формирования 1 документа каждым потоком от 0.6 до 1,2 сек.
Но когда я запускаю на сервере (16 ядер, 32 процессора), формирование занимает 15% ЦП, работают там 23 потока. Время формирования 1 документа каждым потоком от 2 до 3 сек.
Статистически общий результат получается одинаковый 0.34 сек/документ.

Пробовал запускать в разных доменах, например 2 домена по 12 потоков, результат тот же.
Если запустить второе приложение то каждое из них занимает по 15% ЦП, общий результат в 2 раза быстрее.

Помогите решить проблему. Может быть дело и не в стимулсофте, но я не знаю уже что и думать :(
Aleksey
Сообщения: 2907
Зарегистрирован: 22 апр 2010, 06:57

Re: Проблема многопоточности

Сообщение Aleksey »

Здравствуйте,

Сложно так что-то конкретное сказать, без конкретных примеров, без анализа. Многое зависит от содержимого отчета, от данных, возможно проблемы при подключении к данным, возможно, "лочится" перекомпилированный отчет при загрузке.

Спасибо.
Ant
Сообщения: 21
Зарегистрирован: 22 май 2013, 12:11

Re: Проблема многопоточности

Сообщение Ant »

Здравствуйте! Локализовали проблему. Похоже, что на одной машине не может использоваться более 4 ядер для выполнения функции ExportDocument(StiExportFormat.Pdf, ...).
Создали тестовый проект, который сохраняет в PDF. Сохранение происходит одновременно в несколько файлов, количество потоков указывается.
Тестируем. Для теста нужна машина с числом ядер больше 4 (например 8).
Указываем от 1 до 4 потоков, получаем: при увеличении потоков происходит увеличение загрузки процессора и уменьшение времени выполнения к файлам результата (время / кол-во файлов).
Указываем более 4 потоков: загрузка ЦП не растет, время к количеству файлов не отличается.
Запускаем несколько проектов, указав в каждом от 4 потоков: загрузка ЦП не растет, время к количеству файлов не отличается, при этом % использования ЦП равно делится между процессами.
Aleksey
Сообщения: 2907
Зарегистрирован: 22 апр 2010, 06:57

Re: Проблема многопоточности

Сообщение Aleksey »

Здравствуйте,

Пожалуйста попробуйте отключить в настройках экспорта(StiPdfExportSettings) свойство EmbeddedFonts. Будут ли какие либо изменения.

Спасибо.
Ответить