Почему net core потребляет много оперативной памяти?
Почему net core потребляет много оперативной памяти на linux относительно windows?
Если я запускаю небольшую программу на .NET в доккере под linux ubuntu то вижу вот такие цифры
ps aux
....
root 2318184 0.1 1.6 274087256 134820 ? Ssl Dec09 10:05 dotnet Parsepool.dll
т.е. 270 мб оперативной памяти потребляет программа но если эту же программу запустить на windows то потребление памяти составит всеголишь 11 мб
у тебя там не используется какой-нибудь WebBrowser компонент, он когда то на mono работал с помощью firefox а на windows - ie, последний интегрирован насмерть в систему и дополнительной памяти не потребляет (и вообще там крохи), но я не совсем уверен, с последними версиями mono это уже не должно работать
во-первых, столбцы VSZ и RSS отображаются в килобайтах. т. е. это значение из ps, о котором речь, означает 274 ГБ.
во-вторых, судя по тому, какие значения памяти берутся из винды на скриншоте в ответе ниже, сравнение следует делать со столбцом RSS, а не VSZ; раз речь о потреблении физической памяти, то причём тут Virtual Memory Size AKA VSZ?
в-третьих, в столбец RSS попадает также и разделяемая память подгруженных библиотек. попадает ли в винде в указанный на скрине столбец разделяемая память? не знаю. возможно что нет. с помощью cat /proc/2318184/status | grep -P '^Rss', где 2318184 является PID'ом процесса, можно гарантированно сказать, что процесс занимает как минимум RssAnon оперативной памяти и как максимум RssAnon+RssFile оперативной памяти (насколько знаю, в RssFile также могут попадать shared-страницы), а также использует RssShmem объём в качестве разделяемой оперативной памяти (т. е. данные страницы оперативной памяти потенциально могут также использоваться другими приложениями в ОС). впрочем, в случае контейнеризации приложения в докере вполне возможно, что все три значения действительно могут быть просуммированы, не знаю, по изоляции shared memory с докером мне сказать нечего.
но если отбросить docker, то реальное потребление процессом памяти было бы не более RssAnon + RssFile, т. е. нужно смотреть, какая часть из 134 МБ относится к этим значениям.
Ну и 3:
Даже если действительно на винде эта программа жрёт 11мб, а в докер-контейнере 200мб. Что это тебе даёт?
Винда всё ещё будет отжирать минимум гиг, а линуксовое ядро будет болтаться около 100мб. И не забывай про п1 и 2
Проблема собственно в том, что я расчитывал на запуск множества программ (разных) и если каждая будет потреблять 270+ мб в докере под линуксом, а на винде по 10-20мб, то логичнее использовать win, а мне не хотелось бы
Delakey Blackhole, уточните: вы сравниваете потребление памяти программой в контейнере для Linux и запущенной без контейнера в Windows? Так это явно некорректное сравнение. Для примера можете попробвать запустить эту же программу в Windows-контейнере (такие существуют и вроде как, поддерживаются версией docker, которую адапртировала MS, подробностями, к сожалению, поделиться не могу).
PS У вас, кстати, программа использует не только 11M закрытой памяти процесса, но ещё и 37М разделяемой памяти (скорее всего, какие-то dll) Между контейнерами такая память, скорее всего, разделяться не будет.
Delakey Blackhole, нет, не логичнее.
1. даже если программа на линуксе потребляет 200мб, а на винде 11 (что не правда), то с учётом памяти, которая требуется для работы ядра, на линуксе ты сможешь запустить порядка 10 экземпляров за ту же память, которая требуется для работы пустой винды.
2. Покажи подробнее вывод потребляемой памяти на линуксе. Что означает число 134820?
3. Попробуй ещё снять метрики по размеру кучи и сколько в ней занято. Может на Linux сразу было выделено много памяти на будущее?
4. Попробуй запустить приложение в виндовом контейнере
ткнем пальцем в небо и предположим что дотнетовская оболочка жрет 200-11мб = 189мб.
винда не прибавляет 189 мб дотнета к объему проги, ибо куча других компонентов и программ винды использует тот же дотнет и 189 мб оболочки расшарены на это все хозяйство.
а в линухе объем дотнет оболочки прибавляется к памяти т.к. дотнет используется только для данной проги.
спробуй запустить несколько програм под дотнетом внутри одного линукс контейнера.
винда не прибавляет 189 мб дотнета к объему проги, ибо куча других компонентов и программ винды использует тот же дотнет и 189 мб оболочки расшарены на это все хозяйство.
pfg21, это тогда была бы та самая разделяемая память про которую я написал выше. Но ее по данным сос скриншота, сильно меньше.
У меня предположение, что дело тут в накладных расходах на контейнеризацию.
MVV, кстати да, блин., совсем забыл
для вывода ps aux
274087256 это VSZ
Виртуальная память (VSZ) — это память которую выделили процессу, но не факт что он успел в эту память что-то записать.
134820 это RSS
Резидентная память (RSS) — это память которую процесс занял, то есть что-то сохранил в виртуальную память. Именно резидентная память показывает сколько процесс потребляет физической памяти. https://habr.com/ru/articles/777250/
т.е. "270 Мб" 274087256 это виртуальное пространство выданное ос для работы проги. а вот потребило оно из нее всего 134820...
в винде тоже есть параметры Virtual Size (это я из параметров Procces Explorer от Марка Русиновича говорю).
чтото ты чутка путаешь :)
pfg21, я-то тут причем? Я всего лишь интерпретирую строчку в выдаче Task Manager со скриншота в Windows, а про зарезервированное адресное пространство там ничего нет.
Ну, а что там в Linux показывается - про это я не знаю.
Василий Банников, прав. в винде, возможно паровоз зависимостей дотнет уже в оперативке!
.. в линукс все весело - гномовский сисмон, кдешный, и htop могут показывать разные значения в одной системе, и в один момент времени. и с большим разбросом..
.. оставим гуи - допустим вы выбрали стек дотнет под линукс, первое приложение будет поднимать зависимости райнтайма. однако каждое следующее уже будет добавлять те самые копеешные мегабайты (если конечно само не требует много оперативки под данные)
Да, программа использует 29мб и вы зря волновались
Добавлю для справки
Резидентная память (RSS) — это память которую процесс занял, то есть что-то сохранил в виртуальную память. Именно резидентная память показывает сколько процесс потребляет физической памяти.
VSZ - это сокращение от Virtual Memory Size (размер виртуальной памяти). Это общий объем памяти, к которому процесс может гипотетически получить доступ.