Vraag Caching / voorladen van bestanden op Linux in RAM


Ik heb een vrij oude server die 4 GB RAM heeft en die de hele dag dezelfde bestanden serveert, maar het doet dit vanaf de harde schijf terwijl 3 GB RAM "gratis" is.

Iedereen die ooit geprobeerd heeft om met een ram te rijden, kan getuige zijn van dat het is geweldig in termen van snelheid. Het geheugengebruik van dit systeem is meestal nooit hoger dan 1 GB / 4 GB, dus ik wil weten of er een manier is om dat extra geheugen te gebruiken voor iets goeds.

  • Is het mogelijk om aan het bestandssysteem te vertellen dat het altijd bepaalde bestanden uit de RAM dient?
  • Zijn er andere methoden die ik kan gebruiken om de leesmogelijkheden van bestanden te verbeteren door gebruik te maken van RAM?

Meer bepaald ben ik niet op zoek naar een 'hack' hier. Ik wil bestandssysteemoproepen om de bestanden vanuit het RAM te serveren zonder een ram-station te hoeven maken en de bestanden daar handmatig te kopiëren. Of op zijn minst een script dat dit voor mij doet.

Mogelijke toepassingen hier zijn:

  • Webservers met statische bestanden die veel worden gelezen
  • Applicatieservers met grote bibliotheken
  • Desktopcomputers met te veel RAM

Om het even welke ideeën?

Bewerk:

  • Vond dit zeer informatief: De Linux Page Cache en pdflush
  • Zoals Zan opmerkte, is het geheugen niet echt gratis. Wat ik bedoel is dat het niet wordt gebruikt door applicaties en ik wil bepalen wat er in het cachegeheugen in het geheugen moet worden opgeslagen.

60
2017-07-21 07:01


oorsprong


Ik ben ook op zoek naar iets in deze richting. Ik denk niet dat algemene disk-block caching van het bestandssysteem het antwoord is. Stel dat ik wil dat schijfblok X altijd in de cache wordt opgeslagen. Iets maakt er toegang toe en de kernel slaat het op. Tot zover goed, maar het volgende proces wil blok Y, dus de kernel negeert mijn blok X en plaatst in plaats daarvan Y in de cache. Het volgende proces dat X wil, zal moeten wachten tot het van de schijf komt; dat is wat ik wil vermijden. Wat ik zou willen (en wat volgens mij de originele poster ook is) is om een ​​doorschrijfcache op een bestandssysteem te leggen dat garandeert dat de bestanden altijd aanwezig zijn
Aangezien de consensus lijkt te zijn dat Linux al vaak gebruikte bestanden voor je moet cachen, vraag ik me af of je het echt gelukt bent om verbeteringen aan te brengen met behulp van de hier gevonden adviezen. Het lijkt erop dat het handmatig beheren van caching nuttig kan zijn om de cache op te warmen, maar met het gebruikspatroon dat je beschrijft ("dezelfde bestanden de hele dag bedienen"), zou het niet helpen een reeds opgewarmde server veel, of helemaal niet. - Nate C-K
U zegt dat u niet op zoek bent naar een hack, maar Linux doet al wat u standaard wilt doen. De volgende vergelijking: "dezelfde bestanden de hele dag bedienen" + "vertel het bestandssysteem om altijd bepaalde bestanden uit het RAM te dienen" staat gelijk aan "Hack" per definitie. Hebt u daadwerkelijk prestatieverbeteringen opgemerkt? Naar mijn ervaring leest Linux cache de bejeezus uit je bestandssysteem. - Mike S
Ter verduidelijking, linux voert cachebestanden uit, maar de metadata worden gevalideerd voor elk bestand voor elk verzoek. Op draaiende roest, op een drukke webserver met veel kleine bestanden, kan dat nog steeds leiden tot IO-conflicten en voortijdige slijtage van schijven. Statische inhoud en scripts kunnen rsync worden in / dev / shm of een aangepaste tmpfs-mount bij het opstarten van de app. Ik heb dit een paar decennia gedaan en mijn schijven verslijten niet voortijdig. Ook mijn sites zijn op deze manier veel beter bestand tegen zware stootbelastingen. Dit helpt bij alles van de duurste hardware voor ondernemingen tot commodity-hardware. - Aaron


antwoorden:


vmtouch lijkt een goed hulpmiddel voor de klus.

Hoogtepunten:

  • vraag hoeveel van een map in de cache is opgeslagen
  • vraag hoeveel van een bestand in de cache wordt geplaatst (ook welke pagina's, grafische weergave)
  • laad bestand in cache
  • verwijder bestand uit cache
  • bestanden vergrendelen in de cache
  • uitvoeren als daemon

vmtouch handleiding

BEWERK: Het gebruik zoals gevraagd in de vraag staat in voorbeeld 5 op vmtouch Hompage

Example 5

Daemonise and lock all files in a directory into physical memory:

vmtouch -dl /var/www/htdocs/critical/

EDIT2: Zoals dat is genoteerd in de opmerkingen is er nu een git repository beschikbaar.


45
2017-09-01 21:40



Probeer voor toekomstige kijkers de vmtouch te gebruiken git repository in plaats van de instructies op de gekoppelde pagina te volgen. Op die manier krijg je een makefile en kan je updates ophalen. - randomous
Het lijkt erop dat er een limiet is aan de grootte van het bestand (4 GB). Is er een ander alternatief? - Alix Axel


Dit is ook mogelijk met behulp van de vmtouch Virtueel geheugen aanraakapparaat nut.

Met deze tool kun je de bestandssysteemcache op een Linux-systeem beheren. U kunt een specifiek bestand of een specifieke map in het VM-cache-subsysteem dwingen of vergrendelen, of gebruiken om te controleren welke gedeelten van een bestand / map zich binnen de VM bevinden.

How much of the /bin/ directory is currently in cache?

$ vmtouch /bin/
           Files: 92
     Directories: 1
  Resident Pages: 348/1307  1M/5M  26.6%
         Elapsed: 0.003426 seconds

Of...

Let's bring the rest of big-dataset.txt into memory...

$ vmtouch -vt big-dataset.txt
big-dataset.txt
[OOo                                                 oOOOOOOO] 6887/42116
[OOOOOOOOo                                           oOOOOOOO] 10631/42116
[OOOOOOOOOOOOOOo                                     oOOOOOOO] 15351/42116
[OOOOOOOOOOOOOOOOOOOOOo                              oOOOOOOO] 19719/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOo                        oOOOOOOO] 24183/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo                  oOOOOOOO] 28615/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo              oOOOOOOO] 31415/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo      oOOOOOOO] 36775/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo  oOOOOOOO] 39431/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO] 42116/42116

           Files: 1
     Directories: 0
   Touched Pages: 42116 (164M)
         Elapsed: 12.107 seconds

24
2017-10-23 16:50



dit is een geweldig hulpprogramma en doet precies wat OP heeft gevraagd. Als hij dit maar als een antwoord zou accepteren. - laebshade
Weet je of dit werkt met ZFS? - CMCDragonkai
@CMCDragonkai Ik denk niet dat dit nodig is met ZFS ... Denk: ARC en L2ARC. - ewwhite


Na wat uitgebreid lezen over de 2.6-kernelruil en pagina-caching-functies vond ik 'fcoretools'. Die uit twee hulpmiddelen bestaat;

  • fincore: zal onthullen hoeveel pagina's de applicatie heeft opgeslagen in het kerngeheugen
  • fadvise: hiermee kunt u het kerngeheugen manipuleren (pagina-cache).

(Als iemand anders dit interessant vindt, plaats ik dit hier)


17
2017-07-21 08:09



Ik dacht dat er een programma was om dat ergens te doen. 1 - Brad Gilbert


De truc van een arme man om spullen in de cache van het bestandssysteem te krijgen, is door hem simpelweg in te pakken en om te leiden naar / dev / null.


16
2017-07-21 07:19



Mee eens. En als u wilt zorgen dat bepaalde bestanden in de cache worden opgeslagen, maakt u een cron-taak cats het bestand periodiek naar / dev / null - Josh


Linux zal zo veel schijf-IO opslaan in het geheugen als mogelijk. Dit is wat de cache- en buffergeheugenstatistieken zijn. Het zal waarschijnlijk beter werk doen dan je bij het opslaan van de juiste dingen.

Als u er echter op staat uw gegevens in het geheugen op te slaan, kunt u een ram-drive maken met tmpf's of ramf's. Het verschil is dat ramfs al het geheugen dat u vraagt ​​toewijst, ware het dat tmpf's alleen het geheugen gebruiken dat uw block-apparaat gebruikt. Mijn geheugen is een beetje roestig, maar je zou moeten kunnen doen:

 # mount -t ramfs ram /mnt/ram 

of

 # mount -t tmpfs tmp /mnt/tmp

en kopieer vervolgens uw gegevens naar de map. Vanzelfsprekend zullen uw gegevens verloren gaan wanneer u de machine uitschakelt of de desbetreffende partitie ontkoppelt.


15
2017-07-21 07:17



Bedankt voor je antwoord, maar dit is duidelijk wat ik wil vermijden. Anders zou ik het script zo schrijven dat de computer de ramdrive zou maken, de bestanden zou kopiëren en symbolisch zou linken naar de ramdrive. Maar dan zijn mijn gegevens inconsistent. Ik hoopte op een bestandssysteem waar ik bepaalde bestanden kan 'taggen' om in het cachegeheugen in het geheugen te worden opgeslagen. Maar misschien ben ik een beetje te optimistisch. - Andrioid
U "tagt" bestanden om in de cache te bewaren door ze te openen. - womble♦
Was er maar een manier om de meest gebruikte bestanden automatisch te taggen. - David Pashley
Blimey, sarcasme reist niet goed doet het :) - David Pashley
Ja bedankt. Ik begrijp het concept van IO caching. Ik heb het zelfs in mijn antwoord uitgelegd. Het lijkt erop dat je de subtiele opmerking niet hebt gelezen dat het sarcasme was. - David Pashley


Er zijn twee kernelinstellingen die aanzienlijk kunnen helpen, zelfs zonder andere hulpmiddelen te gebruiken:

swappiness

vertelt linux kernel hoe agressief het moet swappen. Citaat van het Wikipedia-artikel:

Swappiness is een eigenschap voor de Linux-kernel die de balans wijzigt tussen runtime-geheugen uitwisselen, in plaats van pagina's uit de cache van de systeempagina te laten vallen. Swappiness kan worden ingesteld op waarden tussen 0 en 100 inclusief. Een lage waarde betekent dat de kernel zoveel mogelijk proberen te vermijden, waarbij een hogere waarde ervoor zorgt dat de kernel agressief probeert om swapspace te gebruiken. De standaardwaarde is 60 en voor de meeste desktopsystemen kan het instellen op 100 de algehele prestaties beïnvloeden, terwijl een lagere instelling (zelfs 0) de interactiviteit kan verbeteren (de latentie van reacties verminderen).

vfs_cache_pressure

Citeren van vm.txt:

Regelt de neiging van de kernel om het geheugen op te eisen dat wordt gebruikt   caching van directory- en inode-objecten.

Bij de standaardwaarde van vfs_cache_pressure = 100 probeert de kernel dit te doen   dividenden en inodes terugvorderen tegen een "eerlijke" koers met betrekking tot pagecache en   swapcache reclaimen. Het verlagen van vfs_cache_pressure geeft de voorkeur aan de kernel   om tandheelkundige en inode caches te behouden. ...


Door in te stellen swappiness hoog (zoals 100), verplaatst de kernel alles wat niet hoeft te worden verwisseld, waardoor RAM vrijgemaakt wordt voor het cachen van bestanden. En door in te stellen vfs_cache_pressure lager (laten we zeggen 50, niet om 0!), het zal caching-bestanden bevoordelen in plaats van applicatiegegevens in het RAM-geheugen te houden.

(Ik werk aan een groot Java-project en elke keer als ik het uitvoerde, kostte het veel RAM-geheugen en werd de schijfcache leeggemaakt, dus de volgende keer dat ik het project compileerde, werd alles opnieuw van de schijf gelezen. om de bronnen en de gecompileerde uitvoer in het cachegeheugen in het RAM-geheugen te bewaren, wat het proces aanzienlijk versnelt.)


5
2017-10-23 16:17





Ik betwijfel ten zeerste dat het eigenlijk bestanden vanaf de schijf levert met 3 GB RAM-vrij. Het cachen van Linux-bestanden is erg goed.

Als u schijf-IO ziet, zou ik uw logboekconfiguraties bekijken. Veel logboeken worden ingesteld als niet-gebufferd, om te garanderen dat de nieuwste logboekinformatie beschikbaar is in het geval van een crash. In systemen die altijd snel moeten zijn, gebruikt u de gebufferde log IO of gebruikt u een externe logboekserver.


2
2017-07-21 07:11



Juist, ik wil gewoon controleren wat er in de cache wordt opgeslagen. - Andrioid