Как я могу получить надежные/согласованные результаты максимального использования памяти в сети точек

У нас есть различные тесты, которые отслеживают использование памяти нашим приложением (или подкомпонентами) в различных сценариях, чтобы проверить регрессию. Проблема в том, что наши измерения (с использованием Process.Refresh(); Process.PrivateMemorySize64) сильно колеблются в разных прогонах.

Сейчас мы делаем опрос через фоновый поток каждые X миллисекунды. Мы сравниваем достигнутое максимальное значение с контрольным значением и соответственно проходим/не проходим.

Интересно, что сокращение времени между опросами значительно снижает максимальное записываемое значение памяти. В одном примере чтение памяти каждые 100 мс дает максимум 360 МБ, каждые 10 мс — 147 МБ, а каждая 1 мс — 35 мс. Предположительно, увеличение количества наблюдений каким-то образом делает поведение сборщика мусора более агрессивным.

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

Существует ли стандартный способ измерения использования памяти в сети с точками для защиты от снижения производительности?


person Rob    schedule 19.03.2013    source источник


Ответы (2)


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

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

person Sam Harwell    schedule 19.03.2013
comment
У вас есть предложение для такого инструмента? На данный момент мои лучшие идеи таковы: часто вызывать GC.Collect() или как-то ограничивать разрешенную память процесса. - person Rob; 19.03.2013
comment
Когда я работаю на Java, я использую для этого YourKit Java Profiler (с VisualVM в качестве бесплатной, но более медленной альтернативы). Я недостаточно использовал специальные инструменты для .NET, чтобы дать рекомендацию. Что касается GC.Collect(): без инструментов ваши результаты не будут достаточно точными, чтобы делать какие-либо выводы о чем-либо. - person Sam Harwell; 19.03.2013

Вы можете использовать PerformanceCounter class для измерения использования памяти

ссылка: http://msdn.microsoft.com/en-us/library/system.diagnostics.performancecounter.aspx

вручную вы можете использовать Memory Profiler tool для проверки вашей памяти

ссылка: http://memprofiler.com/

person Aghilas Yakoub    schedule 19.03.2013