Приложение C++ на базе Windows со временем потребляет больше ресурсов ЦП

У нас есть многопоточное приложение на основе C++ для Windows, которое захватывает сетевые пакеты в режиме реального времени с помощью библиотеки WinPCAP, а затем обрабатывает эти пакеты для мониторинга сети. Это приложение предназначено для работы 24x7. Наше приложение легко потребляет 7-8 ГБ оперативной памяти.

Проблема, которую мы наблюдаем: Допустим, приложение отслеживает сетевой трафик со скоростью 100 Мбит/с и потребляет 60 % ресурсов ЦП. Мы заметили, что когда приложение продолжает работать в течение более длительного времени, например, день или два, потребление процессора приложением увеличивается примерно до 70-80%, даже если оно по-прежнему обрабатывает трафик со скоростью 100 Мбит/с (выполняя тот же объем работы). .

Мы попытались отладить эту проблему на уровне потоков с помощью ProcessExplorer и заметили, что потоки захвата пакетов со временем начинают потреблять больше ресурсов ЦП. Эта проблема не решается даже после перезапуска приложения. Только перезагрузка машины решает проблему.

Мы заметили, что эта проблема легко воспроизводится в ОС Windows 2012 R2 Server во время ночных запусков. В Windows 7 проблема возникает, но в течение нескольких дней.

Любая идея, что может быть причиной этого?

Заранее спасибо


person Ramandeep Sandhu    schedule 22.10.2014    source источник
comment
Без понятия. Ознакомьтесь с xperf. Random считает, что это здорово.   -  person Martin Ba    schedule 22.10.2014
comment
Или Просмотр производительности.   -  person Joey    schedule 22.10.2014
comment
Перезапуск приложения не помогает, скорее всего, это не утечка памяти. Как насчет утечек системных ресурсов: обратите внимание на рост числа дескрипторов со временем.   -  person Chris O    schedule 22.10.2014
comment
Это может быть ошибка в драйвере WinPcap или, возможно, даже в сетевых драйверах.   -  person Harry Johnston    schedule 23.10.2014
comment
Крис, я постараюсь следить за количеством ручек.   -  person Ramandeep Sandhu    schedule 23.10.2014


Ответы (2)


Что с распределением памяти? Поскольку вы используете много памяти, это может быть проблемой фрагментации памяти, поэтому, если вы делаете несколько выделений/перераспределений буферов, это, конечно, приведет к значительным затратам процессора на поиск и выделение доступного пространства.

person IFeelGood    schedule 22.10.2014
comment
Что ж, мы запускаем приложение на системах с достаточным объемом оперативной памяти, например, 16 ГБ или более. Мы используем пулы памяти; хотя происходят частые выделения/отмены распределения. Если это так, разве это не должно быть решено при перезапуске приложения? - person Ramandeep Sandhu; 22.10.2014
comment
Фрагментация памяти может происходить на уровне ОС, поэтому я не думаю, что на уровне приложения можно сделать что-то большее, чем то, что вы уже сделали. В конце концов вы должны выделить один огромный сегмент памяти и иметь свой собственный менеджер памяти... - person IFeelGood; 22.10.2014
comment
Спасибо, IFeelGood. Я постараюсь изучить часть фрагментации памяти. Есть ли способ дефрагментировать ОЗУ после остановки моего приложения и повторно запустить его, чтобы проверить, не было ли это вызвано фрагментацией памяти. Перезагрузка машины определенно приведет к дефрагментации ОЗУ. Хочу попробовать без перезагрузки машины. - person Ramandeep Sandhu; 22.10.2014
comment
Насколько я знаю, это невозможно. В конце концов проверьте наличие ошибки жесткой страницы и попробуйте отключить выгружаемую память. В моей машине 16Gb и я живу без него. Я хотел бы попробовать. - person IFeelGood; 22.10.2014
comment
Я проверил количество жестких ошибок в секунду, и они были 0. Мне все еще нужно проверить с отключением выгружаемой памяти. Я подумал, может ли быть более простое приложение для проверки этого явления. - person Ramandeep Sandhu; 27.10.2014

Наконец-то я нашел причину вышеуказанного поведения: причиной этого был код winpcap. После замены такого поведения не наблюдалось.

person Ramandeep Sandhu    schedule 20.01.2015