Verwendung von HugePages für Oracle

Ziel

Dieser Blogeintrag beschreibt, wie man zum einen HugePages unter Linux konfiguriert und zum anderen wie man eine Oracle Datenbank konfigurieren muss, damit diese die HugePages verwendet.

 

 

Was sind HugePages?

Mit dem Kernel 2.6 wurde ein neues Feature namens HugePages eingeführt. Dieses Feature ermöglicht es eine größere Page Size, wie zum Beispiel 2 MB, zu verwenden. Durch die höhere Page Size ergeben sich vor allem auf Systemen mit sehr viel Arbeitsspeicher starke Performanceverbesserungen gegenüber der Standard Page Size von 4 KB. Das Mapping zwischen virtuellem Memory (Page) und dem Physikalischem Speicher wird in der PageTable festgehalten. Das Auffinden einer bestimmten Page im physikalischem Speicher kann sehr kostspielig sein, zum Beispiel bei einem System mit 4 GB gibt es 1048576 Pages in der PageTable, die durchsucht werden müssen. Im Vergleich bei der Verwendung von HugePages (2 MB) wären es lediglich 1024 Pages.

 

Ein weiterer großer Vorteil, vor allem im Zusammenhang mit einer Oracle Datenbank, ist die Tatsache, das HugePages nicht swapbar sind.

 

Hinweis: HugePages können nicht verwendet werden, wenn die Datenbank mit dem Automatic Storage Management (AMM) konfiguriert wurde (MEMORY_TARGET ungleich 0).

 

Konfiguration vom HugePages

Die Konfiguration der HugePages erfolgt über das Setzen von Kernel Parametern. Bevor man mit der Konfiguration beginnt, sollte man sich überlegen, wieviel GB Arbeitsspeicher als HugePages zur Verfügung stehen sollen. Die Anzahl der HugePages muss mindestens so groß sein, damit die SGA der Datenbank oder alle Datenbanken in dem für HugePages reservierten Bereich passen.

 

Oracle bietet für die Berechnung der Anzahl der HugePages ein Shell Skript (hugepage_settings.sh) an, das man über die My Oracle Support Note 401749.1 beziehen kann . Dieses Skript berechnet die Anzahl der HugePages für alle vorhandenen Shared Memory Segments. Die Shared Memory Segments können mit ipcs -m angezeigt werden.

 

Hinweis: Alle Datenbanken die HugePages später verwenden sollen, müssen gestartet sein, bevor das Shell Skript ausgeführt wird.

[root@ora11 ~]$ cd /tmp [root@ora11 ~]$ chmod +x hugepage_settings.sh [root@ora11 ~]$ ./hugepage_settings.sh 

Kommt es bei der Ausführung des Skriptes zu folgendem Fehler, ist das Automatic Memory Management aktiviert.

*********** ** ERROR ** *********** Sorry! There are not enough total of shared memory segments allocated for HugePages configuration. HugePages can only be used for shared memory segments that you can list by command:     # ipcs -m  of a size that can match an Oracle Database SGA. Please make sure that:  * Oracle Database instance is up and running  * Oracle Database 11g Automatic Memory Management (AMM) is not configured

Um diesen Fehler zu behben muss der Parameter MEMORY_TARGET der Datenbank auf 0 gesetzt werden. Dadurch wird das Automatic Memory Management deaktiviert. Im Gegenzug muss entweder eine manuelle Speicherverteilung vorgenommen werden oder die Parameter SGA_TARGET und PGA_AGGREGATE_TARGET müssen gesetzt werden.

 

Nachdem Neustart der Datenbank mit den neuen Parametern und erneuten Ausführen des Shell Skriptes, wird die Mindestanzahl an HugePages für die vorhandenen Shared Memory Segments angezeigt.

Recommended setting: vm.nr_hugepages = 418

Im nächsten Schritt muss der Kernel Parameter gesetzt werden. Am einfachsten geht dies über die Anpassung der sysctl.conf Datei.

[root@ora11 ~]$ vi /etc/sysctl.conf vm.nr_hugepages = 418

Damit die neuen Kernel Parameter greifen, muss die Konfiguration neu eingelesen werden.

[root@ora11 ~]$ sysctl -p

Anschließend werden die HugePages kontrolliert.

[root@ora11 ~]$ grep "HugePage" /proc/meminfo HugePages_Total:   418 HugePages_Free:    418 HugePages_Rsvd:      0

Hinweis: HugePages müssen als zusammenhängendes Stück im Arbeitsspeicher liegen. Sollte unter HugePages_Total ein anderer Wert als der konfigurierte stehen, konnte nicht ausreichend zusammenhängender Arbeitsspeicher allokiert werden. In diesem Fall muss der Server neu gestartet werden.

 

Als letzten Konfigurationsschritt müssen die Limits für den Oracle Benutzer angepasst. Der Wert für memlock sollte mindestens so groß sein wie die HugePages. Ich setze ihn an dieser Stelle einfachshalber auf 1 GB

[root@ora11 ~]$ vi /etc/security/limits.conf oracle               soft    memlock    1048576 oracle               hard    memlock    1048576

Hinweis: Die neuen Limits greifen erst mit der neuen Benutzeranmeldung. Sollte man bereits mit dem Oracle Benutzer angemeldet sein, muss man sich erneut anmelden, bevor die Datenbank gestartet wird.

 

Im letzten Schritt muss die Datenbank neugestartet werden.

[oracle@ora11 ~]$ sqlplus / as sysdba SQL> shutdown immediate SQL> startup

Überprüfung

Um zu Überprüfen, ob die HugePages verwendet werden, kann man sich entweder die Memory Informationen ansehen oder ab Oracle 11.2.0.2 in das AlertLog der Datenbank schauen.

[root@ora11 ~]$ grep "HugePage" /proc/meminfo HugePages_Total:   418 HugePages_Free:    165 HugePages_Rsvd:    164

Hier sollte der Wert für HugePages_Free kleiner sein als der Wert für HugePages_Total.

Leave a Reply

Your email address will not be published.