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