Как сделать неинвазивное профилирование работающего приложения ASP.NET? - PullRequest
2 голосов
/ 27 ноября 2009

Ситуация: живой веб-сайт ASP.NET, который иногда слишком занят.

Добавление полного профилирования в код слишком сильно повлияет на производительность. Используя монитор производительности, мы быстро нашли число срезов в счетчике «байтов во всех кучах», который соединяется со счетчиками GC. Мы считаем, что некоторые фрагменты кода являются виновниками.

Есть ли способ или возможность временно «ввести» профилирование, для определенных страниц, библиотек, функций или чего-то еще? Предпочтительно настолько легкий, насколько это возможно, поскольку любые дополнительные накладные расходы могут разрушить эту хрупкую систему. Мне известно, что .NET не поддерживает перехваты обратного вызова метода (как это обычно бывает с AOP).

Ответы [ 4 ]

2 голосов
/ 27 ноября 2009

Несколько идей:

  1. Используйте пользовательские счетчики производительности Windows. Они очень легкие (от 1 до 2%), и вы можете использовать их не только для подсчета, но и для измерения времени, чтобы посмотреть, как часто определенные операции медленнее, чем порог, и т. Д.
  2. Если вы используете IIS 7, вы можете включить отслеживание неуспешных запросов. Чтобы ограничить эффект перфорирования, будьте осторожны, чтобы не включить его для слишком большого количества страниц. Эти следы могут предоставить много деталей, и вы можете добавить в них больше информации программно, если вам нужно.
  3. Используйте журнал событий Windows для записи пользовательских данных при исключительных условиях. Влияние перфорации минимально, если вы не переусердствуете.
  4. Одной из причин поведения пилообразной памяти может быть не вызов Dispose (), когда вам нужно (или перенос объектов IDisposable в операторы using, которые вызовут его для вас); Вы можете пересмотреть свой код, чтобы найти это.

Если это полезно, вас могут заинтересовать советы по производительности из моей книги: Сверхбыстрый ASP.NET .

Редактировать: вы также можете попробовать использовать .NET Memory Profiler (доступна бесплатная пробная версия) для подключения к запущенному процессу. Он довольно инвазивен по сравнению со счетчиками, но если вам нужно сделать снимок текущего состояния памяти, чтобы отладить вашу проблему, возможно, лучшего выбора не будет.

1 голос
/ 08 марта 2013

Недавно я опубликовал возможное решение аналогичной проблемы:

Профилирование многоуровневого распределенного веб-приложения (на стороне сервера) показывает высокоуровневый подход (профилирование на уровне URL):

  • не зависит от платформы и языка
  • полностью неинвазивный
  • дает общее представление о том, где ваше приложение проводит большую часть своего времени

Идея состоит в том, чтобы использовать существующие веб-журналы и преобразовывать их в " одно изображение стоимостью 1000 слов ".

Этот подход недостаточен для случаев использования, требующих более детальной детализации, но он помог мне лично, и, возможно, стоит изучить его в вашем случае.

1 голос
/ 27 ноября 2009

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

0 голосов
/ 27 ноября 2009

Можете ли вы сделать это на ASP .NET? Это хороший быстрый способ узнать, что происходит.

...