Оценить / Рассчитать Использование Памяти Сеанса - PullRequest
4 голосов
/ 05 октября 2009

Я хотел бы оценить объем памяти, используемый каждой сессией на моем сервере в моем веб-приложении ASP.NET. Несколько ключевых вопросов:

  • Сколько памяти выделено только для каждого экземпляра сеанса?
  • Соответствует ли использование памяти каждой переменной заданному адресному пространству (например, 32 бита для Int32)?
  • А как насчет переменных с адресным пространством переменных (например, String, Array [] s)?
  • А как насчет пользовательских экземпляров объекта (например, MyCustomObject, который содержит различные другие вещи)?
  • Добавляется ли что-нибудь для каждой переменной (например, адрес переменной Int32, чтобы связать ее с экземпляром сеанса), добавляя к издержкам на переменную?

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

Ответы [ 5 ]

3 голосов
/ 05 октября 2009

Класс HttpSessionStateContainer имеет десять локальных переменных, то есть примерно 40 байтов плюс 8 байтов для служебных данных объекта. Он имеет строку идентификатора сеанса и коллекцию элементов, так что это примерно 50 байтов, когда коллекция элементов пуста. У него есть еще несколько ссылок, но я считаю, что это ссылки на объекты, общие для всех объектов сеанса. Таким образом, в общей сложности это составит около 100 байт на объект сеанса.

Если вы поместите тип значения, например Int32, в коллекцию элементов сеанса, он должен быть упакован. При накладных расходах объекта в 8 байтов он достигает 12 байтов, но из-за ограничений в диспетчере памяти он не может выделить для объекта менее 16 байтов. С четырьмя байтами для ссылки на объект Int32 требуется 20 байтов.

Если вы поместите ссылочный тип в коллекцию элементов, вы сохраните только ссылку, то есть всего четыре байта. Если это буквальная строка, она уже создана, поэтому она не будет использовать больше памяти. Созданная строка будет использовать (8 + 8 + 2 * длина) байтов.

Массив типов значений будет использовать (Length * sizeof (type)) плюс еще несколько байтов. Массив ссылочных типов будет использовать (длина * 4) плюс еще несколько байтов для ссылок, и каждый объект выделяется отдельно.

Пользовательский объект использует примерно сумму размера его членов, плюс некоторые дополнительные отступы в некоторых случаях плюс 8 байтов служебных данных объекта. Объект, содержащий Int32 и логическое значение (= 5 байтов), будет дополнен до 8 байтов плюс 8-байтовая служебная информация.

Итак, если вы поместите строку с 20 символами и тремя целыми числами в объект сеанса, это будет использовать примерно (100 + (8 + 8 + 20 * 2) + 3 * (20)) = 216 байт. (Тем не менее, коллекция элементов сеанса, вероятно, выделит емкость из 16 элементов, так что это 64 байта, из которых вы используете 16, поэтому размер будет 264 байта.)

(Все размеры в 32-битной системе. В 64-битной системе каждая ссылка составляет 8 байтов вместо 4 байтов.)

1 голос
/ 31 декабря 2009

.NET Memory Profiler - ваш друг:

http://memprofiler.com/

Вы можете бесплатно загрузить пробную версию и запустить ее. Хотя эти вещи иногда сложно установить и запустить, я обнаружил, что подключиться к работающему веб-серверу и проверить все объекты, которые он хранит в памяти, было на удивление просто.

0 голосов
/ 25 декабря 2009

При планировании крупномасштабного приложения, вам, возможно, следует рассмотреть и другие вещи, помимо грубого использования памяти.

Это зависит от выбранного вами поставщика состояния сеанса, а внутрипроцессные сеансы по умолчанию, вероятно, совсем не так.

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

При хранении сеансов SQL линейное потребление ОЗУ не будет.

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

0 голосов
/ 05 октября 2009

В этой старой старой статье от Microsoft, содержащей советы по производительности для ASP (не ASP.NET), говорится, что каждый сеанс имеет служебную нагрузку около 10 килобайт. Я понятия не имею, применимо ли это также к ASP.NET, но это намного больше, чем 100 байтов, которые упоминает Гуффа.

0 голосов
/ 05 октября 2009

Вы, вероятно, можете получить некоторые из них, используя Счетчики производительности и Пользовательские счетчики производительности . Я никогда не тестировал их с ASP.NET, но в остальном они довольно хороши для измерения производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...