A napokban hívtak egy gyakran nagyon belassuló Red Hat 5 Linux-on futó Oracle 11.2.0 SE adatbázis szervert megvizsgálni. Sokadszorra találkozom a problémával, hogy a szerver a látszólag helyes memória beállítások ellenére intenzíven, egyre nagyobb mértékben használja a swap-et, és az I/O nagy százaléka már csak erre megy el. Az adatbázis persze egyre lassabban válaszol, csörögnek telefonon a felhasználók, hogy "lefagyott a program!". A szerver csak az adatbázist futtatja, így nem nagyon lehet másra kenni a túlzó memória felhasználást.
A vizsgálat során természetesen kiderült, hogy azok a memória beállítások mégsem teljesen megfelelőek. Kiderült, hogy nemrég egy új modul lett az alkalmazásban beüzemelve, ami valószínűleg nagyobb PGA területet igényel, és a sok felhasználó miatt rendszeresen túl allokál a PGA (Megjegyzés, hogy az Oracle 12c-ben már a PGA_AGGREGATE_LIMIT paraméter gondoskodhat erről a problémáról, de ezt majd egy másik alkalommal részletezem). Az adatbázis memória paramétereinek átgondolását most nem részletezném, az majd egyszer egy külön téma lesz, most másról szeretnék írni. A problémás szerveren a legnagyobb lassulást az okozta, hogy az Oralce SGA nagy része kikerült a swap területre, miközben a kernel még pl. rengeteg filesystem cache-t is a memóriában tartott (swappiness kernel paraméterről szintén majd egy következő alkalommal). Tehát, ha el tudjuk érni, hogy az SGA ne kerülhessen swap területre, akkor sokat javulhat az ilyen helyzetekben adatbázisunk elérhetősége. Különösen fontos lehet ez egy olyan környezetben, ahol az adatbázisunk egy szerveren osztozik más memória intenzív alkalmazásokkal. A megoldás a Hugepages beállítása lehet.
Mi az a Hugepages? Normál esetben az Oracle adatbázis SGA területe a hagyományos memória területre kerül, ami 4K méretű lapokból (pagesize) áll, és a kernel dönti el, hogy az aktuális lap éppen swap, vagy a fizikai memóriában legyen. Nagyobb SGA méret esetén érezhető, hogy a 4K lapméret elég kicsi, így nagyon sok lapot kell nyilvántartani. A sok lap nyilvántartása több memóriát, és több processzoridőt igényel a kernel számára. Ha a memóriában foglalunk területet a Hugepages számára, akkor ott a lapméret 2M lesz (ez a linux kernel alapértelmezése x86_64 környezetben, de bizonyos CPU-k támogatják az 1G méretet is, cpuinfo pdpe1gb). Azt hiszem rögtön érthető, hogy ez mennyivel barátságosabb, hiszen az új lapméret 512 db korábbi lapnak felel meg. Mondjuk egy 8G SGA terület a 4k lapokkal több mint 2 millió lapot tartalmaz, addig Hugepages esetében csupán 4096-ot. Viszont a legfontosabb, hogy a Hugepages terület csak a fizikai memóriában lehet, tehát a kernel semmilyen körülmények között nem írhatja ki a swap területre. A gyakorlatban ez annyit tesz, hogy boot után rögtön elfoglalásra kerül a megadott méretű memória terület. Tehát ez a fizikai memória mindenképp lefoglalásra kerül, még akkor is, ha épp nem fut adatbázisunk. Fontos megemlíteni, hogy mivel csak az oracle felhasználónak adunk jogot a memória területre, ezért nem járhatunk úgy, hogy pl. a szerveren futó java alkalmazás elhasználja a memóriát előlünk. Azt hiszem ez elég jól hangzik, de sajnos van egy dolog, amiről le kell cserébe mondanunk. Az Oracle adatbázis csak az SGA területet tudja Hugepages memóriában tárolni, a PGA-t nem. Ebből adódik, hogy az Oracle 11g-ben megjelent Automatic Memory Management (AMM, MEMORY_TARGET, MEMORY_MAX_TARGET) funkciót nem tudjuk használni. Tehát nem lehetséges az Oracle szerverre bízni az SGA - PGA memória méretek dinamikus állítását, hanem nekünk kell kiszámítani, hogy mennyi SGA-ra, és mennyi PGA-ra lesz szükségünk. Olyan dinamikus környezetekben, ahol gyakran van szükség az SGA / PGA memória arányának a változtatására, sajnos nem ajánlatos a módszer. További hátránya, hogy egy bekapcsolt, üzemelő szerveren szinte képtelenség a Hugepages terület növelése. Tehát, ha növelni szeretnénk az adatbázis SGA területét, ahhoz növelnünk kell a Hugepages területet (hacsak eleve nem volt nagyobb területünk), ami valószínűleg csak a szerver újraindításával lehetséges.
Összefoglalva
Előnyök:
- jelentősen nagyobb lapméret miatt hatékonyabb, gyorsabb memória kezelés
- garantáltan mindig a fizikai memóriában van az SGA
- a szerveren garantált memória terület az adatbázis SGA számára
Hátrányok:
- Nem lehetséges az Oracle AMM használata
- Az SGA, PGA méretek pontos méretezést igényelnek
- Oracle memória paraméterek megváltoztatása után fontos a Hugepages beállításokat utánállítani
- Hugepages terület valószínűleg csak szerver újraindítással növelhető
Ha tetszik a Hugepages, és szeretnéd kipróbálni saját környezetedben is, akkor látogass vissza pár nap múlva! Nemsokára felteszek egy step by step leírást, ami egy 6Gb memóriával ellátott CentOS 5.10 64 bit-en futó Oracle 11gR2 adatbázis Hugepages beállítását tartalmazza.