Какая причина падения производительности приложения?

Есть приложение, суть которого - обработка видеосигнала с нескольких ип-камер. В приложение поступают кадры в виде bitmap с ними проводятся некоторые манипуляции, затем кадр отрисовывается на экране и отправляется по сети. Процесс постоен в виде нескольких независимых логических нитей.
Так вот проблема. При работе с одним видео потоком - производительность алгоритма позволяет обрабатывать видео поток hd 60fps, а при тесте отдельных частей - так и разгоняется до >100 fps. Но, при одновременном запуске обработки нескольких видеопотоков происходит просадка производительности, падает fps на каждой логической нити - снижение равномерное, т.е. обработка видео 25fps, один поток обрабатывается нормально, 2 - фпс 22-23, 3 - 17-19 и т.д. При проведении замеров скорости выполнения ответственных частей кода - видно что везде происходит замедление - основные функции обработки это копирование памяти между битмапами и сжатие их в jpeg.
Есть подозрение на сборщик мусора - т.к. выделяется много памяти, но точно не уверен. по отладчику видно что % time in gc не превышает 10% .
Помогите найти причину. спасибо.

ps1. при всем этом железо не загружено на 100%
ps2. при запуске обработки видеопотоков в разных физических процессах, т.е. несколько экземпляров программы - проблемы не наблюдается, т.е. просадки нет.

ps3. после некоторых манипуляций и оптимизаций пришел к тому - что падение производительности происходит только на виртуальном сервере, и с 16 и с 48 ядрами. - т.е. цп не загружен, и процесс идет с низким фпс. также работает голый ffmeg при запуске из консоли с эквивалентной настройкой.
  • Вопрос задан
  • 295 просмотров
Пригласить эксперта
Ответы на вопрос 3
VoidVolker
@VoidVolker Куратор тега C#
Dark side eye. А у нас печеньки! А у вас?
А вы каким образом изображения обрабатываете, выводите и какие функции используете? Дело в том, что C# для таких вещей не очень хорошо подходит и стандартные механизмы работы с отдельными пикселями там очень медленные. Для работы с изображениями следует использовать как минимум неуправляемый код, а в вашем случае еще лучше вывести все функции обработки и вывода изображения в отдельный модуль, написанный на C/C++ или на чем-то еще типа такого.
Ответ написан
@asdz
Вам необходимо исследовать работу потоков используя например Concurrency Visualizer. Возможно, что возникают блокировки, из-за которых у вас падает утилизация cpu.
Ответ написан
Комментировать
hePPer
@hePPer Автор вопроса
проблема решилась,
основная проблема была в настройке сети - пропускная способность не позволяла получать сигнал в нужных объемах.
второстепенная - сборка мусора, решилась переиспользованием буферов.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы