web-dev-qa-db-fra.com

Vous voulez savoir si suffisamment de mémoire est disponible sur une machine Linux pour déployer une nouvelle application

J'ai une machine Linux dont l'instantané de la mémoire lorsque je fais/proc/meminfo est:

MemTotal:     16413388 kB
**MemFree:         48296 kB**
Buffers:        193600 kB
Cached:        1986448 kB
SwapCached:     874512 kB
Active:       15034264 kB
Inactive:       713672 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:     16413388 kB
LowFree:         48296 kB
SwapTotal:     8385920 kB
SwapFree:      4682408 kB
Dirty:            3124 kB
Writeback:           0 kB
Mapped:       13005560 kB
Slab:           257784 kB
CommitLimit:  16592612 kB
Committed_AS: 59624324 kB
PageTables:     233748 kB
VmallocTotal: 536870911 kB
VmallocUsed:    267064 kB
VmallocChunk: 536603555 kB
HugePages_Total:     0
HugePages_Free:      0
Hugepagesize:     2048 kB

Il s'agit d'une machine de 16 Go et j'ai une Java à déployer sur celle-ci qui aura 3 instances jvm et la mémoire requise combinée typique pour elles sera proche de 1 Go.

Je voulais savoir s'il serait sûr de déployer cette application sans affecter les autres applications actuellement en cours d'exécution sur cette machine. En regardant l'instantané de mémoire ci-dessus, pouvons-nous le découvrir?

Quelles autres statistiques m'aideront à en décider et comment collecter ces statistiques?

41
Manish

(Il est probablement un peu tard pour l'OP, mais cela est demandé assez souvent, donc je vais essayer)

free montre normalement quelque chose comme ceci:

             total       used       free     shared    buffers     cached
Mem:       8195284    8137708      57576          0    1232328    2651156
-/+ buffers/cache:    4254224    3941060
Swap:     18892216     759852   18132364

Les gens ont tendance à regarder le Mem: ligne lorsque vous essayez de connaître la quantité de mémoire libre dont ils disposent. Malheureusement, cette ligne est assez trompeuse, car le noyau Linux essaie d'utiliser de manière optimale la mémoire disponible de (au moins) ces manières:

  • Il mettra en cache les données du sous-système d'E/S (par exemple le disque), de sorte qu'elles soient facilement disponibles si nécessaire.

  • Il expulsera activement les processus inactifs depuis un certain temps vers l'espace de swap, en faveur de la mise en cache des données pour les processus actifs. Cela tend à favoriser le débit par rapport à la réactivité, de sorte que certaines personnes règlent leur noyau pour changer ce comportement.

Le premier point est la source de confusion concernant free, car le Mem: line inclut la mémoire utilisée pour la mise en cache dans la quantité de mémoire utilisée. Le noyau, cependant, mettra en cache autant que possible pour des raisons de performances. En fait, sur tout système Linux qui a fonctionné pendant un certain temps, la mémoire libre a tendance à être proche de zéro - la mémoire inutilisée est de la mémoire gaspillée.

La mémoire cache, cependant, peut être libérée par le noyau si nécessaire par un autre processus. Bien que cela ait un impact sur les performances d'E/S dans une certaine mesure, d'autres processus peuvent avoir plus de mémoire sans utiliser l'espace d'échange . Par conséquent, dans la plupart des cas, cette mémoire est libre .

C'est pourquoi free inclut une deuxième ligne, où la mémoire cache est considérée comme libre:

-/+ buffers/cache:    4254224    3941060

Cette deuxième ligne est ce que les gens devraient regarder lorsqu'ils veulent savoir s'ils ont suffisamment de mémoire libre pour un certain objectif.

Dans l'exemple ci-dessus, selon le Mem: ligne, il y a ~ 57 Mo de mémoire libre. Si l'on lit la seconde ligne, il y a en fait environ 3,9 [~ # ~] gb [~ # ~] qui peuvent être utilisés sans forcer processus actifs à permuter. En passant, il y a également environ 760 Mo de données rarement utilisées qui ont été échangées, pour faire plus d'espace dans la mémoire principale pour les processus et la mise en cache.

À peu près au même moment, le contenu de /proc/meminfo:

MemTotal:        8195284 kB
MemFree:           57660 kB
Buffers:         1232352 kB
Cached:          2651156 kB
SwapCached:       119936 kB
.
.
.

MemTotal: la mémoire physique disponible détectée par le noyau.

MemFree: la mémoire physique inutilisée - la mémoire libre indiquée dans le Mem: ligne de free.

Buffers: stockage relativement temporaire des blocs de disque bruts.

Cached: cache en mémoire pour les fichiers lus depuis le disque. Il n'inclut pas la mémoire SwapCached.

SwapCached: mémoire qui a été échangée une fois, puis réintégrée mais qui se trouve toujours dans l'espace d'échange. Si nécessaire, son contenu peut être simplement jeté (très rapidement!), Sans avoir à les échanger (plus lentement).

Donc, pour avoir une estimation semi-précise de la mémoire réellement disponible

MemFree + Buffers + Cached + SwapCached

est un bon point de départ - et celui que free montre dans cette deuxième ligne.

Naturellement, la gestion de la mémoire et les statistiques et mesures associées sont plus compliquées que cela. Les nombres indiqués par free ne sont au mieux que des estimations, car il y a beaucoup d'autres variables à prendre en compte si vous voulez aller plus loin. Pour les personnes qui effectuent régulièrement une optimisation de l'utilisation de la mémoire, c'est presque une forme d'art.

ÉDITER:

Un lien quelque peu humoristique sur ce "numéro":

http://www.linuxatemyram.com/

MODIFIER 2:

Pour confirmer le commentaire selon lequel l'analyse de l'utilisation de la mémoire est presque une forme d'art:

Même free manque une grande partie des données mises en cache sur les systèmes Linux modernes. De /proc/meminfo sur mon système:

SReclaimable:    2253576 kB

Cela représente environ 2 Go de mémoire utilisée par le système slab allocator pour la mise en cache des entrées de répertoire et autres, et il est récupérable (c'est-à-dire qu'il peut être effacé et utilisé par les processus si nécessaire). Pourtant, free ne la considère pas comme une mémoire cache et ne la rentre dans aucun de ses calculs et apparaît donc comme mémoire utilisée.

L'utilitaire slabtop, s'il est disponible, permet à l'administrateur système de savoir à quoi sert le cache slab .

Une façon (pour l'utilisateur root uniquement) d'avoir free montrer l'utilisation réelle de la mémoire du système est la suivante:

# swapoff -a
# sync
# echo 3 > /proc/sys/vm/drop_caches 
# free
             total       used       free     shared    buffers     cached
Mem:       8195284    3181468    5013816          0       8656     228832
-/+ buffers/cache:    2943980    5251304
Swap:            0          0          0
# swapon -a

La première commande désactive l'espace d'échange. Il ne doit pas être émis si la mémoire disponible peut ne pas être suffisante pour contenir les données qui ont été permutées - dans ce cas, il faut prendre en compte le Swap: ligne de libre dans leurs calculs d'utilisation de la mémoire.

La deuxième commande pousse toutes les données mises en mémoire tampon sur le disque. Cela permet de libérer plus de mémoire cache à l'étape suivante.

La troisième commande est la plus importante de l'ensemble - elle force le noyau à rejeter autant de données mises en cache que possible (cache de page, entrées de répertoire, inodes, etc.).

Puis free montre enfin ce que les processus en cours utilisent réellement dans leur -/+ buffers/cache: ligne. Il est tout à fait remarquable que même après avoir supprimé toutes les données mises en cache, le noyau recommence rapidement la mise en cache - dans ce cas, il a déjà atteint près de 250 Mo de données en cache en quelques secondes.

La dernière commande active à nouveau l'espace d'échange - elle n'est nécessaire que si la première commande a également été utilisée.

Il est à noter que ces commandes doivent être exécutées par l'utilisateur root afin de disposer des privilèges nécessaires.

128
thkala