Les hugepages sont intéressantes lorsque les applications ont besoin de grandes mappings sur lesquelles elles effectueront des accès aléatoires, car c'est le pire cas possible pour le Tampon de Recherche de Traduction (TLB). Vous échangez la granularité du mapping contre les entrées du TLB.
Les pages, y compris les hugepages, ne peuvent être mapées que sur un bloc de mémoire physique de la même taille et aligné sur cette taille. Ainsi, une hugepage de 2 MB doit être mappée sur une limite de 2MB dans la RAM physique, et une hugepage de 1 Go doit être mappée sur une limite de 1 Go, car les bits inférieurs adressent les données à l'intérieur de la page, et aucun décalage ne peut être ajouté ici.
Cela signifie que les hugepages sont généralement réservées au démarrage du système, lorsque la mémoire physique n'est pas encore fragmentée. Les applications qui prennent en charge les hugepages peuvent utiliser hugetlbfs
pour les allouer.
Vous devez décider avec un paramètre du noyau si les hugepages doivent avoir une taille de 2MB ou de 1GB, vous ne pouvez pas les mélanger. Les pages normales de 4 Ko sont toujours disponibles.
Le cas d'utilisation le plus courant est celui des machines virtuelles (qemu/kvm peut utiliser les hugepages), où cela permet de conserver l'ensemble de la cartographie mémoire de la machine virtuelle dans un petit nombre d'entrées TLB, qui ne sont donc jamais invalidées, de sorte que les accès mémoire à l'intérieur de la machine virtuelle nécessitent une recherche dans la table des pages seulement dans le contexte invité.
Certains systèmes de bases de données prennent également en charge les hugepages, mais cela n'est généralement utile que si vous travaillez avec de grands ensembles de données et d'index.
Les questions :
-
Il y a des pages normales (4 Ko) et des pages énormes (2 MB ou 1 GB). Lorsque vous interrogez la taille de la page, vous obtenez la taille des pages normales, lorsque vous interrogez la taille de la huge page, vous obtenez le réglage des huge pages. Les pages normales et énormes peuvent être utilisées en parallèle, mais vous ne pouvez pas mélanger différentes tailles de huge pages.
-
Vous obtenez des résultats différents car ce sont deux choses différentes. La taille des pages normales est fixée dans le matériel, donc ce n'est pas un réglage.
-
Les hugepages doivent être allouées tôt, et bien que la mémoire soit techniquement "libre", elle ne peut être utilisée que pour les applications qui prennent en charge les hugepages, donc toutes sauf ces applications auront moins de mémoire disponible. Cela n'est généralement pas un problème, car vous utiliseriez les hugepages sur des machines dédiées aux applications gourmandes en mémoire comme les machines virtuelles ou les bases de données.
-
Les hugepages transparentes essaient de rendre la mémoire disponible sous forme de tampons et de caches (contrairement au point 3), et essaient de donner des hugepages aux applications qui mapent de grands blocs de mémoire, de sorte que les applications qui ne prennent pas en charge les hugepages puissent en profiter -- fondamentalement, une application qui demande un bloc de mémoire de 2MB/1GB se verra attribuer une hugepage si possible. Que cela améliore ou affecte les performances dépend de vos applications. Si vous avez une application prenant en charge les hugepages et que vous souhaitez attribuer la mémoire manuellement, vous devez désactiver THP, tandis qu'un système ayant une application de base de données qui ne comprend pas les hugepages en bénéficierait probablement.