Presne to je duvod proc NT kernel nebude pouzivat celou fyzickou pamet pokud mu nedate dostatek swap souboru (protoze odmita pouzivat stranky ktery by v pripade potreby nemel kam odlozit). Rika ten clanek ze to samy plati pro FreeBSD (a ne pro Linux)? Co udela Linux kernel kdyz potrebuje odswapovat stranku a nema kam? Zpanikari?
Pokud se nepletu, tak je mozne oboji. Ted ale netusim kde se to da prepnout. Bud se misto pro odswapovani hleda uz pri namapovani, nebo az kdyz je potreba odswapovavat. To prvni je rychlejsi, to druhe je bezpecnejsi. Na linuxu existuje OOM killer, kterej je dost slusne konfigurovatelnej a ten se snazi zabit nejvetsiho zrouta. Bohuzel tohle reseni nema vyznam,
kdyz pouzivate multithreadovou aplikaci nebo JAVU.
U openldapu se stava, ze OOM killne vlakno, ktery se zblaznilo. Pamet se uvolni, ale protoze to vlakno neco zamknulo, tak se to cely zastavi a linuxovej kernel je stastnej ze ma pamet.
U multiprocesovejch demonu jako je treba apache to funguje vyborne, listener nic nealokuje a kdyz nejakej jeho syn(worker) naalokuje moc pameti tak ho
OOM zabije, listener dostane signal SIGCHLD a vsechno jede dal.
Takhle to fungovalo do jádra 2.4.22. V 2.4.23 byl OOM killer odstraněn, a bylo to uděláno tak, že se kilne aktuální proces, který se právě snaží alokovat paměť (což může být bohužel úplně náhodný proces, neboť paměť se alokuje i při prostém běhu programu a load-on-demand). To řešení v 2.4.22 a nižších umožňovalo deadlocky (např. --- proces, co sežral nejvíc paměti čeká na semafor, jiný proces semafor drží a snaží se alokovat paměť, paměť není, jádro zabuje ten proces, co čeká na semaforu, ale on pořád žije, protože se nemůže dostat z jádra).
Ked uz je podpora SMP v memory managent-e ako na klasickom jedno CPU stroji a NUMA tak preco nie SUMO, cize hybrid SMP a NUMA vid architektura AMD64.
fyzicka oragnaizacia NUMA ale chova sa to aj ako SMP, ako velmi sa to chova ako NUMA sa da nasatvit v Bios-e a zavysok je chovanie sa ako SMP... Neda sa vyuzit nejake dynamicke prepinanie v ramci SUMO na optimalizaciu kodu?
Mam tady dual opteron s deskou Tyan Thunder K8SPro, a Linux se k tomu chova normalne jako k NUMA stroji. V cem se lisi SUMO od NUMA?
Tahle vec se da nastavit budto tak, ze pamet u CPU0 je na nizsich adresach a pamet u CPU1 (je-li nejaka) za nimi, nebo prokladane (zrejme po cache-line). Tohle je vyhodnejsi pokud nemate NUMA-aware OS, protoze se pamet zatizi vicemene stejne. Na druhou stranu kernel Linuxu je NUMA-aware, takze tam neni duvod to nepouzit.
-Yenya
Hezky clanek. Ale nektere kousky jsou matouci, napr:
- Každá stránka má počítadlo použití ? toto počítadlo určuje, z kolika míst někdo na stránku ukazuje. Funkce pro uvolnění stránky free_pages toto počítadlo zmenší o jedna a stránku uvolní pouze v případě, že počítadlo dosáhne nuly.
A pak na jinem miste clanku:
- Na druhou stranu absence seznamu mapování stránky může výrazně zpomalit prohledávání na uvolnitelné stránky (na FreeBSD se ke stránce ihned najde seznam všech mapování; je vidět, zda je stránka nepoužitá, a taková se pak uvolní; na Linuxu se musí procházet všechny tabulky stránek a stránka se uvolní, až když je odmapovaná ve všech tabulkách).
Takze se kontroluje pocitadlo nebo se prochazeji vsechny tabulky stranek, jestli nahodou nekdo na stranku neukazuje?
Ahoj,
Zajímalo by mne, jakým způsobem se na Linuxu nebo BSD řeší stav, kdy proces 1) alokuje anonymním mmap()em hodně adresového prostoru (řekněme 1GB) 2) z velké míry >50% ho využije, čímž vznikne >512MB dirty stránek 3) program naráz (třeba po GC) zjistí že 90% stránek, které používal je nyní FREE.
Existuje nějaká efektivní metoda, jak OSu oznámit že tyto stránky není nutno swapovat, ale že je lze prostě zahodit?
Celou arenu odalokovat nemohu, protože stále obsahuje nějaké živé stránky, zkopírovat je do nové areny také nechci, protože by se hnulo s adresama.
Když na jednotlivé free stránky zavolám unmap(), odmapuje se pouze ta jedna stránka v rámci původního segmentu, nebo se tím ten segment splituje?
Diky, to je presne ono. Na Linuxu je to taky. Ale lepsi bude MADV_DONTNEED, protoze chci aby prvni pristup udelal zero-fill-on-demand, nikoliv segfault.
Ted jeste jak zjistit nejlepsi okamzik pro spusteni GC cyklu v aplikaci. Jak zjistim (s jistym predstihem), ze kernelu dochazi pamet, a chysta se swapovat?
MADV_DONTNEED: Do not expect access in the near future. (...) the kernel can free resources (...) accesses (...) will succeed, but (...) zero-fill-on-demand for mappings without an underlying file.
MADV_FREE: Na Linuxu v mman.h vubec neni, pri takovemto chovani MADV_DONTNEED zrejme ani neni potreba.
Internet Info Root.cz (www.root.cz)
Informace nejen ze světa Linuxu. ISSN 1212-8309
Copyright © 1998 – 2021 Internet Info, s.r.o. Všechna práva vyhrazena.