update/bdflush problem
Alexandr Malusek
malusek na sysel.ujf.cas.cz
Pátek Srpen 1 21:31:39 CEST 1997
Egon Eckert <egon na www.capitol.cz> writes:
> A k tomuhle se taky chystam, myslim, ze to opravdu bude to cteni - ono to
> prechazi do vytrvaleho chrochtani v situaci, kdy ta aplikace ma VM size pres
> 10 MB, bezi mi k tomu X-y, gdb, ddd, mam 32 MB pameti a soubor po kterem to
> beha (a cte) ma 20 MB. Asi se pomalu s problemem presunu jinam - totiz do
> optimalizace datovych struktur...
Jednou jsem resil stiznost, ze system nepouziva diskove buffery, a
proto ze je aplikace nesmirne pomala, protoze data vzdy musi cist z
disku. Pres truss (obdoba strace) jsem ziskal parametry systemoveho
volani lseek a ty jsem potom analyzoval. Ukazalo se, ze pristupovy
vzor pro cteni z onoho temer 1 GB velkeho souboru byl vicemene
"nahodny". Mate-li v tomto pripade 1000 MB velky soubor a 100 MB
pameti pro buffery, pak pravdepodobnost, ze cteni bude z bufferu, je
1/10. Vlastni urychleni aplikace diky pritomnosti diskovych bufferu je
pak take priblizne o 1/10 - tedy temer zanedbatelne. Zaver byl, ze
diskove buffery funguji OK, ale ze je potreba predelat algoritmy (nebo
koupit ten 1GB pameti :-) ).
> Posledni otazka: existuje neco jako
> page-locking - tedy to, ze aplikace oznaci nejake casti sveho prostoru jako
> 'neswapovatelne' ?
Ano. mlock() zabrani odswapovani oblasti pameti a mlockall() zabrani
odswapovani temer vseho co souvisi s danym procesem (i stranek
namapovanych do pameti pres mmap()). Znam to ze SVR4, kde scheduler
implementuje i tridu pro real-time procesy - jejich stranky by nemely
byt odswapovany na disk. No a jak tak koukam (man sched_setscheduler),
tak Linuxi scheduler ty real-time procesy umi take.
> Pri behu jsem pomoci 'ps -m' sledoval ostatni aplikace, a
> prestoze byly zjevne idle (sleep), nektere ne a ne postupne mizet z pameti
> do swapu - prestoze by se tim uvolnovalo drahocenne misto pro diskovou
> cache.
Ono to chvilku trva. Zkusil jsem pres
dd if=/dev/hda2 of=/dev/null bs=32768
cist z disku a vypisovalo se mi:
$ vmstat 5
procs memory swap io system cpu
r b w swpd free buff cache si so bi bo in cs us sy id
2 0 0 11320 252 1516 4612 0 0 3245 0 6592 206 96 4 0
2 0 0 11320 252 1548 4580 5 0 2927 0 5963 198 93 7 0
...
2 0 0 13744 268 7272 1656 0 3 1881 1 3871 124 73 27 0
2 0 0 13744 228 7348 1604 6 2 3159 0 6433 210 98 2 0
^^^^ ^^^^
Je videt, ze na zacatku bylo pro diskove buffery vyhrazeno 1516 KB a
pro swapovatelnou virtualni pamet (cache) 4612 KB, zatimco na konci
se tento pomer obratil.
Zaroven jsem si ujasnil, ze Linux nepouziva spravu virtualni pameti
jakou ma SVR4. SVR4 klasicke diskove buffery neimplementuje, vse resi
pres virtualni pamet. Linux implementuje klasicke diskove buffery, ale
jejich mnozstvi se dynamicky meni podle potreby - ubira se ze
swapovatelne virtualni pameti pro procesy a jejich data. Je to celkem
zajimave reseni.
--
Alexandr Malusek (malusek na ujf.cas.cz)
UJF AV CR
Další informace o konferenci Linux