Как IIS Express — или веб — серверы в целом-обрабатывают файлы, которые пользователи могут загружать, или почему растет моя куча?

#c# #memory-leaks #swagger #iis-express #csvhelper

Вопрос:

Я пишу веб-сервис, который создает файл, который пользователь может загрузить. Источник данных для этого файла указан одним или несколькими URI, поэтому я в конечном итоге использую Stream и Reader много. Все они разбиты на using блоки. Даже в конечной точке, которая предлагает файл, который я использую return File(byte[], string, string) , и исходный поток byte[] которого удален.

Поскольку я пытаюсь ввести данные, которые я получаю с помощью строк, я использую много double.TryParse и Datetime.TryParse много.

Я вижу некоторые запуски сборщика мусора, но они не сильно освобождают. (Менее 1%)

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

Некоторые Цифры:

  • Использование памяти перед 1-м запросом: 90 МБ
  • Использование памяти после 1-го, 2-го, 3-го запроса: 180 МБ, 277 МБ, 480 МБ
  • Размер файла 200 Кб — одинаковый для каждого запроса.

Это привело меня к следующим вопросам:

  1. Где хранятся файлы, которые предлагает веб-сайт, размещенный в IIS Express, во время отладки с использованием Swagger? Память или диск?
  2. Могут ли быть накладные расходы на чванство, которые являются причиной такого роста памяти?
  3. Что еще может быть источником этой утечки памяти?

.Net 5.0

используется сторонняя библиотека: последняя версия CSVHelper

Комментарии:

1. Используйте профилировщик памяти для анализа использования управляемой/неуправляемой памяти. Только это может открыть вам, что происходит под капотом. IIS Express/IIS может кэшировать часто используемые ресурсы в памяти, но они должны отображаться только в неуправляемой памяти, и они не являются утечкой памяти.

2. Я уже сделал профилирование памяти. Он показывает мне, например, множество строковых построителей, вероятно, созданных моими вызовами разбора. Но это не показывает мне источник этого использования mem. Средняя память 200 МБ для результата 200 Кб недоступна.

3. «это не показывает мне источник использования этого mem» указывает на то, что вам следует уделять больше времени документации поставщика (или если у них есть видеоуроки о том, как использовать инструмент). Природа .NET делает все профилировщики способными показывать, откуда берутся объекты.