Les fichiers/outils standard qui signalent la mémoire semblent avoir des formats différents sur différentes distributions Linux. Par exemple, sur Arch et Ubuntu.
-
Arche
$ free total used free shared buff/cache available Mem: 8169312 3870392 2648348 97884 1650572 4110336 Swap: 16777212 389588 16387624 $ head /proc/meminfo MemTotal: 8169312 kB MemFree: 2625668 kB MemAvailable: 4088520 kB Buffers: 239688 kB Cached: 1224520 kB SwapCached: 17452 kB Active: 4074548 kB Inactive: 1035716 kB Active(anon): 3247948 kB Inactive(anon): 497684 kB
-
Ubuntu
$ free total used free shared buffers cached Mem: 80642828 69076080 11566748 3063796 150688 58358264 -/+ buffers/cache: 10567128 70075700 Swap: 20971516 5828472 15143044 $ head /proc/meminfo MemTotal: 80642828 kB MemFree: 11565936 kB Buffers: 150688 kB Cached: 58358264 kB SwapCached: 2173912 kB Active: 27305364 kB Inactive: 40004480 kB Active(anon): 7584320 kB Inactive(anon): 4280400 kB Active(file): 19721044 kB
Alors, comment puis-je obtenir de manière portable (sur les distributions Linux uniquement) et de manière fiable la quantité de mémoire - hors swap - disponible pour mon logiciel à utiliser à un moment donné ? C'est probablement ce qui est affiché comme "disponible" et "MemAvailable" dans la sortie de free
et cat /proc/meminfo
dans Arch mais comment puis-je obtenir la même chose dans Ubuntu ou une autre distribution ?
Réponse acceptée :
MemAvailable
est inclus dans /proc/meminfo
depuis la version 3.14 du noyau ; il a été ajouté par le commit 34e431b0a. C'est le facteur déterminant dans les variations de sortie que vous montrez. Le message de validation indique comment estimer la mémoire disponible sans MemAvailable
:
Actuellement, la quantité de mémoire disponible pour une nouvelle charge de travail, sans pousser le système en swap, peut être estimée à partir de
MemFree
,Active(file)
,Inactive(file)
, etSReclaimable
, ainsi que les filigranes "bas" de/proc/zoneinfo
.
Les filigranes bas sont le niveau en dessous duquel le système permutera. Donc en l'absence de MemAvailable
vous pouvez au moins additionner les valeurs données pour MemFree
, Active(file)
, Inactive(file)
et SReclaimable
(selon ceux qui sont présents dans /proc/meminfo
), et soustrayez les filigranes bas de /proc/zoneinfo
. Ce dernier répertorie également le nombre de pages libres par zone, cela peut servir de comparaison…
L'algorithme complet est donné dans le patch de meminfo.c
et semble assez facile à adapter :
- sumer les seuils bas dans toutes les zones ;
- prendre la mémoire libre identifiée (
MemFree
); - soustrayez le filigrane bas (nous devons éviter de le toucher pour éviter l'échange );
- ajouter la quantité de mémoire que nous pouvons utiliser à partir du cache de la page (somme de
Active(file)
etInactive(file)
) :il s'agit de la quantité de mémoire utilisée par le cache de la page, moins la moitié du cache de la page ou le filigrane bas, selon le plus petit ; - ajouter la quantité de mémoire que nous pouvons récupérer (
SReclaimable
), suivant le même algorithme.
Ainsi, en mettant tout cela ensemble, vous pouvez obtenir la mémoire disponible pour un nouveau processus avec :
awk -v low=$(grep low /proc/zoneinfo | awk '{k+=$2}END{print k}')
'{a[$1]=$2}
END{
print a["MemFree:"]+a["Active(file):"]+a["Inactive(file):"]+a["SReclaimable:"]-(12*low);
}' /proc/meminfo