Post by unknownBestaat er ook een methode in Linux om een file te schrijven waarbij deze
niet tevens ook in de buffercache terecht komt?
Ik wil een (grote) file schrijven en ik heb geen noodzaak om hem
binnenkort weer te lezen. De blokken in de buffercache bewaren heeft dus
geen zin, en werkt bovendien contra-productief (omdat ik wel ander dingen
in het geheugen wil bewaren).
Hoe pak ik dat aan?
http://stackoverflow.com/questions/4703946/unbuffered-i-o-in-linux
Hmm kennelijk is er C-coding nodig om dit werkend te maken.
Ik zal een voorbeeld geven van hoe ik het wil inzetten:
Stel je wilt een backup maken naar een externe disk. Je plugt de
externe disk in, (auto)mount hem, en dan ga je als een idioot data
schrijven naar die disk.
Bijvoorbeeld "tar cf /media/usbdisk/backup1.tar /local" of iets
als "cp -a /local /media/usbdisk/local".
(extra detail vlaggetjes om dit helemaal goed te laten werken even
weggelaten, het gaat om het idee)
Wat iedere Linux gebruiker wel weet is dat als je dit doet op een
systeem waar je op zit te werken, de performance totaal wegzakt.
Veel erger dan bij Windows, bijvoorbeeld.
Hoe komt dit? Door de buffercache die vaak zo opgehemeld wordt.
"unused memory is wasted memory", je kent het wel. In die pagina
waar hierboven naar verwezen wordt komt ook weer iemand ermee.
Maar in dit geval is het totaal nutteloos. Het memory wordt gevuld
met allemaal copietjes van blokken die net naar die externe schijf
geschreven zijn, en om ruimte te maken voor al die shit worden blokken
van programma's die op dat moment draaien vrijgemaakt of zelfs
uitgeswapt! (als het r/w data is)
Gevolg: het systeem performed totaal niet meer. Als je wisselt van
virtueel scherm dan wordt het nieuwe scherm tergend langzaam opgebouwd,
e.d. Sterker nog: als het een beetje tegenzit dan is het zelfs
nauwelijks meer mogelijk om dit programma af te breken omdat het
systeem geen zin meer heeft om je terminal window in memory te houden
en je ^C signal te verwerken. Alles voor disk buffering.
En als je klaar bent unmount je de disk en wordt al dat memory op
slag weer vrijgegeven en komt de performance langzaam weer terug.
Wat je dus eigenlijk wilt is dat er wel wat buffering is om het schrijven
soepel te laten verlopen, maar dat ie niet alle geschreven blokken nog
weer eens als "recent" gaat zitten bestempelen en in memory voorrang
geeft boven andere blokken die 5 minuten geleden nog nodig waren.
Dit zou dus moeten kunnen door die outputfile O_DIRECT te openen. Maar
helaas zie ik in tar of cp geen opties om dat te doen.
Vroeger gebruikte ik in combinatie met tape nog wel eens het programma
"buffer":
tar cf - /local | buffer -o /dev/tape
Daarmee kon je dan voorkomen dat de tape steeds maar heen en weer
stond te spoelen. Dit lijkt me een plek waar ik eventueel een
O_DIRECT open zou kunnen doen van de outputfile maar ik zie in
buffer ook geen optie daarvoor.
Iemand een idee hoe dat zou kunnen zonder zelf een nieuwe tool
te gaan maken?