Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Comment Vider la RAM

33 réponses
Avatar
c-note
Bonjour a tous,

j'ai un programme (SGBD) qui tourne et utilise presque toutes la RAM
dispo sur mon serveur.

Mem: 3354852K av, 3236376K used, 118476K free, 0K shrd, 30408K buff

Lorsque ce programme termine son execution la RAM n'est pas vider.

J'ai un deuxiemme programme qui se lance et ne dispose pas d'assez de
RAM. Du coup, le systeme (kernel 2.4) tue certain service (snmpd, sshd)
au hasard pour liberer de la RAM.

Idealement, je souhaiterais vider la RAM apres l'execution du premier
programme.

Est-ce possible ?

Merci

10 réponses

1 2 3 4
Avatar
Nicolas George
R12y wrote in message :
- Qu'est-il censé ce passer si la partie physique de/des barette(s) sur
lesquelles se trouvaient ce cache sont defectueuses?


Si la RAM permet la détection d'erreur, il me semble que la seule réaction
raisonnable est un kernel panic.

Ceci dit, j'avais vu un jour un truc bizarre.

- Est-ce que le noyau "defragmente" ce qui se trouve en RAM (genre: y a une
grosse usine qui se pointe, je pousse un peu ce que j'ai déjà pour lui
laisser un gros bloc)?


Aucun intérêt, la fragmentation ne joue que quand il y a un malus à
manipuler des données non-contiguës, ce qui est le cas quand il y a des
pièces mécaniques en jeu. La RAM ne pose pas ce genre de considérations. Une
clef USB non plus, d'ailleurs.

Avatar
Nicolas George
Thierry Boudet wrote in message :
<pinaille>


Je ne prétendais pas être exhaustif.

Eventuellement des bouts de stack ip (SO_REUSE, toussa)


Ça, ce sera libéré à terme, c'est juste un délai, donc ça ne compte pas
vraiment.

Avatar
Thierry Boudet
On 2007-05-29, Nicolas George <nicolas$ wrote:

<pinaille>


Je ne prétendais pas être exhaustif.

Eventuellement des bouts de stack ip (SO_REUSE, toussa)


Ça, ce sera libéré à terme, c'est juste un délai, donc ça ne compte pas
vraiment.


Sauf que l'OP a semble-t-il un problème de ce genre, puisqu'il
semble que ce soit en _enchainant_ deux logiciels communiquants
par des chauissettes que le crash se produit...


--
- Le monde appartient à ceux dont les ouvriers se lèvent tôt. (Coluche)


Avatar
Denis Beauregard
Le Tue, 29 May 2007 20:26:41 +0200, Pascal Hambourg
écrivait dans
fr.comp.os.linux.configuration:


Pourtant, il me semble que la mémoire est gérée par 2 systèmes
différents. D'un côté, les appels au bios et de l'autre, ceux au
noyau Linux.


Euh, des appels BIOS sous Linux ?


Je sais que c'est presqu'une hérésie, mais ici, on parle d'une
SGBD sans la nommer. Il peut s'agir d'une application Windows
roulant dans Wine ou d'une application Linux faite à partir d'une
autre écrite d'abord pour Windows et où on aurait laisser du code
par oubli. Je pense que cela doit bien exister dans le compilateur
gcc par exemple. D'ailleurs, j'ai essayé une application DOS dans
DOSEMU, une application que j'ai écrite en ASM (il y a 20 ans)
et elle utilise des appels au BIOS.


Denis


Avatar
Pascal Hambourg

C'est reproductible (ou presque) en faisant un "swapoff -a" quand la swap
est utilisée ;-)


Ce n'est pas comparable. D'un côté, on essaie d'allouer de la mémoire
qu'on n'a pas. De l'autre, on retire de la mémoire qui était occupée.


Attends.
Le P.O. dit que le fait de lancer l'usine à gaz tue "certains" process
parcequ'ils leur "piquent" leur RAM. Je ne pense pas que ce soit vraiment
ce qui se passe,


Qui sait ? Le noyau 2.4 a une option de configuration CONFIG_OOM_KILLER
qui lorsqu'elle est activée lui permet en cas de manque de mémoire+swap
de tuer des tâches "au mieux" au lieu de tuer systématiquement celle qui
a demandé de la mémoire.

mais si c'était le cas, le "gros" a "retiré de la mémoire
qui était occupée" par "certains".


Je ne vois pas les choses comme ça.



Avatar
Thierry Boudet
On 2007-05-29, Denis Beauregard wrote:

Euh, des appels BIOS sous Linux ?


Je sais que c'est presqu'une hérésie, mais ici, on parle d'une
SGBD sans la nommer.


Il faut suivre, c'est PostgreSQL dont on cause.

Il peut s'agir d'une application Windows
roulant dans Wine ou d'une application Linux faite à partir d'une
autre écrite d'abord pour Windows et où on aurait laisser du code
par oubli.


A mon avis, ça aura du mal à passer l'étape de la compilation.

D'ailleurs, j'ai essayé une application DOS dans
DOSEMU, une application que j'ai écrite en ASM (il y a 20 ans)
et elle utilise des appels au BIOS.


Elle appelle le bios émulé/virtuel de Dosemu, et les éventuels
fuites de mémoire ont lieu _dans_ Dosemu, à ce moment.


--
--{ http://tontonth.free.fr/ }--


Avatar
Pascal Hambourg

Avant d'utiliser le swap, il devrait songer à récupérer une partie de la
mémoire occupée par du cache


- Qu'est-il censé ce passer si la partie physique de/des barette(s) sur
lesquelles se trouvaient ce cache sont defectueuses?


Rien de bon, d'après mon expérience qui se limite à la RAM non ECC. Si
le cache contient des données en attente d'écriture, des données
corrompues seront enregistrées sur le disque. Ensuite, la tâche
récupérant l'emplacement mémoire défectueux va voir son code ou ses
données corrompues, ce qui se peut se manifester par une erreur de
segmentation.

- Est-ce que le noyau "defragmente" ce qui se trouve en RAM (genre: y a une
grosse usine qui se pointe, je pousse un peu ce que j'ai déjà pour lui
laisser un gros bloc)?


Vois pas l'intérêt, le mécanisme de pagination permettant de masquer la
fragmentation de la mémoire physique pour présenter un espace linéaire
aux tâches.

Accessoirement, est-ce que les RAM actuelles ont
encore besoin d'etre rafraichies?


Oui, à la base c'est toujours de la bonne vieille technologie DRAM (RAM
dynamique). Le rafraîchissement peut être géré par le contrôleur mémoire
ou directement par la puce de RAM sur les SDRAM. Mais quoi qu'il en
soit, c'est transparent pour l'OS.


Avatar
Pascal Hambourg
On 2007-05-29, Denis Beauregard wrote:

Euh, des appels BIOS sous Linux ?


Il peut s'agir d'une application Windows
roulant dans Wine [...]

D'ailleurs, j'ai essayé une application DOS dans
DOSEMU, une application que j'ai écrite en ASM (il y a 20 ans)
et elle utilise des appels au BIOS.


Elle appelle le bios émulé/virtuel de Dosemu, et les éventuels
fuites de mémoire ont lieu _dans_ Dosemu, à ce moment.


Et c'est la même chose en natif dans Windows : Windows intercepte les
appels au BIOS et gère la mémoire lui-même en émulant les mécanismes
XMS/EMS.



Avatar
c-note
On 2007-05-29, c-note wrote:
Mem: 3354852K av, 3236376K used, 118476K free, 0K shrd, 30408K buff

Lorsque ce programme termine son execution la RAM n'est pas vider.

Tu es sur qu'il est bien terminé, qu'il ne reste pas un

processus en background pour, par exemple, cloturer les
bases de données ?

Idealement, je souhaiterais vider la RAM apres l'execution du premier
programme.

Est-ce possible ?


Le même phénomène se produit-il en ajoutant de la swap ?


Comme ecrit plus haut les 2 programmes sont independants. Il arrive

qu'ils se chevauchent.

* Pendant l'execution du programme 1 :

Mem: 3354852K av, 3235320K used, 119532K free, 0K shrd, 12464K buff
Swap: 2048276K av, 86252K used, 1962024K free 3084772K cached

PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND
14797 postgres 19 0 23424 22M 21876 R 98.6 0.6 11:49 postmaster

* Fin d'execution du programme 1 :

Mem: 3354852K av, 444272K used, 2910580K free, 0K shrd, 13680K buff
Swap: 2048276K av, 86364K used, 1961912K free 294696K cached

PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND
1 root 8 0 100 64 48 S 0.0 0.0 0:57 init
2 root 8 0 0 0 0 SW 0.0 0.0 0:00 keventd

* Un peu plus tard

Mem: 3354852K av, 3234964K used, 119888K free, 0K shrd, 6420K buff
Swap: 2048276K av, 133520K used, 1914756K free 3113804K cached

PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND
27047 postgres 19 0 6848 6724 5944 D 3.8 0.2 0:02 postmaster

Si le programme 2 se lance alors que le programme 1 n'est pas terminer
il arrive (pas toujours) que le systeme plante :

Resultat de dmesg :

VM: killing process crond
__alloc_pages: 0-order allocation failed (gfp=0x1d2/0)
VM: killing process sh
__alloc_pages: 0-order allocation failed (gfp=0x1d2/0)
VM: killing process postmaster
__alloc_pages: 0-order allocation failed (gfp=0x1d2/0)
VM: killing process sh
__alloc_pages: 0-order allocation failed (gfp=0x1d2/0)
__alloc_pages: 0-order allocation failed (gfp=0x1d2/0)
VM: killing process sendmail
__alloc_pages: 0-order allocation failed (gfp=0x1d2/0)
VM: killing process crond
__alloc_pages: 0-order allocation failed (gfp=0x1d2/0)
__alloc_pages: 0-order allocation failed (gfp=0x1d2/0)
VM: killing process bash
__alloc_pages: 0-order allocation failed (gfp=0x1d2/0)
__alloc_pages: 0-order allocation failed (gfp=0x1d2/0)
VM: killing process pstree
__alloc_pages: 0-order allocation failed (gfp=0x1d2/0)
__alloc_pages: 0-order allocation failed (gfp=0x1d2/0)
VM: killing process sh
__alloc_pages: 0-order allocation failed (gfp=0x1d2/0)
__alloc_pages: 0-order allocation failed (gfp=0x1d2/0)
VM: killing process programme2
__alloc_pages: 0-order allocation failed (gfp=0x1d2/0)
__alloc_pages: 0-order allocation failed (gfp=0x1d2/0)
__alloc_pages: 0-order allocation failed (gfp=0x1d2/0)
VM: killing process snmpd
__alloc_pages: 0-order allocation failed (gfp=0x1d2/0)
__alloc_pages: 0-order allocation failed (gfp=0x1d2/0)
VM: killing process postmaster
__alloc_pages: 0-order allocation failed (gfp=0x1d2/0)
VM: killing process klogd
__alloc_pages: 0-order allocation failed (gfp=0x1d2/0)
__alloc_pages: 0-order allocation failed (gfp=0x1d2/0)
VM: killing process sshd
__alloc_pages: 0-order allocation failed (gfp=0x1d2/0)
VM: killing process atd
__alloc_pages: 0-order allocation failed (gfp=0x1d2/0)

C'est quand meme grave de voir un truc comme ça :
VM: killing process crond !!!

Une idée ?


Avatar
c-note
c-note - <f3jotm$q0a$ :

C'est quand meme grave de voir un truc comme ça :
VM: killing process crond !!!


Heureusement que ça n'arrive pas à tout le monde ;-)


On peut toujours faire une crontab2 qui surveille le bon fonctionnement
de la crontab1 et inversement :-)


1 2 3 4