Considérations de mémoire sous Linux

Tuning

La question qui se pose régulièrement lors du réglage des instances Oracle est comment est gérée la mémoire sous Linux et plus généralement, de combien de mémoire puis-je disposer pour mon instance ( mes instances ? ). En effet, la littérature est assez peu fournie sur la métrologie de la mémoire sous linux et on se retrouve souvent avec des données incompréhensibles. C’est notamment le cas de la commande free, qui peut très bien afficher un espace libre de 0, en permanence, sans que cela ne porte à conséquences ni que cela ne reflète la réalité.

En premier lieux, examinons la sortie d’une commande free.

free
total        used        free      shared  buff/cache   available
Mem:       16479408      519496    10584704      854212     5375208    14714912
Swap:      20969464           0    20969464

ou

free -h
       total used free shared buff/cache available
Mem:   15G   507M  10G   834M       5,1G       14G
Swap:  19G   0B    19G

On constate que le total n’est pas la somme de ce qui est utilisé et du free. La zone “available” est incompréhensible. Si on ajoute le cache et le free on dépasse le total ??? Cette commande relève du foutage de gu…. de l’incompréhensible. Heureusement, linux garde plein d’informations dans /proc, notamment pour la mémoire dans /proc/meminfo. Le fichier a un contenu plus ou moins riche selon la version de linux utilisée. RedHat nous le décrit sur son site. Et force est de constater que le vocabulaire de linux est approximatif.

Si on schématise, le total de la mémoire est égal à la somme du “used”, du “free” et des caches :

zones mémoire linux
Découpage de la mémoire

Le cache se décompose selon 3 zones

  1. Le cache du noyau (SLAB)
  2. Le cache OS (Cached)
  3. Les buffers (Buffers)

On note que les zones SLAB, Cached et Buffers se retrouvent en tant que telles dans /proc/meminfo. La partie Used de la mémoire, quant-à elle est composée de pages, les plus larges ( huge pages ) qui font 2 Mo chacune et les pages de taille “normale” ( small pages ) qui font 4 Ko chacune. Les “huges pages” se décomposent à nouveau en deux parties, le total et les “free” ou libres. De même les “small pages” se décomposent en 2 zones les “Active” et les “Inactive”. Ces zones mémoires sont détaillées dans /proc/meminfo par les entrées Hugepage_Total, Hugepage_Free, Active, Inactive :

cat /proc/meminfo
MemTotal:       16479408 kB
MemFree:        10583392 kB
...
Buffers:          445144 kB
Cached:          3514748 kB
...
Active:          2164088 kB
Inactive:        2184820 kB
...
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
...

On constate au passage que si MemTotal, MemFree et autres sont des tailles de mémoire, HugePages_Total, HugePages_Free, HugePages_Rsvd, HugePages_Surp sont des nombres. La taille de ces zones s’obtient en les multipliant par Hugepagesize.

Détails des zones mémoire

On constate que la partie nommée Used contient les Huge pages libres … Ce qui est loin d’être évident. De fait, si la SGA est gérée en huge pages, c’est cette zone qu’il faut examiner pour savoir si elle peut être étendue. Le free, et l’available ne seront pas impactés. (!) Par contre une modification de PGA, qui ne se fait qu’en small pages, impactera ces zones. Reste la question de l’available, qu’est-ce que c’est que ce truc ? RedHat nous dit en substance que c’est une cote mal taillée de ce qui peut éventuellement être alloué, puisque ne l’oublions pas, les pages Inactives, vues comme du Used, sont recyclables et que donc, leur quantité peut être revue à la baisse. Bref on y voit un peu plus clair, et ça, c’est déj) pas mal.

Affichons les infos qui vont bien avec la fonction qui est sur le Git