Страница 1 из 2
Проблема многопоточности
Добавлено: 01 сен 2014, 12:24
Ant
Доброго времени суток! Помогите с проблемой, сложно понять, что происходит, т.к. проблема возникает редко.
При запуске в нескольких потоках рендера все потоки кроме одного блокируются. Т.е. процесс идет корректно, но использует только 1 процессор.
Тестовый проект прислать затруднительно, т.к. он очень большой, сложно выделить нужную часть.
Есть ли какие-либо нюансы с многопоточным запуском?
Re: Проблема многопоточности
Добавлено: 02 сен 2014, 12:03
HighAley
Здравствуйте.
Уточните, пожалуйста, вы пытаетесь построить один и то же отчёт в нескольких потоках или разные отчёты.
Спасибо.
Re: Проблема многопоточности
Добавлено: 02 сен 2014, 16:38
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();
Re: Проблема многопоточности
Добавлено: 03 сен 2014, 15:23
Леонид
Добрый день!
Используете ли вы для каждого экземпляра StiReport конструкцию C#
Код: Выделить всё
// вне процедуры
object stiReportObj1 = new object();
//...
// в процедуре
lock (stiReportObj1) {}
?
Re: Проблема многопоточности
Добавлено: 03 сен 2014, 21:19
Ant
Леонид писал(а):
Используете ли вы для каждого экземпляра StiReport конструкцию C#
Код: Выделить всё
// вне процедуры
object stiReportObj1 = new object();
//...
// в процедуре
lock (stiReportObj1) {}
?
Нет, не использую.
Спасибо за внимание к вопросу
Re: Проблема многопоточности
Добавлено: 05 сен 2014, 12:25
Aleksey
Здравствуйте,
Не могли бы вы более подробно описать свою проблему? Что значит блокируются?
Спасибо.
Re: Проблема многопоточности
Добавлено: 09 сен 2014, 12:24
Ant
Aleksey писал(а):
Не могли бы вы более подробно описать свою проблему? Что значит блокируются?
Провел дополнительные исследования
На моей машине 2 ядра, 4 процессора, формирование занимает 100% ЦП, работают 5 потоков. Время формирования 1 документа каждым потоком от 0.6 до 1,2 сек.
Но когда я запускаю на сервере (16 ядер, 32 процессора), формирование занимает 15% ЦП, работают там 23 потока. Время формирования 1 документа каждым потоком от 2 до 3 сек.
Статистически общий результат получается одинаковый 0.34 сек/документ.
Пробовал запускать в разных доменах, например 2 домена по 12 потоков, результат тот же.
Если запустить второе приложение то каждое из них занимает по 15% ЦП, общий результат в 2 раза быстрее.
Помогите решить проблему. Может быть дело и не в стимулсофте, но я не знаю уже что и думать
Re: Проблема многопоточности
Добавлено: 09 сен 2014, 14:01
Aleksey
Здравствуйте,
Сложно так что-то конкретное сказать, без конкретных примеров, без анализа. Многое зависит от содержимого отчета, от данных, возможно проблемы при подключении к данным, возможно, "лочится" перекомпилированный отчет при загрузке.
Спасибо.
Re: Проблема многопоточности
Добавлено: 14 ноя 2014, 19:43
Ant
Здравствуйте! Локализовали проблему. Похоже, что на одной машине не может использоваться более 4 ядер для выполнения функции ExportDocument(StiExportFormat.Pdf, ...).
Создали тестовый проект, который сохраняет в PDF. Сохранение происходит одновременно в несколько файлов, количество потоков указывается.
Тестируем. Для теста нужна машина с числом ядер больше 4 (например 8).
Указываем от 1 до 4 потоков, получаем: при увеличении потоков происходит увеличение загрузки процессора и уменьшение времени выполнения к файлам результата (время / кол-во файлов).
Указываем более 4 потоков: загрузка ЦП не растет, время к количеству файлов не отличается.
Запускаем несколько проектов, указав в каждом от 4 потоков: загрузка ЦП не растет, время к количеству файлов не отличается, при этом % использования ЦП равно делится между процессами.
Re: Проблема многопоточности
Добавлено: 18 ноя 2014, 16:30
Aleksey
Здравствуйте,
Пожалуйста попробуйте отключить в настройках экспорта(StiPdfExportSettings) свойство EmbeddedFonts. Будут ли какие либо изменения.
Спасибо.