Huge Pages, Linux et Oracle

Oracle-L a été le théâtre de plusieurs discussions autours des Huges Pages ces derniers jours. La présentation de Christo : Pythian Goodies à propos de la gestion de la mémoire et d’Oracle est très bien faites… quoiqu’un peu inégale dans le niveau de la discussion ;-). Enfin elle est très orientée Linux ce qui conviendra bien à ce post.

Les HugePages permettent de définir une zone RAM dans laquelle les pages ne sont pas gérées avec une taille classique, généralement 4 Ko (exécutez getconf PAGE_SIZE ) mais d’une taille bien supérieure, 4 ou 2Mo (exécutez grep Hugepagesize /proc/meminfo ). Il y a plusieurs intérêts à l’utilisation des HugePages; (1) cette zone mémoire est bloquée en RAM et ne peut pas aller en SWAP; et surtout (2) elle permet d’optimiser la gestion du TLB et a ainsi un impact significatif sur l’utilisation de la CPU lors des accès mémoire.

L’utilisation des HugePages n’est pas liée à l’utilisation d’une architecture 32 ou 64 bits; Elle ne permet pas d’adresser une SGA supérieure à x Go non plus. Pour plus d’informations, reportez-vous à la note « 361323.1 HugePages on Linux: What It Is… and What It Is Not… » et les notes associées.

Oracle est capable d’utiliser les Huge Pages pour la SGA. Evidemment ce n’est pas le cas de la PGA. Il faut donc, pour utiliser les HugePages, différencier SGA et PGA et, autrement dit, ne pas utiliser le paramètre MEMORY_TARGET d’Oracle 11g.

Tout ça mène à quelques questions…

1. Comment configure-t-on les HugePages sur RHEL/OEL ?

Avant de paramétrer les HugePages, vous devez définir l’espace dont vous voulez disposer. Cet espace doit pouvoir contenir les SGA de toutes vos instances plus 2 pages par SGA. A noter qu’Oracle alloue légèrement plus de mémoire partagée que SGA_TARGET. Soyez également attentif que la SGA est un multiple de 64Mo (au moins sur Linux x86_64) et que donc si vous mettez une SGA_TARGET de 1023M, la SGA allouée sera en fait de 1024M.

Une fois que vous avez déterminé l’espace dont vous aurez besoin pour les HugePages, vérifiez la taille d’une page:

grep Hugepagesize /proc/meminfo

Vous pouvez en théorie allouer les HugePages de manière dynamique, soit en écrivant dans les fichiers associés, i.e. /proc/sys/vm/nr_hugepages et /proc/sys/vm/hugetlb_shm_group, soit en en ajoutant les paramètres vm.nr_hugepages et vm.hugetlb_shm_group dans /etc/sysctl.conf et en rechargeant le fichier avec sysctl -p. Cette dernière méthode sera retenue dans la mesure où elle est persistante. Mais souvent, ce n’est dynamique qu’en théorie parce qu’en pratique la mémoire est très souvent déjà utilisée et seulement un fragment des pages peuvent sans doute allouées de cette manière. Si c’est le cas, un reboot du serveur résoudra votre problème. Sur les dernières versions de Linux, vous pouvez également tenter de libérer la mémoire avec le paramètre drop_caches.

La signification des paramètres est la suivante:

  • vm.nr_hugepages définit le nombre de pages qui sont allouées. Pour allouer 2Go de Huge Pages si chaque page fait 2048 Ko (i.e 2Mo), il vous faut mettre ce paramètre à 1024.
  • vm.hugetlb_shm_group définit le groupe ID (stocké dans /etc/group) des HugePages. Dans une configuration classique, mettez le gid du groupe DBA dans ce paramètre. Ce paramètre définit la sécurité associée aux HugePages. Seuls les utilisateurs qui font parti du groupe dont le gid est associé à ce paramètre peuvent les utiliser. Ce paramètre est particulièrement sensible dans le cas de RAC puisque si vous utilisez srvctl, c’est le clusterware (i.e. root) qui démarre l’instance avec un bit setuid et si ce paramètre n’est pas positionné correctement, les HugePages seront utilisées avec srvctl mais pas avec sqlplus !

Pour vérifier les paramétrages des HugePages, exécutez les commandes ci-dessous:

grep Huge /proc/meminfo
cat /proc/sys/vm/hugetlb_shm_group


2. Quels sont les paramètres systèmes nécessaire de modifier pour qu’Oracle utilise un unique segment de mémoire partagée ?

Le fait que les HugePages soient configurées ne signifie pas nécessairement qu’Oracle va les utiliser. Pour pouvoir les utiliser, il faut qu’un certain nombre de conditions soient réunies à commencer par le fait que SGA_TARGET soient inférieur à l’espace disponible ou que le groupe des HugePages soit un groupe du propriétaire du logiciel. Il faut également configurer ce qui suit :

  • kernel.shmmax (sysctl.conf) ou /proc/sys/kernel/shmmax définit la taille maximale d’un segment de mémoire partagée. Ce paramètre, exprimé octets, doit être supérieure à la taille de la SGA (+quelques Mo) pour que celle-ci soit composée d’un unique segment; En effet seul le premier segment sera dans les HugePages (au moins en 11g). Si la SGA est composée de plusieurs segments parce que ce paramètre est trop petit, la SGA ne sera pas dans les HugePages comme il faudrait.
  • kernel.shmall (/etc/sysctl.conf) ou /proc/sys/kernel/shmall définit la taille maximale des segments de mémoire partagée alloués par un utilisateur. Ce paramètre, est exprimé en pages mémoire (getconf PAGE_SIZE). Cette valeur doit entre supérieure à la taille de l’ensemble des SGA (+quelques Mo par SGA). Si ce n’est pas le cas, vous ne pourrez pas allouer la SGA; lorsque vous positionner ce paramètre, n’oubliez pas que 1Mo=1024Ko.
  • memlock (/etc/security/limit.conf) et ulimit -l définissent la taille maximale de la mémoire qui peut être verrouillée par un utilisateur en Ko.

Note importante:
Vous devrez vous reconnecter pour que ces valeurs positionnées soient prise en compte dans la session Linux. Si vous voulez vérifier les valeurs de ces paramètres, vous pouvez utiliser rda hcve comme décrit sur mon blog en anglais.

3. Comment vérifier qu’Oracle utilise les HugePages ?

Une fois l’instance redémarrée, vous pouvez regarder si les HugePages sont utilisées avec la commande ci-dessous. Le nombre de pages disponibles doit être inférieur au nombre de pages configurées:

grep Huge /proc/meminfo

Vous remarquerez que les pages ne sont pas forcément encore toutes allouées mais qu’elles sont réservées. Pour vérifier les segments de mémoire partagés, vous pouvez également utiliser la commande ci-dessous:

ipcs -m

Les segments dans les HugePages sont généralement alloués avec les droits 600 alors que ceux dans la mémoire classique sont protégés par 660.

1 réflexion sur “Huge Pages, Linux et Oracle”

  1. Ping : Linux HugePages and virtual memory (VM) tuning

Les commentaires sont fermés.