Какая причина падения производительности приложения?
Есть приложение, суть которого - обработка видеосигнала с нескольких ип-камер. В приложение поступают кадры в виде 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 при запуске из консоли с эквивалентной настройкой.
sim3x, запускаю через обертку autogen
но при получении кадров - в ней нет просадки - кадры поступают с нужной скоростью
железо - тестовое при разработке i7 проц 4 ядра, 32гб памяти
тестовое - сервер х24 ядра 32гб памяти
дело в том что процессор не загружен полностью. у меня на компе до 80% загружается а на сервере так и до 50ти % не дотягивает
Wexter, потоков которые потоки? - т.е. лимит потоков или потоки - которые видео?
>при всем этом железо не загружено на 100%
Если бы оно не было где-то загружено, то оно бы и не замедлялось.
Надо найти где именно, профилировать. Если вы уверены, что в основном проблема на копировании, то мб самые затратные функции можно заменить на аналоги\оптимизировать\переписать? Заменить jpeg на что-то менее требовательное\обращаться без копирования(по ссылкам)\обрабатывать не все кадры, а каждый N.
Ну и на процессоре особо много потоков не обработаешь. Если речь про 4-8 потоков то мб еще и потянет(в зависимости от вашего приложения и задач).
А вы каким образом изображения обрабатываете, выводите и какие функции используете? Дело в том, что C# для таких вещей не очень хорошо подходит и стандартные механизмы работы с отдельными пикселями там очень медленные. Для работы с изображениями следует использовать как минимум неуправляемый код, а в вашем случае еще лучше вывести все функции обработки и вывода изображения в отдельный модуль, написанный на C/C++ или на чем-то еще типа такого.
Хм, ну тогда да, вероятно просто производительности ПК не хватает. Возможно, имеет смысл попробовать какие-то графические функции выполнять средствами видеокарты — там для этого есть много разных фич.
Вам необходимо исследовать работу потоков используя например Concurrency Visualizer. Возможно, что возникают блокировки, из-за которых у вас падает утилизация cpu.
проблема решилась,
основная проблема была в настройке сети - пропускная способность не позволяла получать сигнал в нужных объемах.
второстепенная - сборка мусора, решилась переиспользованием буферов.