Я наблюдаю чрезвычайно высокий уровень использования памяти моим приложением dotnet при работе под Linux. Память также никогда не освобождается. Когда пользователи используют мое веб-приложение, им требуется большой объем памяти (1–2 ГБ для запуска отчета), но когда они закрывают вкладку, ресурсы освобождаются, и я ожидаю, что dotnet в некоторой степени сделает то же самое.
Мое приложение dotnet использует около 90–95 % памяти.
Проблемы [*]Я не могу определить, использует ли мой сервер пиковое использование памяти или dotnet удерживает память, поскольку другие процессы испытывают небольшую нагрузку на память. [*]Дампы памяти dotnet огромны, и я не думаю, что они должны быть такими. (~5-6 ГБ загрузки против ~30-300 МБ в использованных объектах при анализе) Диагностика памяти
root@a9f25bad2d02:~/site/wwwroot# dotnet-counters Monitor [Система.Runtime] % времени в сборе мусора с момента последнего сбора мусора (%) 0 Скорость распределения (Б/10 сек) 209 648 Загрузка ЦП (%) 0 Количество исключений (Количество / 10 сек) 0 Выделенные GC байты (МБ) 105 Фрагментация GC (%) 43,752 Размер кучи GC (МБ) 68 Gen 0 Количество ГХ (Счет / 10 сек) 0 Размер Gen 0 (B) 19 577 728 Число ГХ поколения 1 (счет / 10 с) 0 Размер Gen 1 (B) 1 608 856 Подсчет ГХ поколения 2 (счет / 10 с) 0 Размер Gen 2 (B) 49 073 776 Обработано IL-байтов (B) 4 471 180 Размер LOH (B) 26 161 384 Число конфликтов при блокировке монитора (количество / 10 сек) 0 Количество активных таймеров 15 Количество загруженных сборок 5110 Количество методов, обработанных 64 067 POH (куча закрепленных объектов) Размер (B) 706 440 Число выполненных рабочих элементов ThreadPool (количество / 10 секунд) 17 Длина очереди ThreadPool 0 Количество потоков ThreadPool 4 Время, проведенное в JIT (мс/10 сек) 0 Рабочий набор (МБ) 5,773 root@a9f25bad2d02:~/site/wwwroot# бесплатно -m общее количество использованных бесплатных общих баффов/кэша доступно Мем: 7817 6858 121 19 837 740 Обмен: 4095 2156 1939 root@a9f25bad2d02:~/site/wwwroot# наверх Заданий: всего 11, 2 бегут, 8 спят, 1 остановлено, 0 зомби. % ЦП: 1,5 мкс, 0,7 си, 50,4 ни, 45,3 идентификатора, 2,2 ва, 0,0 привет, 0,0 си, 0,0 ст. MiB Mem: всего 7817,4, 89,3 бесплатно, 7262,5 использовано, 465,6 положительных эффектов/кэша. Подмены MiB: всего 4096,0, 1676,2 бесплатно, 2419,8 использовано. 341.3 использовать мем PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ КОМАНДА 74 корень 30 10 9812340 5.4g 19812 t 0.0 70.7 21:22.97 dotnet 1908 корень 30 10 13948 708 540 S 0.0 0.0 0:00.18 sshd 1910 корень 30 10 5752 2040 1808 S 0,0 0,0 0:00.03 bash 2526 корень 30 10 9780 3448 2972 R 0,0 0,0 0:00,00 верх Как видно из монитора dotnet-counters, рабочий набор составляет около 5,7 ГБ, тогда как общее количество используемых байтов всех поколений, а также кучи больших и закрепленных объектов составляет всего около 120 МБ. .
Что подтверждается анализом дампа памяти размером 5 Гб.

Что я уже сделал [*]Я переключался между серверным и рабочим сборщиком мусора — особой разницы нет. [*]Я выполнил дамп dotnet dotnet-dumpcollect --type Full и проверил наличие нехватки памяти в своем приложении. [*]Я добавил в свое приложение счетчики dotnet, чтобы сообщать о поколениях 0, 1, 2, LOH и размере кучи — все значения увеличиваются, но снова падают после того, как пользователь покидает сайт. [*]Я переключил свое приложение на Windows и вижу, что использование памяти стало более «нормальным», и память через некоторое время освобождается. [*]Я запустил приложение с помощью dotnet-counterscollect и смоделировал типичную пользовательскую нагрузку. Ниже я изобразил результат GC Committed Bytes по времени.

Фон [*]Приложение работает как сервер Blazor. [*]Приложение размещается в Azure в соответствии с планом службы приложений Linux (точнее, P1v3)
Мобильная версия