GNU/Linux >> Tutoriels Linux >  >> Linux

Linux - Comment obtenir la quantité de mémoire disponible de manière portable entre les distributions ?

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) , et SReclaimable , 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) et Inactive(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.
En relation:Linux - Comment rendre une clé USB inscriptible sous Linux ??

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 

Linux
  1. Comment puis-je obtenir une liste des réseaux sans fil disponibles sous Linux ?

  2. Comment puis-je obtenir l'état du clavier sous Linux?

  3. Comment obtenir le nombre de CPU sous Linux en utilisant C ?

  4. Comment obtenir le nom d'utilisateur en C/C++ sous Linux ?

  5. Comment obtenir le nombre de disques physiques sous Linux ?

Comment obtenir la taille d'un répertoire sous Linux

Comment obtenir la taille d'un répertoire sous Linux

Comment obtenir le nom de fichier à partir du chemin complet sous Linux

Comment obtenir le nombre de processeurs/cœurs sous Linux

Comment utiliser la commande procs pour afficher les processus actifs sous Linux ?

Top 10 des distributions Linux