Les fichiers / outils standard qui signalent la mémoire semblent avoir différents formats sur différentes distributions Linux. Par exemple, sur Arch et Ubuntu.
Cambre
$ 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 porter de manière portable (sur des distributions Linux uniquement) et obtenir de manière fiable la quantité de mémoire (hors swap) disponible pour mon logiciel à un moment donné? Vraisemblablement, c'est ce qui est indiqué comme «disponible» et «MemAvailable» dans la sortie de free
et cat /proc/meminfo
dans Arch, mais comment puis-je obtenir les mêmes dans Ubuntu ou une autre distribution?
awk -v low=$(grep low /proc/zoneinfo | awk '{k+=$2}END{print k}') '{a[$1]=$2}END{m=a["MemFree:"]+a["Active(file):"]+a["Inactive(file):"]+a["SReclaimable:"]; print a["MemAvailable:"],m-low}' /proc/meminfo
qui devrait me donner le même numéro imprimé deux fois. Cependant, le deuxième nombre (ma compréhension de l'algorithme que vous suggérez) est supérieur à celuiMemAvailable
indiqué dans/proc/meminfo
. Qu'est-ce que je fais mal?/proc/zoneinfo
compte les pages, dont la taille est principalement de 4 Koamd64
; vous manquez également la sécurité supplémentaire ajoutée au cache de pages et à la mémoire récupérable. Simplifiant ce dernier, nous pouvons soustraire le filigrane bas trois fois, doncm-12*low
(3 × 4KB) donne le résultat correct sur mon système. (Cette simplification sous-estime la mémoire disponible si le cache de pages ou la mémoire récupérable est inférieure à deux fois le faible filigrane, mais vous ne voudriez pas utiliser beaucoup de mémoire dans cette situation de toute façon, ce qui semble être un compromis raisonnable.)(file)
entrée niSReclaimable
entrée? Sur une ancienne boîte centos avec noyau v 2.6.18-348.16.1.el5xen (peruname -r
), voici la sortie que j'obtiens: pastebin.com/iFWiM1kX . Votre calcul tire seulement laMemFree
partieAlors que la réponse de Stephen est parfaitement suffisante et fait preuve de prudence, j'ai décidé de rédiger la logique complète, y compris les comparaisons minimales. Les informations sont d'abord lues dans / proc / meminfo et stockées dans une variable afin que les détails de la mémoire soient cohérents.
Le résultat stocké dans la variable est en octets.
la source