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 ?”
Même effet que les Large Pages sur AIX , je suppose ?
C’est en effet le même mécanisme. seul le nom change. On parle de Hugepages sous linux et de Large Pages sous AIX.