OVH Cloud OVH Cloud

[FreeBSD] Occupation mémoire

6 réponses
Avatar
Stephane Dupille
Hello !

J'ai un petit soucis avec la mémoire sous FreeBSD 6.1. au fur et à
mesure du temps, l'occupation mémoire augmente significativement. Dès
le lancement de la machine, j'utilise environ 200 Mo de mémoire, et au
bout d'une semaine ou deux, la mémoire (1 Go) est saturée, et la
machine commence à swapper.

Je soupçonne un process qui fuit, mais le truc, c'est qu'aucun
process ne semble consommer de la mémoire éxagérément. D'après ps,
aucun process ne consomme plus de 2 % de la mémoire...

C'est la mémoire « inactive » qui augmente, et elle augmente par
paliers brusques, pas régulièrement.

Ce qui m'inquiète, c'est que j'ai beau redémarrer tout les services,
l'occupation mémoire ne bouge pas. Il n'y a qu'un reboot qui fasse
véritablement effet.

J'ai un graph :
http://graph.nospam.fr.eu.org/nospam.fr.eu.org/galadriel.nospam.fr.eu.org-memory.html
(login guest, mdp guest)


Je ne sais plus où chercher, ni quoi regarder, des idées ?

La machine fait tourner, apache, inn, named, postfix, spamassassin,
munin, cron, dovecot, proftpd, sshd, et ntpd.

6 réponses

Avatar
talon
Stephane Dupille wrote:

C'est la mémoire « inactive » qui augmente, et elle augmente par
paliers brusques, pas régulièrement.


Oui et en quoi est-ce ennuyeux que la mémoire inactive augmente? La mémoire
inactive c'est de la mémoire libre pour des processus nouveaux. Si tu as des
processus de longue durée, les pages de ce processus qui ne sont pas utilisées
vont se retrouver dans la mémoire inactive et éventuellement en swap, et
alors?

--

Michel TALON

Avatar
Stephane Dupille
Oui et en quoi est-ce ennuyeux que la mémoire inactive augmente? La
mémoire inactive c'est de la mémoire libre pour des processus
nouveaux. Si tu as des processus de longue durée, les pages de ce
processus qui ne sont pas utilisées vont se retrouver dans la
mémoire inactive et éventuellement en swap, et alors?


J'ai pas la même définition de la mémoire inactive : c'est de la
mémoire allouée, mais qui n'a pas été accédée recemment, contrairement
à la mémoire active. Ce que tu décris correspondrait à la mémoire
"cached".

Je veux bien un cours sur la mémoire alors, avec des mots simples.
;-)


Sinon, un truc : pourquoi la machine se mettrait-elle à swapper
après que la mémoire inactive ait occupé tout l'espace ? Pourquoi
n'est-elle pas réutilisée ? Et pourquoi monterait-elle par paliers ?

Avatar
talon
Stephane Dupille wrote:
Oui et en quoi est-ce ennuyeux que la mémoire inactive augmente? La
mémoire inactive c'est de la mémoire libre pour des processus
nouveaux. Si tu as des processus de longue durée, les pages de ce
processus qui ne sont pas utilisées vont se retrouver dans la
mémoire inactive et éventuellement en swap, et alors?


J'ai pas la même définition de la mémoire inactive : c'est de la
mémoire allouée, mais qui n'a pas été accédée recemment, contrairement
à la mémoire active. Ce que tu décris correspondrait à la mémoire
"cached".



Je ne suis pas d'accord. Tu as une description sommaire à la fin de man top:

Active: number of pages active

Inact: number of pages inactive

Wired: number of pages wired down, including cached file data pages

Cache: number of pages used for VM-level disk caching

Buf: number of pages used for BIO-level disk caching

Free: number of pages free

En réalité tout ce qui est inactif, cache ou buf est susceptible d'être
recyclé dans free a tout moment. Tout ce qui est active ou wired par contre
n'est pas recyclable, et ce qui est wired ne peut être envoyé en swap.


Je veux bien un cours sur la mémoire alors, avec des mots simples.
;-)


Sinon, un truc : pourquoi la machine se mettrait-elle à swapper
après que la mémoire inactive ait occupé tout l'espace ? Pourquoi
n'est-elle pas réutilisée ? Et pourquoi monterait-elle par paliers ?


Bien forcément, si tu as affaire a des pages qui correspondent à par exemple
de la mémoire dynamique d'un processus (malloc ...) qui n'est plus utilisée,
ça va être de la mémoire active, en réalité qui n'est plus utilisée, mais qui
ne peut être purement et simplement jetée, donc il faut la garder en copie
dans le swap pour faire place pour de nouvelles applications. Tu sais que les
processus comme mozilla etc. demandent de la mémoire dynamique et ne la
relachent jamais. Une nouvelle demande de mémoire est satisfaite dans
l'ancienne plage qui a été allouée, puis libérée tant qu'il reste de la place,
ensuite une nouvelle allocation est faite. Si bien que la consommation mémoire
de ces engins ne fait qu'augmenter indéfiniment. Donc ces processus font bien
augmenter la consommation mémoire par paliers. Note que la mémoire inactive
ça peut être un processus de courte durée de vie, comme sh, que tu vas
lancer par exemple dans un script à répétitions. Au deuxième lancement la
première copie encore résidente en mémoire va être réutilisée, sans avoir
besoin de recharger à partir du disque.
Parmi les processus que tu mentionnes il y a inn qui est susceptible de crééer
de grosses demandes de mémoire dynamique. Dans mon souvenir il garde en
mémoire la trace de toutes les transactions pendant un moment puis les flushe
sur le disque quand on lui envoie la commande ctlinnd flush ... Si ton site
est important il y a là une possibilité pour expliquer ce qui t'arrive.
Toujours est-il qu'en principe FreeBSD ne se met jamais à swapper furieusement
comme Linux, en principe il y a constamment un petit débit vers le swap quand
une pression sur la mémoire se fait sentir, pour préparer de la place libre
suffisamment à l'avance. Même à l'époque où on avait 64 Megs de mémoire
sur les PC je n'ai jamais vu le système de swap de FreeBSD se vautrer
lamentablement comme celui de Linux, même en faisant tourner de gros Netscape
et autres saloperies qui occupaient la quasi totalité de la mémoire à eux
seuls. A mon avis tu peux traîter ton problème de swap par le mépris, il ne
doit absolument pas impacter les performances.







--

Michel TALON


Avatar
Stephane Dupille
J'ai pas la même définition de la mémoire inactive : c'est de la
mémoire allouée, mais qui n'a pas été accédée recemment, contrairement
à la mémoire active. Ce que tu décris correspondrait à la mémoire
"cached".
Je ne suis pas d'accord. Tu as une description sommaire à la fin de man top:



C'est plutôt court comme description... :(

Active: number of pages active
Inact: number of pages inactive


Ce qui n'explique pas précisemment ce que c'est.

Wired: number of pages wired down, including cached file data pages
Cache: number of pages used for VM-level disk caching
Buf: number of pages used for BIO-level disk caching


Quelle différence entre cache et buf ?

J'arrive pas à trouver la page man qui décrit tout ça avec
suffisemment de précision...

Free: number of pages free
En réalité tout ce qui est inactif, cache ou buf est susceptible d'être
recyclé dans free a tout moment. Tout ce qui est active ou wired par contre
n'est pas recyclable, et ce qui est wired ne peut être envoyé en swap.


OK. Alors, si c'est ça, je ne m'inquiète pas.

Toujours est-il qu'en principe FreeBSD ne se met jamais à swapper
furieusement comme Linux, en principe il y a constamment un petit
débit vers le swap quand une pression sur la mémoire se fait sentir,
pour préparer de la place libre suffisamment à l'avance. Même à
l'époque où on avait 64 Megs de mémoire sur les PC je n'ai jamais vu
le système de swap de FreeBSD se vautrer lamentablement comme celui
de Linux, même en faisant tourner de gros Netscape et autres
saloperies qui occupaient la quasi totalité de la mémoire à eux
seuls. A mon avis tu peux traîter ton problème de swap par le
mépris, il ne doit absolument pas impacter les performances.


Non, il n'y a pas trop de pression sur le swap. Juste qu'avec toute
la mémoire vite qu'il est censé y avoir, si vraiment la mémoire
inactive est transférable en free, pourquoi est-ce qu'il swappe au
lieu de récupérer de la mémoire ? Il est censé avoir 7/10è de la
mémoire dispo !


Avatar
talon
Stephane Dupille wrote:
J'ai pas la même définition de la mémoire inactive : c'est de la
mémoire allouée, mais qui n'a pas été accédée recemment, contrairement
à la mémoire active. Ce que tu décris correspondrait à la mémoire
"cached".
Je ne suis pas d'accord. Tu as une description sommaire à la fin de man top:



C'est plutôt court comme description... :(

Active: number of pages active
Inact: number of pages inactive


Ce qui n'explique pas précisemment ce que c'est.


Une page active possède une ou des références dans le système de mémoire
virtuelle. Les pages inactives correspondent aux pages qui sont en train de
migrer de l'état actif à l'état swappé et peuvent être réutilisées rapidement.
Tu peux aussi regarder ce passage dans man systat

Below the paging statistics is a column of lines regarding
the virtual memory system which list the average number of
pages copied on write (`cow'), pages zero filled on demand
(`zfod'), slow (on-the-fly) zero fills percentage (`%slo-z'),
pages wired down (`wire'), active pages (`act'), inactive
pages (`inact'), pages on the buffer cache queue (`cache'),
number of free pages (`free'), pages freed by the page daemon
(`daefr'), pages freed by exiting processes (`prcfr'), pages
reactivated from the free list (`react'), times the page dae-
mon was awakened (`pdwak'), pages analyzed by the page daemon
(`pdpgs'), and intransit blocking page faults (`intrn') per
second over the refresh interval.

Ou encore ce message de J. Dyson:

Cache are the pages that are available for quick reuse.
Inact and Active are part of the staging algorithm, where Inact is
use as a 2nd chance and staging for cleaning (writing changed
data.)
Free are also pages that are available for quick reuse, but have
no data, and are available at interrupt time.




Wired: number of pages wired down, including cached file data pages
Cache: number of pages used for VM-level disk caching
Buf: number of pages used for BIO-level disk caching


Quelle différence entre cache et buf ?


Je suppose qu'il existe des buffers pour gérer l'entrée sortie sur le disque
au niveau le plus bas, c'est ce qu'il doit appeler BIO-level. Ensuite il y a le
buffer-cache traditionnel qui est le cache système des entrées sorties disque.
Dans FreeBSD il est unifié avec la mémoire générale virtuelle des
applications, donc tu as une distinction au niveau des statistiques.

Voici une référence trés détaillée:
http://mail.nl.linux.org/linux-mm/2000-05/msg00419.html


Non, il n'y a pas trop de pression sur le swap. Juste qu'avec toute
la mémoire vite qu'il est censé y avoir, si vraiment la mémoire
inactive est transférable en free, pourquoi est-ce qu'il swappe au
lieu de récupérer de la mémoire ? Il est censé avoir 7/10è de la
mémoire dispo !


Ben justement c'est la différence avec Linux. J. Dyson s'est aperçu qu'il
était plus efficace de swapper régulièrement une petite quantité de pages
plutôt que d'attendre le dernier moment et de swapper un gros coup. Aussi
de mettre un amortissement suffisamment fort dans le système pour qu'il n'y ait
pas de "thrashing" c'est à dire que tu sois obligé de ramener sans arrêt en
mémoire des pages que tu viens de swapper, genre d'oscillations qui étaient
coutumières sous Linux. Et enfin, le plus compliqué il tient à jour des
statistiques d'utilisation des pages pour choisir celles qu'on va transfèrer
en swap parmi les moins utilisées. Pendant longtemps Torvalds s'est opposé à
ce qu'il y ait un tel système sous Linux sous prétexte que c'était trop
compliqué et trop couteux en ressources (il faut aussi tenir à jour un
"reverse mapping" pour savoir rapidement à quels processus allouer telle ou
telle page qu'on se propose de virer en swap). Une première version est
apparue au début du kernel 2.4 et il l'a virée, le système se trouve enfin
dans le kernel 2.6.

--

Michel TALON



Avatar
bsdouille
ha oui moi aussi j'ai la mm chose mais il me semble que chez moi ca ne
swap pas bcp !
par contre je suis pas sur que se soit tres conseillé de faire
tourné ntpd sur une machine avec autant de deamon actif (si je me
souviens bien de la doc).

merci Mr Tallon sur ces infos sur la memoire .


bsdouille