Comment mettre en œuvre des Hugepages sur Oracle / Linux ?

Quand un processus utilise peu de mémoire, le CPU est marquant la RAM utilisé par ce processus.
Pour plus d’efficacité, la CPU alloue la RAM en segments de 4 Ko (qui est la valeur par défaut sur de nombreuses plateformes). Ces segments de RAM sont appelés pages. Ces pages peuvent être déchargées sur le disque , dans la SWAP , puis récupérées pour être remontées en RAM ce qui pénalise les traitement.
Dans le cas de process avec adressage virtuel de la mémoire, la CPU et le système d’exploitation doivent se rappeler quelles sont les pages affectées a ce process , et où elles sont stockées. De ce fait, plus un process a de mémoire allouées, le plus il faut de temps au système pour trouver l’endroit où la mémoire est mappée.
Quand un processus utilise 1 Go de mémoire, c’est 262 144 entrées que le système doit gérer (1 Go / 4K).
On voit bien que dans le cas de base avec une SGA importante, cela peux vite poser des problèmes. Avec des pages de 2048K on divise le nombre de pointeurs par 512.
Autre avantage des hugepages, pour les systèmes supportant des base de données et ayant une swap avec un fort taux d’occupation, les segments en hugepages ne sont pas swapables. Ils restent en mémoire. Ce qui fait descendre le niveau de la swap et plait beaucoup au ingénieurs système.

     Première étape:  Contrôle de la taille des pages Hugepages

On cherche a mettre en place des Hugepages  de 2M  qui est la valeur préconisée par Oracle et la plus couramment utilisée.

grep Hugepagesize /proc/meminfo
 Hugepagesize:     2048 kB

    Puis, définition du nombre de pages nécessaires

Il Faut maintenant définir le nombre de Hugepages nécessaires pour stocker les SGA qui vont devoir utiliser ces pages mémoire.

Nbr_hugepages =  (somme(SGA)/Hugepagesize )+ 15

Les 15 pages supplémentaires étant utilisées par les pointeurs permettant de gérer la mémoire. Imaginons que dans notre cas nous ayons besoin de 29711 pages de 2M.

Nbr_hugepages=29711

Modification de la configuration OS

Éditez le fichier /etc/sysctl.conf et ajoutez ou modifiez la valeur du paramètre nr_hugepage:

vm.nr_hugepages=29711

La prise en compte de la modification nécessite un redémarrage du serveur pour libérer la mémoire nécessaire aux Hugepages.
Attention : assurez vous que le nombre de pages définit en hugepage * taille d’une page  ne dépasse pas la mémoire du système. Si c’est le cas le système ne redémarrera pas. Il faudra démarrer en mode ‘SINGLE’ pour corriger le problème.

Mise a jour des paramètres liés au user oracle

Assurez vous que les paramètres ulimit suivants soient bien positionnés pour le user oracle, en fonction de la valeur du nombre de Hugepage défini :

ulimit -a
 max locked memory       (kbytes, -l) 200000000
 max memory size         (kbytes, -m) unlimited

Les hugepages étant en place , on peut passer a la mise en place des paramètres d’initialisation des base Oracle

Modification des paramètres d’init. des bases

Pour pouvoir utiliser les hugepages les bases doivent impérativement être en Automatic Shared Memory Managed . Pour cela il faut  s’assurer que les paramètres memory_max_target et memory_target soient à 0 et que par contre les paramètres pga_aggregate_target et sga_target soient correctement renseignés.
Cette opération peut être menée avant le reboot du serveur, cela permet de gagner du temps d’indisponibilité. Sur un RAC ces opérations peuvent être faite un nœud à la fois.
Pour mettre en place les paramètres je vous conseille la méthode suivante :
sur un RAC
disablez la base dans le clusterware

srvctl disable database -d MaBdd

Générez un pfile a partir du spfile
repérez la valeur de la __pga_aggregate_target et de la __sga_target

 MaBdd1.__pga_aggregate_target=855638016
 MaBdd1.__sga_target=1291845632

Supprimez les lignes contenant les paramètres memory_max_target et memory_target
créez les lignes pga_aggregate_target,sga_max_size et sga_target avec les valeurs repérées plus haut

 MaBdd1.pga_aggregate_target=855638016
 MaBdd1.sga_target=1291845632
 MaBdd1.sga_max_size=1291845632

Plus une ligne obligeant la base à n’utiliser que de la mémoire définie en HugePage.

 MaBdd1.use_large_pages=only

Dans ce cas , si le système ne dispose pas de suffisamment de mémoire définie en HugePage, la base ne démarre pas.
On a alors le message suivant

ORA-27137: unable to allocate large pages to create a shared memory segment
 Linux-x86_64 Error: 12: Cannot allocate memory

Si on ne veux pas que la base utilise la mémoire Hugepage mettre le parametre use_large_pages à la valeur FALSE
Si on ne veux que la base démarre même si  la mémoire Hugepage n’est pas suffisante, mettre paramètre use_large_pages à la valeur TRUE .Dans ce cas la base utilise indiféremment de la mémoire Hugepage ( en priorité) ou standard.
redémarrez l’instance avec ce pfile.
sous sqlplus en tant que sysdba

 startup nomount pfile='/home/oracle/initMaBdd.ora';
 ORACLE instance started.
 Total System Global Area 2.6724E+10 bytes
 Fixed Size                  2240984 bytes
 Variable Size            1.1811E+10 bytes
 Database Buffers         1.4898E+10 bytes
 Redo Buffers               12124160 bytes

Recréez le spfile a partir du pfile

SQL> create spfile='+Localisation/du/spfile/spfileMaBdd.ora' from pfile='/home/oracle/initMaBdd.ora';
File created.
SQL> shutdown immediate;

Enablez la base dans le clusterware

srvctl enable database -d MaBdd

redémarrez la base de données en Hugepage

srvctl start  instance -d MaBdd -i MaBdd1

Vérifiez dans le fichier alert.log que la base est bien démarrée en HugePage.
On doit retrouver un ensemble de ligne comme suit:

Starting ORACLE instance (normal)
 ****************** Large Pages Information *****************
 Parameter use_large_pages = only
 Total Shared Global Region in Large Pages = 25 GB (100%)
 Large Pages used by this instance: 12801 (25 GB)
 Large Pages unused system wide = 552 (1104 MB) (alloc incr 64 MB)
 Large Pages configured system wide = 20010 (39 GB)
 Large Page size = 2048 KB
 ***********************************************************

 

Comment retrouver le nombre de page Hugepage restant disponible.

La commande suivante devrait nous donner l’information.

grep Huge /proc/meminfo
 HugePages_Total: 20010
 HugePages_Free:  16522
 HugePages_Rsvd:  10443
 Hugepagesize:     2048 kB

Mais méfiance.
si HugePages_Total est bien le nombre de page défini, HugePages_Free ne représente pas au nombre de pages encore disponibles ,mais le nombre de pages allouées mais pas utilisées.
HugePages_Rsvd correspond bien au nombre de pages utilisées par les différentes base Oracle utilisant les Hugepages.
le nombre de page restant disponible est en fait le resultat du calcul HugePages_Free –  HugePages_Rsvd que l’on retrouve dans l’alert.log de la dernière base démarrée en Hugepage.

****************** Large Pages Information *****************
 Parameter use_large_pages = ONLY
 Total Shared Global Region in Large Pages = 1234 MB (100%)
 Large Pages used by this instance: 617 (1234 MB)
 Large Pages unused system wide = 6079 (12 GB) (alloc incr 16 MB)
 Large Pages configured system wide = 20010 (39 GB)
 Large Page size = 2048 KB
 ***********************************************************

16522 – 10443 on retombe bien sur 6079 pages  .

2 réflexions sur “Comment mettre en œuvre des Hugepages sur Oracle / Linux ?”

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *