Linux’ Huge Pages für Oracle nutzbar gemacht.

Posted by Chris on November 20, 2009

No Gravatar

Huge Pages [1] kennt jedes moderne Betriebssystem. Die Frage ist lediglich, ob Applikationen diese direkt nutzen können. Unter Linux müssen die Applikationen dies explizit anfordern. Es macht für grosse Serverapplikationen durchaus Sinn, Überlegungen anzustellen, ob man diese Möglichkeit nutzen soll. Oracle ist hierfür ein sehr gut geeignetes Beispiel. Schon ab 2GB Shared Memory (wenn man mehrere Instanzen hat und genügend Memory zur Verfügung stehen) lohnt sich die Konfiguration von dediziertem Speicherplatz bestehend aus Huge Pages. Da aber Oracle selber nicht automatisch Huge pages anfordert, reservieren wir einfach den voraussichtlichen Bereich im Shared Memory. Dies wird durch Kernelvariablen erledigt, entweder mit dem Kommando sysctl (für das laufende System) oder persistent in der Datei /etc/sysctl.conf. Im folgenden Beispiel habe ich einen Server mit 72GB RAM auf 48GB Shared Memory konfiguriert. Von einer huge page-Grösse von 2MB ausgehend reservieren wir die entsprechende Anzahl huge pages, um auf die 48GB zu kommen. Durch die Angabe einer Gruppe wird der Bereich exklusiv für die Gruppe “dba” reserviert.

# Oracle 10 und 11:
# Total SHM 48GB:
kernel.shmmax = 51539607552
# Tot. installed memory = shmall * PAGE_SIZE (4096)
kernel.shmall = 18874368
kernel.shmmni=4096
# A hugepage is 2048kb, so 24576 hugepages support a total
# SGA of all instances up to 48 GB (the actual shmmax size)
vm.nr_hugepages = 24576
# Owner is dba group:
vm.hugetlb_shm_group = 504

Will man diese Variablen schon ohne Reboot im laufenden Betrieb aktivieren, benutzt man das Kommando sysctl -p .

Nun darf man auf keinen Fall vergessen (wie es mir passiert ist), auch die Limite des vom Benutzer Oracle zu reservierendem Gesamtspeicher in der Datei /etc/security/limits.conf anzupassen. Sonst gäbe es später unterhaltsame Fehlermeldungen beim Starten neuer Oracle-Instanzen. Also wird die obige Anzahl mit der Grösse der Huge Pages (hier 2048 KB) gerechnet. Hier ein Beispiel, das auch alle anderen empfohlenen Angaben für den Benutzer Oracle enthält:

oracle               soft    nproc   16384
oracle               hard    nproc   16384
oracle               soft    nofile  1024
oracle               hard    nofile  65536
# Mind. die reservierten huge pages (anz. * 1024 * 2):
oracle               soft    memlock 50331648
oracle               hard    memlock 50331648
oracle               -       stack   32768

Beim nächsten Login des Benutzers “Oracle” sind diese Limiten aktiv. Kontrollieren kann man die aktuellen Limiten z.B. mit ulimit -a.

Sind alle Einstellungen aktiv, sieht man ganz schnell, ob Oracle nun die Huge Pages nutzt, indem man cat /proc/meminfo ausführt und bei “HugePages_Rsvd:” eine Zahl grösser als 0 erhält. Im folgenden Auszug ist auch schön zu erkennen, dass man so die Standardgröße der Huge Pages herausfinden kann:

HugePages_Total: 24576
HugePages_Free:  23654
HugePages_Rsvd:    353
Hugepagesize:     2048 kB
Quellen:
[1]http://en.wikipedia.org/wiki/Huge_pages#Huge_pages
[2]http://www.redhat.com/docs/manuals/enterprise/RHELTuningandOptimizationforOracleV11.pd
[3]http://www.puschitz.comInstallingOracle10g.shtml#CheckingKernelParameters

Hier noch alle Oracle-relevanten Einträge von /etc/sysctl.conf für den Server mit 72GB RAM (2 x Quadcore CPU):

# Oracle 10 und 11:
# Total SHM 48GB:
kernel.shmmax = 51539607552
# Tot. installed memory = shmall * PAGE_SIZE (4096)
kernel.shmall = 18874368
kernel.shmmni=4096
# A hugepage is 2048kb, so 24576 hugepages support a total
# SGA of all instances up to 48 GB (the actual shmmax size)
vm.nr_hugepages = 24576
# Owner is dba group:
vm.hugetlb_shm_group = 504

# Semaphores:
kernel.sem=250 32000 100 142

# VM Swapping Tuning acc. to RHEL 5 Oracle Deployment Recommendations
vm.swappiness=10
vm.dirty_background_ratio=3
vm.dirty_ratio=15
vm.dirty_expire_centisecs=500
vm.dirty_writeback_centisecs=100

# Oracle 10 & 11:
fs.file-max=6815744
fs.aio-max-nr = 1048576
net.core.rmem_default=262144
net.core.wmem_default=262144
net.core.rmem_max=4194304
###net.core.wmem_max=262144
# Oracle 11:
net.core.wmem_max=1048576
net.ipv4.ip_local_port_range=1024 65000

# Oracle 10 und 11:
# Total SHM 48GB:
kernel.shmmax = 51539607552
# Tot. installed memory = shmall * PAGE_SIZE (4096)
kernel.shmall = 18874368
kernel.shmmni=4096
# A hugepage is 2048kb, so 24576 hugepages support a total
# SGA of all instances up to 48 GB (the actual shmmax size)
vm.nr_hugepages = 24576
# Owner is dba group:
vm.hugetlb_shm_group = 504

# Semaphores:
kernel.sem=250 32000 100 142

# VM Swapping Tuning acc. to RHEL 5 Oracle Deployment Recommendations
vm.swappiness=10
vm.dirty_background_ratio=3
vm.dirty_ratio=15
vm.dirty_expire_centisecs=500
vm.dirty_writeback_centisecs=100

###fs.file-max=65536
# For Oracle 11:
fs.file-max=6815744
fs.aio-max-nr = 1048576

net.core.rmem_default=262144
net.core.wmem_default=262144
net.core.rmem_max=4194304
###net.core.wmem_max=262144
# For Oracle 11:
net.core.wmem_max=1048576
net.ipv4.ip_local_port_range=1024 65000
Trackbacks

Use this link to trackback from your own site.

Leave a Comment
This site is using OpenAvatar based on

Threaded commenting powered by Spectacu.la code.