Re[12]: Память и .Net
От: Pavel Dvorkin Россия  
Дата: 27.04.06 05:53
Оценка: 87 (13) +1 -1
Здравствуйте, Sinclair, Вы писали:

S>Конечно, мои знания ограничены.


Они у всех ограничены. Все знать нельзя — не DOS времена.

>Но тебе же незнание основ устройства дотнета не помешало критиковать его?


Как раз по устройству его я в общем себе более или менее представление имею — ну на уровне Рихтера хотя бы. Вот с библиотеками классов — это да, тут я высказываться в духе "это надо делать так или это нельзя делать" — поостерегусь

S>У меня нет под рукой Соломона-Руссиновича.


Настоятельно советую купить. Я серьезно говорю. У меня такое впечатление, что ты (и не только ты, скорее вы все) то ли не хотите, то ли времени нет, то ли еще что-то — но не знаете и не понимаете базовых механизмов функционирования ОС. Отсюда порой анекдотические заявления (и не только твое). А когда человек такие заявления делает, то доверие к тому, что он и по другим поводам говорит , резко падает — он же базу не знает.


S>Возможно, я что-то неверно понимаю. Но ты не мог бы мне пояснить, как именно Working Set процесса влияет на остальные процессы? Вот у меня типичное количество свободной физической памяти ~ 500 mb. Это означает, что отожранные янусом мегабайты никому не жмут. Я также заметил, что янус отжирает не фиксированное количество памяти. Когда у меня было 525 метров — он тратил 30 метров. Сейчас — 112.


Ничего удивительного

if(lowMemory)
VirtualAlloc (еще)
else
// как-нибудь обойдемся тем, что есть

И если в коде Януса такого явно и нет, то это не значит, что такого нет в .Net Framework или в исполняющей системе.


>Process Explorer при этом показывает 94.6 MB Private Bytes. Он же показывает 45 мегабайт во всех хипах дотнета. (Это все три поколения + Large Objects Heap). При этом Reserved = 92 Mb. То есть на всякий случай дотнет держит полсотни метров памяти про запас. Что-то мне подсказывает, что эти байты можно при нужде легко отдать.

S>Вот я сминимайзил януса — и его working set стал 1.5 Мb. Примерно за полсекунды. То есть когда у меня таки кончатся эти 500 метров свободной памяти (что означает, что я запустил какой-то еще фотошоп), янус подвинется и отдаст.

Попробую объяснить.

Private Bytes — это не так интересно. Равно как и Commited Bytes (включает в себя еще и не-private). Это объем вирт. памяти, который процесс коммитировал. Грубо говоря, это объем тех адресов, по которым можно обращаться без того, чтобы схлопотать AV.

Мне ничего не стоит сделать Commited Bytes (в Task Manager называется VM Size) для своей програмы большим, чем размер RAM. При этом часть будет выделена в RAM, часть в файлах (свопе, MMF)

А вот Working Set — это совсем другое дело. Это те страницы, которые сейчас в RAM. Это то, что твоя программа сейчас забрала себе.

Все процессы начинают работу с фиксированного Working Set (значений под руками нет). Далее они могут запрашивать все больше и больше памяти, VM Size будет у них расти (только они сами могут его потом уменьшить, освободив память) а вот будет ли при этом увеличиваться
Working Set — зависит от ситуации в машине. Если памяти RAM свободной много, то будет. Более того, система может даже дать больше, чем максимум (см. SetProcessWorkingSetSize). Если же памяти мало, то система будет вытеснять страницы, а не давать новые.

Теперь о минимизации. Разумеется, система отдает предпочтение активному приложению. И вот его минимизировали. Поскольку ты явно заявил, что не будешь с ним работать сейчас (правда это или нет — другой вопрос), то система усекает его Working Set , отнимая у него страницы.

А их куда девать ? Зависит от того, попадут ли они в список простаивающих или модифицированных. Если это страницы кода, то в первый (скорее всего), если данных — во второй (опять же скорее всего). Простаивающие страницы — кандидаты на выделение их другому процессу (после обнуления), модифицированные надо прежде того записать на диск , а потом уж давать другим.

Так чот уменьшить Working Set можно мгновенно практически — просто объявить эти страницы более не принадлежащими процессу, и все. Никакой записи на диск при этом вообще не произойдет.

Записью же на диск занимается поток отложенной записи. Ему до минимизации, макисмизации, выделения памяти каким-то процессом или освобождения им памяти напрямую дела нет. Он просто ждет на двух событиях. Одно будет установлено, когда количество модифицированных страниц превысит некий максимум, а другое — когда количество свободных страниц станет меньше некоторого минимума.

Теперь сам можешь понять, что происходит. Минимизировали приложение. Уменьшился резко Working Set. А дальше что будет — зависит от a) много ли RAM и b) насколько агрессивно новый процесс (с которым теперь начали работать) запрашивает память и как давно с ним не работали.

Если RAM много, а преемник не агрессивный, то отложенную запись будут откладывать . Некуда спешить — в системе тихо и мирно, всем памяти хватает.
Но если RAM мало, или преемник агрессивный, или с ним просто давно не работали (а для давно минимизированных процессов ОС может довести его Working Set до нуля), то начинается вот что. Преемник хочет памяти (или явно сейчас запрашивает, или, если с ним давно не работали, то он сейчас вернулся и просит вернуть ему Working Set . Срабатывает событие "количество свободных страниц станет меньше некоторого минимума". Начинается запись модифицированных страниц. Одновременно идет чтение страниц преемника (а куда денешься!). В итоге тормоза.

У меня на машине этот эффект проявляется, к примеру на Mozilla. Она у меня запущена всегда и я с ней почти не работаю, могу час-два к ней не обращаться. Если запустить некий процесс, активно отъедающий память, а потом переключиться на Мозиллу — тормоза очень заметны.

Так что чудес не бывает. Суммируя, могу сказать- если процесс захватил 60 Мб Working Set и эти данные не R/O, то их записывать на диск будут (разве что процесс убьют, тогда, мб, и не будут). Но, конечно, не немедленно, а когда потребуется. И если таких процессов много (а минимизация, как сам понимаешь, отнюдь не гарантирует, что процесс не будет ничего делать, это лишь в большинстве случаев так), то свопинг будет хороший. Но размазанный по времени, так что ощутит юзер тормоза или нет — от многих факторов зависит.

Поэтому , кстати, ASP.NET пользуется большой популярностью, а WinForms — нет. Для ASP.NET процесс-то, по существу, один — aspnet_wp.exe. Даже если там пять сайтов крутится и пользователей из Интернета тысяча. А вот если все приложения на рабочей станции перевести на .Net — будет тихий ужас. Если простенький пример Влада ухитрился иметь 60 Мб Working Set (хоть убей, не понимаю, как такого можно добиться! Если бы от меня потребовали такое на Win32 написать — отказался бы, не знаю, как это можно сделать — то при десятке таких приложений будет примерно то, как работа Windows 95 на 4 Мб. Не пробовал ? MS тогда заявила, что будет работать (3.1 прекрасно работала). Я и попробовал




PD>>Антон, честное слово — почитай. Тебе самому стыдно будет читать, что ты здесь написал.

PD>>Вообще меня удивляет в тебе одно. Ты прекрасно разбираешься во многом. Но зачем ты делаешь заявления в том, в чем ты явно не разбираешься — это я понять не могу.
S>Я не делаю заявлений. Я не понимаю, почему начинаются сказки про прожорливость приложений, которую так трудно заметить. Я не вполе понимаю все это многообразие цифр, которые показывают различные перформанс тулы. Я вижу, что весь этот Working Set — это фикция, поскольку легким манием руки он прыгает с 400 до 2, а потом до 30М.

Надеюсь, теперь понял, что это не фикция ? И опять-таки, твое поведение меня удивляет. Ну не понимаешь, ладно, ничего страшного, поищи информацию, почитай, поймешь же без труда, не так уж это сложно. Но зачем же фикцией называть, если ты не понимаешь ? Лучше сначала разобраться, а потом и не захочется фикцией называть.

И последнее. ИМХО у тебя сложилось впечатление, что я противник .Net. Вовсе нет. В целом я ее существование только приветствую, и отдаю ей должное. Хорошая система. Но не надо ее возможности преувеличивать. Поэтому я смотрю на вещи трезво. В чем-то она хороша, в чем-то нет. В чем-то классический С++ прекрасен, где-то его лучше и не пытаться применять. А вот для вас, похоже, нет бога, кроме .Net и бог един, посему остальным — анафема и костер!

Ну и коль уж о боге речь зашла, закончу фразой из писания

Не сотвори себе кумира
With best regards
Pavel Dvorkin
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.