Мне нужна помощь с использованием MS Debug Diagnostic Tool для профилирования приложения C # с высокой загрузкой процессора - PullRequest
1 голос
/ 29 апреля 2019

У меня есть многопоточное приложение .NET.Он получает и отправляет множество пакетов UDP через сеть и выполняет много вычислений.

Я открываю это приложение каждый день, и оно работает в течение всего окна рабочих часов.Количество одновременных потоков (проверяется с помощью диспетчера задач) обычно варьируется от 60 до 90. Загрузка ЦП сильно варьируется, и он имеет некоторые случайные всплески, которые делают использование ЦП сервером до 100%.Но я бы сказал, что СРЕДНЕЕ использование ЦП приложением низкое, менее 5%.

Иногда, в некоторые случайные дни, обычно, когда количество принимаемых пакетов больше, чем обычно, количество одновременных потоковэто приложение увеличивается до ~ 250, а загрузка ЦП сервера остается на уровне 100%.Приложение не использует все 100% (потому что на этом сервере запущены другие приложения), но оно использует весь доступный ЦП, поэтому общее использование достигает 100%.

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

Я полагаю, что в исходном коде может быть какая-то ошибка, которая вызываеткакой-то бесконечный цикл или что-то в этом роде.

Основываясь на этом посте, я пытался использовать Microsoft Debug Analysis Tool v2 Update 3, но я столкнулся с некоторыми проблемами,который я опишу ниже:

1) Я следовал всем инструкциям по ссылке выше.Мне удалось создать и активировать правило для определения высокой загрузки ЦП.

2) Однако, когда проблема начинает возникать, я вижу в диспетчере задач много новых процессов, которые создаются (с тем жеимя как процесс моего приложения), по одному, но последовательно, все со статусом «Приостановлено».Для ясности: эти новые приостановленные процессы не генерируются моим приложением, они генерируются инструментом сбора отладочной диагностики, когда он начинает сбор данных для файлов дампа.

enter image description here

3) Глядя в главное диалоговое окно инструмента DebugDiag 2 Collection, я вижу состояние правила как «Завершено», даже если не было явной деактивации правила и проблема по-прежнему возникает.

enter image description here

4) Затем я использую инструмент анализа DebugDiag 2 для анализа созданных файлов дампа.Я выбираю «Анализаторы производительности / PerfAnalysis» и все файлы дампа и запускаю анализ.

5) Результат анализа приведен ниже:

enter image description here

Не думаю, что это System.ArgumentException не имеет ничего общего с моим приложением.Я думаю, что исключение выбрасывается ВНУТРИ инструмента анализа, как это выглядит при проверке трассировки стека.Я не знаю, например, что тот факт, что несколько процессов с одинаковыми именами генерируются на этапе сбора данных, заставляет инструмент анализа добавлять несколько записей с одним и тем же ключом в Словарь.

Дело в том, что эта проблема мешает мне выяснить причину проблемы.Я знаю, что есть другие инструменты анализа, такие как DotTrace и ANTS, но я бы действительно предпочел использовать бесплатный инструмент перед переходом на коммерческий.Я даже связался с разработчиком CodeTrack , который является бесплатным и выглядит как прекрасный инструмент, но советы и рекомендации, которые он дал мне, не так просты для того, чтобы следовать с моей стороны, потому что:

  • Мое приложение работает на производственных серверах.
  • Не просто моделировать производственную среду на тестовом компьютере, поскольку я использую рыночные данные в реальном времени для подачи приложения.
  • Прежде чем кто-либо предложит использовать собственный инструмент профилирования Visual Studio, на производственных серверах не установлена ​​VS (и я не собираюсь устанавливать ее на них).

Итак, я предполагаю, что мой настоящий вопрос здесь: кто-нибудь знает, что я делаю неправильно (если так) при использовании MS Debug Diagnostic Tool? Является ли проблема, с которой я сталкиваюсь, действительно ошибкой? Предполагается ли создание нескольких приостановленных процессов во время сбора данных? Как я могу это исправить и заставить его работать должным образом, чтобы я мог использовать его для исследования своей проблемы?

1 Ответ

0 голосов
/ 29 апреля 2019

Даже если вы используете рыночные данные в режиме реального времени для подачи своего приложения, вы должны иметь возможность сгенерировать некоторые фиктивные данные и поместить их в некоторый случайный цикл, чтобы проверить, как работает ваше приложение.

Чтобы помочь вам больше, нам нужно увидеть часть вашего кода.Как вы упомянули в своем посте, должна быть какая-то ошибка, которая, вероятно, не позволяет вашим нитям умереть, тогда это большая проблема, потому что у вас есть какие-то процессы зомби.Ваши дочерние процессы должны выполнить свои ставки и умереть.

Мой совет перепроверьте этот исходный код, найдите критические точки, попытайтесь настроить среду отладки (это жизненно важно, вы не можете проверить в работе, работает ли ваш код!)

...