OVH Cloud OVH Cloud

Memoire free/used sous linux

14 réponses
Avatar
bill
Bonjour à tous,

J'ai commencé à m'interesser à l'etude de la mémoire utilisée (ou pas)
sous linux (noyau 2.4 , red hat et suse )

J essaye de mettre en place une supervision qui me permettrait de savoir
si la machine commence à etre limite coté memoire Vive. Sachant que de
tres nombreux process plus ou moins gourmands tournent sur le serveur
(oracle , java etc...)

D'apres les informations recoltées , je sais que la commande "free" est
une blague et qu'il est nécessaire de taper sur /proc/meminfo pour
connaitre la mémoire "immédiatement reallouable" autrement dit la
mémoire effectivement disponible à l instant T sur le serveur.


A priori il semblerait qu'il faille regarder "Inact_target" afin de
connaitre la mémoire reellement dispo.

En parallele j'ai lu ailleurs que Memoire libre = Buffers + Cached
(toujours dans /proc/meminfo)


Lorsque je tente d'analyser un serveur de production je vois ceci :
(/proc)>cat meminfo
total: used: free: shared: buffers: cached:
Mem: 2108510208 2083962880 24547328 0 5677056 1973755904
Swap: 2138562560 144998400 1993564160
MemTotal: 2059092 kB
MemFree: 23972 kB
MemShared: 0 kB
Buffers: 5544 kB
Cached: 1880324 kB
SwapCached: 47172 kB
Active: 1200628 kB
Inact_dirty: 709788 kB
Inact_clean: 22624 kB
Inact_target: 20 kB
HighTotal: 1179584 kB
HighFree: 14088 kB
LowTotal: 879508 kB
LowFree: 9884 kB
SwapTotal: 2088440 kB
SwapFree: 1946840 kB


Sur 2 Go , il ne resterait que 20 kilo de memoire libre sur ce Serveur
à en croire Inact_target ? O_o

Dois je ajouter Cached + Buffers pour me faire une idée de ma memoire
restante et prete à etre utilisée ?
J aurai tendance a dire que Cached et buffers sont des memoires qui sont
"utilisées" donc non disponibles.

Dois je faire une simple soustraction : MemTotale - Active pour me
faire une idée de ce qu'il me reste reellement à disposition ?


Bref, quelqu'un pourrait il m eclairer sur ma mémoire disponible et sur
un manque potentiel à ce niveau sur mon serveur ?




Merci à ceux qui pourront m apporter des lumieres.

4 réponses

1 2
Avatar
bill

Ce qui est caractéristique d'un manque de RAM, c'est du
trafic swapin & swapout simultané pendant longtemps (ie au moins
plusieurs secondes) ou très fréquement: ça veut dire que le noyau est
obligé de swapper un process pour en relancer un autre.
Il faut quand même faire attention: au lancement d'un process, il y a un
swapin important: chaque page de code du process qui n'a jamais été
accédée déclenche un swapin qui la charge depuis le fichier executable.
Mais, dans ce cas de figure, il ne devrait pas y avoir de swapout (ou
très peu) en même temps.

Apparement, les champs si/so sont donnés en Ko/s, c'est donc exactement
l'info voulue.

[...]



bon ok , alors que pensez vous d'une surveillance comme celle ci :
Génération d'un log vmstat toute les 5 secondes (vmstat 5 >> /tmp/log)

avec une surveillance continue des champs swap "SI" et "SO"
Si ces 2 champs sont différents de 0 simultanément sur 3 lignes (15
secondes) ==> Alors MANQUE DE RAM sur le serveur ou tout du moins
etude approfondie à effectuer sur la memoire.


J'avoue etre tout de meme surpris de n avoir vu aucun post à ce sujet.
Linux commence à etre serieusement utilisé en entreprise et je trouve
que c est la moindre des choses de savoir si le serveur est deja limite
ou va saturer à ce niveau si l'on monte en charge etc...



Merci de votre aide.

Avatar
yves
Il faut quand même faire attention: au lancement d'un process, il y a un
swapin important: chaque page de code du process qui n'a jamais été
accédée déclenche un swapin qui la charge depuis le fichier executable.
Mais, dans ce cas de figure, il ne devrait pas y avoir de swapout (ou
très peu) en même temps.


Tiens ça me fait penser... Ca c'est valable seulement dans le cas où
l'algorithme de la vm précharge les pages en swap au chargement du
process dans la ram. Les dernières versions de Linux font ça ?
C'est pas ce qu'on appelle "aggressive swapping" ça ?
Sur une machine moyennement chargée, ça me semble un peu bourrin comme
méthode...

Yves


--
http://wiki.rougy.net -- Wiki Unix/Linux

Avatar
yves

bon ok , alors que pensez vous d'une surveillance comme celle ci :
Génération d'un log vmstat toute les 5 secondes (vmstat 5 >> /tmp/log)

avec une surveillance continue des champs swap "SI" et "SO"
Si ces 2 champs sont différents de 0 simultanément sur 3 lignes (15
secondes) ==> Alors MANQUE DE RAM sur le serveur ou tout du moins
etude approfondie à effectuer sur la memoire.


15 secondes, ça me parait léger. Je mettrai plutot une alarme à partir
de 45 à 60 secondes pour voir ce qu'il se passe. Mais on ne peut pas
encore parler de manque de mémoire, c'est un peu prématuré...

J'avoue etre tout de meme surpris de n avoir vu aucun post à ce sujet.
Linux commence à etre serieusement utilisé en entreprise et je trouve
que c est la moindre des choses de savoir si le serveur est deja limite
ou va saturer à ce niveau si l'on monte en charge etc...


Ben c'est le boulot de l'admin, et c'est pas différent de n'importe quel
Unix de base... Et c'est repris dans la plupart des cours d'admin Unix.
C'est pas vraiment une info confidentielle ;-)

Merci de votre aide.


De rien, bon courage

Yves

--
http://wiki.rougy.net -- Wiki Unix/Linux

Avatar
l'indien
On Fri, 08 Apr 2005 19:19:19 +0200, yves wrote:

Il faut quand même faire attention: au lancement d'un process, il y a un
swapin important: chaque page de code du process qui n'a jamais été
accédée déclenche un swapin qui la charge depuis le fichier executable.
Mais, dans ce cas de figure, il ne devrait pas y avoir de swapout (ou
très peu) en même temps.


Tiens ça me fait penser... Ca c'est valable seulement dans le cas où
l'algorithme de la vm précharge les pages en swap au chargement du
process dans la ram. Les dernières versions de Linux font ça ?
C'est pas ce qu'on appelle "aggressive swapping" ça ?


Je n'ai jamais dit que le kernel préchargeait quoi que ce soit en swap.
D'ailleurs, le code ne va jamais dans le swap, ce serait totalement
innefficace, tant au niveau de la place perdue que du temps perdu à
swapper pour rien: tout le code d'une appli (à part les applis
auto-modifiantes, mais il y en a peu) est déjà stocké sur le disque,
dans le fichier executable. Idem pour les données read-only. Plutôt que
de perdre du temps à recopier du code ou des data inchangées dans le
swap, Linux (comme tous les OS, je pense, actuellement) marque juste la
page virtuelle comme étant swappée et libère la page physique.
Lorsqu'il démare un executable, il marque _toutes_ les pages de code et
de donnée (sauf la BSS, bien sur) comme étant swappées et ne charge
rien en RAM. Ce qui fait que dès que le programme, dès qu'il accède à
une page de code ou de donnée pour la première fois déclenche une faute
de page. Le noyau voit que la page est marquée swappée et qu'elle n'est
pas référencée dans le swap, donc il la recharge directement depuis le
fichier executable. Ainsi, aucune page n'est jamais chargée pour rien et
on n'utilise le swap que pour les pages qui ont été modifiées.
Ca explique également qu'au démarage d'un process, il y a beaucoup de
swap-in, puisque, toutes les pages étant marquées swappées, chaque
accès à une nouvelle page déclenche une requête de swap.
Tu peux l'observer facilement: juste après le démarage d'un process, tu
regardes ses statistiques de swap, tu verras qu'il aura fait bcp d'accès
au swap. Par contre, en tant normal, ce nombre n'augmente plus ou
quasiment plus ensuite, sauf dans le cas de programmes très modulaire:
un accès à un nouveau "module" (même s'il est dans le même fichier
executable) demandera de charger celui ci, donc déclenchera de nouvelles
requêtes de swap-in.

Sur une machine moyennement chargée, ça me semble un peu bourrin comme
méthode...


C'est bien pour ça qu'aucun OS ne fait jamais celà...


1 2