Има ли смисъл да се кешират данни, получени от файл с карта на паметта?

Или би било по-бързо да се препрочетат отново тези данни от картографираната памет, тъй като операционната система може да имплементира свой собствен кеш?

Естеството на данните не е известно предварително, предполага се, че четенията на файлове са произволни.


person Alex Radzivanovich    schedule 25.03.2010    source източник
comment
+1 за това, че е много добър въпрос за задаване. Освен ако някой не попита, няма да разбере отговора.   -  person Ian Boyd    schedule 17.05.2012


Отговори (2)


Исках да спомена няколко неща, които прочетох по темата. Отговорът е не, не искате да гадаете втори път за мениджъра на паметта на операционната система.

Първият идва от идеята, че искате вашата програма (напр. MongoDB, SQL Server) да се опита да ограничи паметта ви въз основа на процент свободна RAM:

Не се опитвайте да разпределите памет, докато няма само x% безплатно

Понякога клиент ще поиска начин да проектира своята програма, така че да продължи да консумира RAM, докато остане само x% свободна. Идеята е тяхната програма да използва RAM агресивно, като същевременно оставя достатъчно налична RAM (x%) за друга употреба. Освен ако не проектирате система, в която вие сте единствената програма, работеща на компютъра, това е лоша идея.

(прочетете статията за обяснение защо е лошо, включително снимки)

Следващото идва от някои бележки от автора на Varnish и обратен прокси:

Varnish Cache - Бележки от архитекта

И така, това, което се случва със сложното управление на паметта на squids, е, че влиза в битки със сложното управление на паметта на ядрата и като всяка гражданска война, това никога не постига нищо.

Какво се случва е следното: Squid създава HTTP обект в "RAM" и той се използва няколко пъти бързо след създаването. След известно време не получава повече удари и ядрото забелязва това. След това някой се опитва да вземе памет от ядрото за нещо и ядрото решава да избута тези неизползвани страници от паметта, за да размени пространството и да използва (кеш-RAM) по-разумно за някои данни, които всъщност се използват от програма. Това обаче се прави без калмарите да знаят за това. Squid все още смята, че тези http обекти са в RAM и ще бъдат, още в секундата, в която се опита да получи достъп до тях, но дотогава RAM се използва за нещо продуктивно.

Представете си, че правите кеша на нещо от картографиран в памет файл. В някакъв момент в бъдещето тази памет, която съдържа този "кеш", ще бъде преместена на диск.

  • операционната система е записала на твърдия диск нещо, което вече съществува на твърдия диск

След това идва момент, когато искате да извършите търсене от вашата "кеш" памет, а не от "истинската" памет. Опитвате се да осъществите достъп до „кеша“ и тъй като той е изваден от RAM, хардуерът повдига PAGE FAULT и кешът се премества обратно в RAM.

  • вашата кеш памет е също толкова бавна, колкото и "истинската" памет, тъй като и двете вече не са в RAM

И накрая, искате да освободите кеша си (може би вашата програма се изключва). Ако "кешът" е бил сменен, операционната система трябва първо да го смени обратно, за да може да бъде освободен. Ако вместо това просто сте декартирали своя картографиран в памет файл, всичко е изчезнало (нищо не трябва да се сменя).

  • в този случай вашият кеш прави нещата по-бавни

Отново от Реймън Чен: Ако приложението ви се затваря - затворете вече:

Когато DLL_PROCESS_DETACH ви каже, че процесът излиза, най-добрият ви залог е просто да се върнете, без да правите нищо

Редовно използвам програма, която не следва това правило. Програмата заделя много памет по време на живота си и когато изляза от програмата, тя просто стои там няколко минути, понякога се върти на 100% CPU, понякога разбърква твърдия диск (понякога и двете). Когато вляза с дебъгера, за да видя какво става, откривам, че програмата не прави нищо продуктивно. Просто методично освобождава всеки последен байт памет, който е разпределил по време на живота си.

Ако компютърът ми не е бил под голям натиск върху паметта, тогава по-голямата част от паметта, която програмата е разпределила по време на живота си, все още не е изведена, така че освобождаването на всяка последна капка памет е операция, свързана с процесора. От друга страна, ако бях започнал компилация или бях направил нещо друго, изискващо много памет, тогава по-голямата част от паметта, която програмата беше разпределила по време на живота си, беше извадена, което означава, че програмата показва цялата тази памет обратно от твърд диск, само за да може да се обажда безплатно от него. Всъщност звучи някак злобно. — Ела тук, за да ти кажа да си вървиш.

Цялото това анално-рентентивно управление на паметта е безсмислено. Процесът излиза. Цялата тази памет ще бъде освободена, когато адресното пространство бъде унищожено. Спрете да губите време и просто излезте вече.


Реалността е, че програмите вече не работят в "RAM", те работят в памет - виртуална памет.

Вие можете да използвате кеш, но трябва да работите с мениджъра на виртуалната памет на операционната система:

  • искате да запазите кеша си във възможно най-малко страници
  • искате да сте сигурни, че те остават в RAM, поради това, че са много достъпни (т.е. всъщност са полезен кеш)

Достъп до:

  • хиляда 1-байтови местоположения около файл от 400 GB

е много по-скъпо от достъпа

  • едно място от 1000 байта във файл от 400 GB

С други думи: не е нужно наистина да кеширате данните, имате нужда от по-локализирана структура на данните.

Ако държите вашите важни данни ограничени до една 4k страница, ще играете много по-добре с VMM; Windows е вашият кеш.

Когато добавите 64-байтови кеш-редове, подравнени с четири думи, има още по-голям стимул да коригирате оформлението на вашата структура на данни. Но тогава не искате да е прекалено компактен или ще започнете да страдате от наказания за производителност от изчистване на кеша от Фалшиво споделяне.

person Ian Boyd    schedule 17.05.2012
comment
Съгласен. Въпреки че, ако приемете значението на кеширани разговорно, разбира се, понякога има смисъл да имате второ копие на данните, ако представянето на диска не съвпада с необходимото в RAM. Въпреки че това разтяга значението на кеширано и вероятно така или иначе ще премахнете картографирането на данните след преобразуването. - person uliwitness; 08.04.2016

Отговорът е силно специфичен за ОС. Най-общо казано, няма да има смисъл да кеширате тези данни. Както "кешираните" данни, така и картата на паметта могат да бъдат преместени по всяко време.

Ако има някаква разлика, тя ще бъде специфична за операционна система - освен ако не се нуждаете от тази детайлност, няма смисъл да кеширате данните.

person Yuval Adam    schedule 25.03.2010