2010-06-11 13 views
19

Linux /proc/meminfo affiche un certain nombre de statistiques d'utilisation de la mémoire.Comment mesurer de manière fiable la mémoire disponible sous Linux?

MemTotal:  4040732 kB 
MemFree:   23160 kB 
Buffers:  163340 kB 
Cached:  3707080 kB 
SwapCached:   0 kB 
Active:  1129324 kB 
Inactive:  2762912 kB 

Il y a pas mal de chevauchement entre eux. Par exemple, pour autant que je sache, il peut y avoir un cache de pages actif (appartenant à "mis en cache" et "actif") et un cache de pages inactif ("inactif" + "mis en cache"). Ce que je veux faire est de mesurer la mémoire «libre», mais de manière à inclure les pages utilisées susceptibles d'être supprimées sans impact significatif sur les performances globales du système. Au début, j'étais enclin à utiliser "free" + "inactive", mais l'utilitaire "libre" de Linux utilise "free" + "caché" dans son affichage "buffer-adjusted", donc je suis curieux de savoir quel meilleur l'approche est.

Lorsque le noyau manque de mémoire, quelle est la priorité des pages à supprimer et quelle est la mesure la plus appropriée pour mesurer la mémoire disponible?

+1

Vérifiez également 'Committed_AS', qui est la taille réelle que le noyau a réellement _promised_ aux processus. Il semble que vous essayez plus de prédire ce qui se passe si vous allouer/verrouiller/utiliser xx octets, compte tenu de l'utilisation actuelle de la mémoire? –

+0

@Tim Post, oui, je n'ai même pas commencé à mettre sur-engagement dans l'image. J'essaie d'obtenir un nombre qui permettra de prédire quand de mauvaises choses commencent à se produire si plus de mémoire est utilisée. –

Répondre

2

Je dirais qu'il est difficile de mesurer quelles pages, lorsqu'elles sont supprimées, pourraient avoir un impact significatif sur les performances globales du système. Les pages utilisées par les processus utilisateur sont les (Total) - (Gratuit + Caché + Pagé). Le second terme est tout le souvenir que le noyau pourrait libérer si nécessaire. Cependant, la libération des pages de mémoire utilisées pour le cache et les pages aurait un impact significatif sur les performances globales du système. Si j'allais utiliser une heuristique, je dirais que vous devriez prendre la valeur de "Inactive" qui est "La quantité totale de mémoire tampon ou de mémoire cache de pages, en kilooctets, qui sont gratuits et disponibles. est une mémoire qui n'a pas été utilisée récemment et qui peut être récupérée à d'autres fins. " Si vous constatez que vous prenez cela et que le système continue de fonctionner correctement, vous pouvez estimer un certain pourcentage de "Actif", car le système a peut-être utilisé certaines pages récemment mais ne les utilisera plus. Vous en savez plus sur le système que moi. Si le système est dédié à ce que vous êtes sur le point de faire, les pages et les fichiers mis en cache dans Active qui seront bientôt utilisés dépendront du fait que le système a été récemment utilisé pour autre chose.

8

Depuis ce « mémoire disponible » signifie précisément dépend de votre objectif et votre but est d'éviter les situations de OOM:

Découvrez how Qt Extended (previously Qtopia) anticipates OOM situations.

Il y a deux événements:

  • (MemFree + Buffers + Cached)/MemTotal < treshold (dans /proc/meminfo)
  • Principales erreurs de page> treshold (pgmajfault dans /proc/vmstat je pense)

Le premier est un avertissement précoce que la mémoire est faible, et déclenche une surveillance plus fréquente de pagefaults. Le second signale la destruction, ce qui tue les performances du système et est un bon indice que le tueur OOM va fonctionner.

+0

+1 Bons algorithmes pour empêcher OOM – SeanDowney

3

Au début, j'ai trouvé votre question facile, car en pratique la sortie de free dans les colonnes '+ tampons/cache' est celle que j'utilise et ça marche normalement.

Mais l'une des situations dans lesquelles cela ne fonctionne pas est lorsque vous avez beaucoup de lecture dans les mêmes blocs. Par exemple.lire le même 1 gb_file plus et plus:

while true; do cat 1gb_file >/dev/null; done 

Si votre système a> 1 Go cache alors ce sera courir vite. Mais si vous commencez à utiliser une partie de ce cache pour quelque chose d'autre, cela brisera les performances du système. Donc, lorsque vous évaluez vos solutions, essayez ce qui précède et voyez si la solution en tient compte.

2

J'utilise les éléments suivants:

FREE_KB = MemFree + Buffers + Cached 

FREE_KB=$(($(echo `sed -n '2p;3p;4p' < /proc/meminfo | sed "s/ \+/ /g" | cut -d' ' -f 2 ` | sed "s/ /+/g"))) 


USED_KB = MemTotal - MemFree - Buffers - Cached 

USED_KB=$(($(echo `head -n4 /proc/meminfo | sed "s/ \+/ /g" | cut -d' ' -f 2 ` | sed "s/ /-/g"))) 
+0

Il me semble que/proc/meminfo renvoie des octets ou kb peut dépendre du système. Pour moi, le code ci-dessus semble retourner des octets, YMMV. – russellpierce

+0

Quel noyau utilisez-vous? Dans la fonction Linux actuelle, meminfo_proc_show renvoie uniquement kB. – Const

2

De linux-3.14, il est nouveau MemAvailable métrique dans/proc/meminfo.

Et vérifiez la ligne '-/+ buffers/cache:' en sortie de l'utilitaire libre.