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 kBQuellen: [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
