Előző alkalommal leírtam, hogy bizonyos körülmények között mennyire hasznos lehet a Hugepages beállítása, most pedig egy konkrét példát hozok a konfigurációra.
Kiinduló környezet:
Virtuális környezetben (Természetesen Oracle Virtualbox) került telepítésre egy CentOS 5.10 64 bit 6 Gbyte memóriával, az adatbázis pedig egy 11gR2, létrehoztam egy PROBA nevű adatbázist. Az adatbázist direkt AMM-el hoztam létre, azaz a MEMORY_TARGET init.ora paraméter beállításával az adatbázist összesen 4G memória felhasználásra bíztattam. Korábban már megbeszéltük, hogy AMM esetén nem lehet Hugepages-t beállítani, ezért is kezdem innét.
Vágjunk bele!
Első lépésben a legfontosabb dolog, hogy az AMM-et megszüntessük. Az AMM-et a memory_max_target és a memory_target initora paraméterek szabályozzák. Sys vagy system felhasználóval belépve először leellenőrizzük a jelenlegi memory_target beállításokat, majd töröljük őket az spfile-ból, végül beállítjuk az új sga_target és pga_aggregate_target értékeket. Íme a szükséges utasítások:
SQL> select NAME,VALUE from v$parameter where name like 'memory%target';
NAME
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
memory_target
4294967296
memory_max_target
4294967296
SQL> alter system reset memory_target scope=spfile;
System altered.
SQL> alter system reset memory_max_target scope=spfile;
alter system reset memory_max_target scope=spfile
*
ERROR at line 1:
ORA-32010: cannot find entry to delete in SPFILE
SQL> alter system set sga_target=3G scope=spfile;
System altered.
SQL> alter system set pga_aggregate_target=1G scope=spfile;
System altered.
SQL>
Illetve, ha már init.ora paramétereket állítunk, akkor állítsuk be a következőt is:
alter system set use_large_pages=only scope=spfile;
A use_large_pages=only paraméterrel beállítjuk, hogy az adatbázis csak Hugepages memória területet használhasson az SGA számára. Ezzel elkerüljük, hogy a beállított, lefoglalt Hugepages terület helyett mégis a hagyományos memória területre kerüljön az SGA. Amennyiben nincs jogosultsága, vagy nincs elegendő hely a Hugepages memóriában, akkor az adatbázis elindítása az ORA-27137 hibába fog ütközni.
Az adatbázis újraindítása után ellenőrizzük le, hogy sikerültek-e a beállítások.
SQL> select NAME,VALUE from v$parameter where name in ('sga_target','memory_target','memory_max_target','pga_aggregate_target');
NAME
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
sga_target
3221225472
memory_target
0
memory_max_target
0
pga_aggregate_target
1073741824
SQL>
Következő lépésben ellenőrizzük a szerver jelenlegi Hugepages beállításait, illetve ellenőrizzük a fizikai memória méretét. A /proc/meminfo -ban minden számunkra szükséges információ megtalálható. Fontos, hogy biztosak legyünk a fizikai memória és a Hugepagesize (a Huge memória lap) pontos méretével kapcsolatban.
MemTotal: 6113212 kB
[oracle@centos-proba ~]$ grep Huge /proc/meminfo
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
Hugepagesize: 2048 kB
Látszik, hogy a szerverben tényleg 6 Gbyte memória van, hogy a Hugepagesize tényleg 2 Mbyte, illetve jelenleg nincs HugePages terület beállítva.
És akkor most számolunk kicsit. Mekkora is legyen a Hugepages terület? Korábban írtam, hogy csak az SGA terület kerülhet Hugepages-be, a PGA nem. Tehát jelen esetben nagyon egyszerű, a Hugepages területnek 3 Gbyte-nak kell lennie, mivel annyi az SGA is. Amennyiben a szerveren több adatbázis is fut, akkor az összes SGA területet pontosan össze kell adni, és akkora Hugepages területre lesz szükségünk. Pontosan számoljunk, és ne felejtsük el, hogy a fizikai memóriában maradjon hely az összes adatbázis PGA területére, illetve az operációs rendszeren futó összes egyéb programnak is. Tehát
Hugepages memória terület < (Fizikai memória - sum(PGA) - operációs rendszernek és egyéb programoknak szükséges memória)
A Hugepages terület méretét a vm.nr_hugepages kernel paraméter segítségével lehetséges beállítani. A paraméter a Hugepage lapok számát adja meg, tehát nem méretet, hanem a szükséges lapok számát kell megadunk. vm.nr_hugepages = sum(SGA)/Hugepagesize. Jelen esetben ez (3221225472/1024)kbyte/2048kbyte= 1536. Ami fontos még, hogy érdemes a HugePages területet ennél pár lappal nagyobbra venni, hogy maradjon üres memória lap. Tehát legyen jelen esetben 1540.
A kernel paramétert a /etc/sysctl.conf állománmyban állíthatjuk be a legegyszerűbben, tehát adjuk hozzá a következő sort (természetesen root jogosultság szükséges)
vm.nr_hugepages=1540
A kernel paramétert megpróbálhatjuk reboot nélkül is beállítani, de ez valószínű nem lesz sikeres, mivel a kernel a Hugepages területet csak akkor tudja lefoglalni, ha van éppen a fizikai memóriában ennyi összefüggő szabad terület. Azért egy próbát megér, root felhasználóval futtassuk a következő parancsot:
Majd ellenőrizzük, hogy sikerült-e lefoglalni a memória területet:
[root@centos-proba ~]# grep Huge /proc/meminfo
HugePages_Total: 238
HugePages_Free: 238
HugePages_Rsvd: 0
Hugepagesize: 2048 kB
Látszik, hogy csak 238 lapot sikerült lefoglalni, a szükséges 1540 helyett. Egy szerver reboot megoldja a problémánkat, de figyeljünk arra, hogy az Oracle adatbázis automatikus indulását még kapcsoljuk ki. Reboot után a következő a helyzet:
HugePages_Total: 1540
HugePages_Free: 1540
HugePages_Rsvd: 0
Hugepagesize: 2048 kB
Látszik, hogy sikeresen lefoglaltuk a szükséges területet, és jelenleg a teljes terület szabadon használható (mivel nem fut az adatbázisunk).
Állítsuk be, hogy az oracle user tudja használni ezt a területet. Ehhez a memlock ulimit paramétert (soft és hard) kell beállítanunk. Ezt minimum akkorára állítsuk, amennyi a Hugepages terület mérete, de feltétlenül kisebb legyen, mint a teljes fizikai memória. A paramétert kbyte-ban kell megadni, és a /etc/security/limits.conf állományban lehetésges beállítani. Tehát adjuk hozzá a következő sorokat (természetesen root jogosultság szükséges):
oracle hard memlock 4194304
Így 4 Gbyte -ra állítottam az oracle user számára. Amennyiben nem oracle user futtatja az adatázist, akkor értelem szerűen az adott user számára kell a paramétert beállítani. Az oracle userrel történő ismételt belépés után ellenőrizzük a paraméter beállítását:
4194304
[oracle@centos-proba ~]$ ulimit -Hl
4194304
Ezzel lényegében elkészültünk az alap beállítással. Próbáljuk meg elindítani az adatbázist, és ellenőrizzük, hogy tényleg a Hugepages-t használja-e. Amennyiben beállítottuk a use_large_pages=only paramétert, és elindult az adatbázis, akkor biztosak lehetünk benne, hogy Hugepages-t használunk, különben a már említett ORA-27137 hibát kapnánk. Azért ennél többet is ellenőrizhetünk. Nézzük meg a szokásos /proc/meminfo mit árul el most a rendszerről.
HugePages_Total: 1540
HugePages_Free: 1253
HugePages_Rsvd: 1250
Hugepagesize: 2048 kB
Mit is tudunk ebből kiolvasni. Látszik, hogy a teljes Hugepages terület a már korábban beállított 1540 lap, ez jó. Látszik, hogy van 1253 még jelenleg üres lap, ami ezért van, mert még csak most indítottuk az adatbázist, és egyszerűen még nem használ minden memóriát, mert nem volt rá szükség. Továbbá az 1253 üres nem használt lapból 1250 foglalva van már, más processz nem veheti el. A Hugepages használata az adatbázis alert.log-ban is látható, ahol minden általunk beállított paraméter szépen ellenőrizhető.
************************ Large Pages Information *******************
Parameter use_large_pages = ONLY
Per process system memlock (soft) limit = 4096 MB
Total Shared Global Region in Large Pages = 3074 MB (100%)
Large Pages used by this instance: 1537 (3074 MB)
Large Pages unused system wide = 3 (6144 KB)
Large Pages configured system wide = 1540 (3080 MB)
Large Page size = 2048 KB
********************************************************************
A 6-os RedHat verziótól (Tehát Oracle Linux 6 és CentOS 6 is, Illetve SLES 11 szintén) bevezették a Transparent HugePages lehetőséget, ami alap értelmezésben be is van kapcsolva. Ez dinamikus Hugepages allokációt tesz lehetővé, ami elsőre nagyon jól hangzik, azonban sajnos jelenleg nem működik jól az Oracle adatbázissal (11g és 12c sem), tehát ezt ki kell kapcsolni, mielőtt bármit tennénk. A beállítás ellenőrzését a következő utasítással lehet elvégezni:
Amennyiben always vagy madvise, az nekünk sajnos nem jó. A következő scripttel lehetséges a kikapcsolása (ezt célszerű egy ec scriptbe berakni, hogy boot-kor életbe lépjen):
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi