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

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

Това, което правим в момента, е анкетиране чрез фонова нишка на всеки X милисекунди. Сравняваме достигнатата максимална стойност с бенчмарк и съответно преминаваме/не успяваме.

Интересното е, че намаляването на времето между анкетите значително намалява максималната записана стойност на паметта. В един пример четенето на паметта на всеки 100 ms дава максимум 360 MB, на всеки 10 ms дава 147 MB ​​и на всеки 1 ms дава 35 ms. Вероятно увеличеният брой наблюдения по някакъв начин прави поведението на GC по-агресивно.

Предполагам, че основният проблем е, че това, което се опитваме да измерим, "максималното използване на паметта", не е особено добре дефинирано. Ако има достатъчно налична памет, GC може да не си направи труда да започне, така че използването на паметта ще изглежда по-високо.

Има ли стандартен начин за измерване на използването на паметта под dot net, за да се предпази от влошаване на производителността?


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


Отговори (2)


Предполагам, че основният проблем е, че това, което се опитваме да измерим, "максималното използване на паметта", не е особено добре дефинирано. Ако има достатъчно налична памет, GC може да не си направи труда да започне, така че използването на паметта ще изглежда по-високо.

Това си е твой проблем. Не е произволно време за изпълнение със събрано боклук да използва повече памет, когато е налична. Тези алгоритми работят значително по-добре, когато разполагат с по-голямо пространство в паметта, в което да „играят“. За обективен анализ трябва да използвате инструмент за анализиране само на достижимия набор, който не се влияе от поведението при събиране на отпадъци.

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