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 :
Le cache se décompose selon 3 zones
- Le cache du noyau (SLAB)
- Le cache OS (Cached)
- 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.
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