OVH Cloud OVH Cloud

Allouer plus de mémoire que disponible

76 réponses
Avatar
Rémi Moyen
Salut,

J'ai une question sur la mani=E8re dont se comporte un programme sous
Linux, en C++, quand on essaye d'allouer plus de m=E9moire que
disponible sur le syst=E8me. =C0 la base, l'op=E9rateur new lance dans ce
cas-l=E0 une exception et c'est =E0 moi de la rattraper et de la traiter,
tr=E8s bien.

Mais mon probl=E8me est de savoir si, par derri=E8re, le noyau essaye
d'allouer toute la m=E9moire avant de se rendre compte qu'il n'en a pas
assez de disponible, ou est-ce qu'il fait d'abord une v=E9rification
avant de se lancer l=E0-dedans ?

Dans le cas o=F9 la m=E9moire est sur de la RAM, =E7a ne change probablement
pas grand chose (en perception par l'utilisateur), mais si il y a du
swap, est-ce que le noyau va faire swapper tout ce qu'il peut pendant
une heure avant de se rendre compte qu'il lui manque 42 octets ?

Si c'est le cas, alors j'imagine que j'ai int=E9r=EAt =E0 impl=E9menter
quelques checks rapides sur la m=E9moire disponible avant de commencer =E0
allouer des blocs de 1 Go (=E7a m'arrive...), sinon mes utilisateurs
risquent de ne pas trop aimer devoir attendre longtemps, et swapper
tout les autres programmes, avant de s'entendre dire qu'il n'y a pas
assez de m=E9moire pour faire ce qu'ils veulent ! Et dans ce cas-l=E0
encore, y'a-t-il une mani=E8re plus ou moins "standard" de v=E9rifier "=E0
la main" la m=E9moire disponible ?

Et accessoirement, j'imagine que diff=E9rents OS peuvent se comporter
diff=E9remment de ce point de vue, donc est-ce pareil pour SunOS ?
IRIX ? (les deux autres syst=E8mes que je suis susceptible d'utiliser)

Merci d'avance !
--
R=E9mi Moyen

10 réponses

4 5 6 7 8
Avatar
Nicolas George
Jean-Louis Liagre wrote in message
<45db27ee$0$3885$:
Admettons que j'ai 8 Go de RAM et 1 Go de swap. Je positionne le
l'overcommit a 2 et je laisse la config par defaut (50%).
Mon hardware + noyau utilisent 128Mo, l'O/S va donc refuser les
allocations au dela de "1Go + (8Go-128Mo)*50%" soit 4.94 Go.

J'ai donc plus de 4 Gigas de memoire virtuelle, dont plus de 3 gigas de
RAM !!!, qui sont inutilisables ...


Si je te comprends bien, tu te plains que si tu mets des valeurs
fantaisistes pour la taille du swap et les sysctl, le système fonctionne de
manière sous-optimale ? Je dois dire que ça ne me surprend pas.

Avatar
Jean-Louis Liagre
Nicolas George wrote:
Jean-Louis Liagre wrote in message
<45d8c514$0$3286$:

C'est une interprétation plausible, mais qui ne correspond pas à ce qui
est écrit ici:

The total address space commit for the system is not permitted to exceed
swap + a configurable percentage (default is 50) of physical RAM.

Il n'est pas fait ici allusion a un espace *disponible* de swap ou de
RAM. J'en déduis donc qu'il s'agit de la taille totale du swap plus la
moitié de la RAM installée. Il est en effet écrit "Physical RAM", pas
"Available RAM".



Linux a l'habitude de ne pas _du tout_ comptabiliser la mémoire utilisée
directement par le coeur du noyau (la plus grande partie étant la table des
pages). C'est comme ça. Par exemple, dans /proc/meminfo, MemTotal ne la
prend pas en compte. Dans ces conditions, il est absolument évident pour
quiconque un peu au courant que la mention « physical RAM » doit
s'interpréter à cette aune, et simplement par opposition à swap.


J'admet que ca puisse etre le cas mais ca ne resout pas le probleme.

Linux n'est pas capable de gerer lui-meme la limite exacte de
l'overcommit et impose un tuning plus ou mois approximatif si l'on
souhaite eviter l'OOM killer.

Admettons que j'ai 8 Go de RAM et 1 Go de swap. Je positionne le
l'overcommit a 2 et je laisse la config par defaut (50%).
Mon hardware + noyau utilisent 128Mo, l'O/S va donc refuser les
allocations au dela de "1Go + (8Go-128Mo)*50%" soit 4.94 Go.

J'ai donc plus de 4 Gigas de memoire virtuelle, dont plus de 3 gigas de
RAM !!!, qui sont inutilisables ...


Avatar
JKB
Le 21-02-2007, à propos de
Re: Allouer plus de mémoire que disponible,
Jean-Louis Liagre écrivait dans fr.comp.os.unix :
Nicolas George wrote:
Jean-Louis Liagre wrote in message
<45db27ee$0$3885$:

Admettons que j'ai 8 Go de RAM et 1 Go de swap. Je positionne le
l'overcommit a 2 et je laisse la config par defaut (50%).
Mon hardware + noyau utilisent 128Mo, l'O/S va donc refuser les
allocations au dela de "1Go + (8Go-128Mo)*50%" soit 4.94 Go.

J'ai donc plus de 4 Gigas de memoire virtuelle, dont plus de 3 gigas de
RAM !!!, qui sont inutilisables ...




Par une allocation d'un processus, si j'ai bien compris.

Si je te comprends bien, tu te plains que si tu mets des valeurs
fantaisistes pour la taille du swap et les sysctl, le système fonctionne de
manière sous-optimale ? Je dois dire que ça ne me surprend pas.


La taille du swap me regarde, elle n'a rien de fantaisiste si la taille
de la RAM est suffisante aux besoins des applications que je fait tourner.

Les sysctl ont leur valeurs par defaut et en effet, Linux fait preuve
ici de beaucoup de fantaisie.


Par défaut, le paramètre en question est à 0 :

0 - Heuristic overcommit handling. Obvious overcommits of
address space are refused. Used for a typical system. It
ensures a seriously wild allocation fails while allowing
overcommit to reduce swap usage. root is allowed to
allocate slighly more memory in this mode. This is the
default.

Maintenant, si on positionne le truc à 2 et qu'on a une machine
"normale", mettons mon U2 avec 2Go de mémoire et 4Go de swap, je
peux par défaut faire une allocation de 5Go, ce qui n'est pas
absurde (reste 1Go pour tout le reste, noyau, X et autres
applications). Il est toujours possible de positionner
vm.overcommit_ratio, mais je ne suis pas franchement sûr que ce soit
une excellente idée.

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.



Avatar
JKB
Le 21-02-2007, à propos de
Re: Allouer plus de mémoire que disponible,
Jean-Louis Liagre écrivait dans fr.comp.os.unix :
JKB wrote:
Le 21-02-2007, à propos de
Re: Allouer plus de mémoire que disponible,
Jean-Louis Liagre écrivait dans fr.comp.os.unix :

Nicolas George wrote:

Jean-Louis Liagre wrote in message
<45db27ee$0$3885$:


Admettons que j'ai 8 Go de RAM et 1 Go de swap. Je positionne le
l'overcommit a 2 et je laisse la config par defaut (50%).
Mon hardware + noyau utilisent 128Mo, l'O/S va donc refuser les
allocations au dela de "1Go + (8Go-128Mo)*50%" soit 4.94 Go.

J'ai donc plus de 4 Gigas de memoire virtuelle, dont plus de 3 gigas de
RAM !!!, qui sont inutilisables ...





Par une allocation d'un processus, si j'ai bien compris.


Je comprend moi que ces 3 gigas de RAM seront inutilisables que que soit
le nombre de processus et d'allocations faites.


Personnellement, je comprends "par allocation". Et cela semble
confirmé par mes tests.

Si je te comprends bien, tu te plains que si tu mets des valeurs
fantaisistes pour la taille du swap et les sysctl, le système fonctionne de
manière sous-optimale ? Je dois dire que ça ne me surprend pas.


La taille du swap me regarde, elle n'a rien de fantaisiste si la taille
de la RAM est suffisante aux besoins des applications que je fait tourner.

Les sysctl ont leur valeurs par defaut et en effet, Linux fait preuve
ici de beaucoup de fantaisie.



Par défaut, le paramètre en question est à 0 :

0 - Heuristic overcommit handling. Obvious overcommits of
address space are refused. Used for a typical system. It
ensures a seriously wild allocation fails while allowing
overcommit to reduce swap usage. root is allowed to
allocate slighly more memory in this mode. This is the
default.

Maintenant, si on positionne le truc à 2 et qu'on a une machine
"normale", mettons mon U2 avec 2Go de mémoire et 4Go de swap, je
peux par défaut faire une allocation de 5Go, ce qui n'est pas
absurde (reste 1Go pour tout le reste, noyau, X et autres
applications).


Je ne suis pas d'accord avec le "et autres applications".


Pourquoi ?

Le 1 Go restant n'est utilisable que par le noyau ou des modules/drivers
associes, pas par des applications.

Il est toujours possible de positionner
vm.overcommit_ratio, mais je ne suis pas franchement sûr que ce soit
une excellente idée.


C'est vrai, l'overcommit n'est pas a sa valeur par defaut.

Je ne sais pas ce que c'est qu'une machine "normale". Si une
configuration est autorisee et qu'elle se justifie, je ne vois pas
pourquoi on devrait la juger "anormale".

Ce que je reproche au parametre overcommit, c'est qu'il induit les
utilisateurs en erreur car son libelle est trompeur.

Il permet c'est vrai de reduire le risque d'OOM killer, mais exige un
parametrage tres fin pour etre sur que l'on ne tombe pas dans le
probleme inverse, ce que mon exemple demontre. En fait, on ne sait pas
trop si on a supprime le risque.


Dans la vraie vie, on est souvent bien content d'avoir un OOM
killer. Cela évite généralement de rebooter sauvagement un serveur.
Je ne l'ai vu à l'oeuvre que deus ou trois fois, mais le réseultat
est assez bon. Dernier exemple : un stagiaire écrit du C avec un
pied gauche et dans un algorithme de traitement alloue de la mémoire
façon malloc(), chaque bloc alloué faisant quelque kilo. Le
problème, c'est qu'il n'a jamais utilisé le free() correspondant.
Sur une machine de calcul, il est d'assez bon ton que le système se
démerde seul pour virer le gêneur, parce que dans le cas du reboot
sauvage, les calculs qui tournaient depuis quinze jour sont perdus.

Voici aussi ce que je vois dans le code source:

#define OVERCOMMIT_NEVER 2

Le "NEVER" est clairement incorrect. (le STRICT de la doc est plus exact).

En definitive, je ne comprend pas pourquoi Linux oblige a effectuer un
tuning quand on souhaite disposer de toute sa memoire virtuelle sans
jamais overcommiter une allocation, alors qu'il a toute les billes pour
effectuer ce controle tout seul.


Parce qu'il n'y a pas trente-six solutions. Soit on utilise un
overcommit et un OOM killer (ou récupération des signaux gaçon
segfault), soit on n'utilise pas d'overcommit et la gestion de la
mémoire est clairement sous-optimale. Tout ceci est une histoire de
compromis.

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.





Avatar
Nicolas George
Jean-Louis Liagre wrote in message
<45dc294f$0$3878$:
Ce que je reproche au parametre overcommit, c'est qu'il induit les
utilisateurs en erreur car son libelle est trompeur.


Quelqu'un qui change des paramètres aussi pointus sans lire très
attentivement la doc cherche les coups de toutes façons.

En definitive, je ne comprend pas pourquoi Linux oblige a effectuer un
tuning quand on souhaite disposer de toute sa memoire virtuelle sans
jamais overcommiter une allocation, alors qu'il a toute les billes pour
effectuer ce controle tout seul.


Le réglage de la VM est quelque chose de complexe, qui dépend énormément des
objectifs d'utilisation de la machine, des objectifs de fiabilité sur les
différents aspects, etc. Par exemple, sans overcommit, un processus qui
monopolise 51% de la mémoire virtuelle pour un gros calcul ne peut pas faire
un simple fork+exec d'un shell avec tuyauterie (et faire de la tuyauterie
avec vfork, c'est quand même très pénible), ce qui est quand même dommage.

Avatar
Sébastien Monbrun aka TiChou
Dans le message <news:45dc7da6$0$7501$,
*Jean-Louis Liagre* tapota sur f.c.o.unix :

Date: Wed, 21 Feb 2007 18:13:54 -0800
NNTP-Posting-Date: 21 Feb 2007 18:13:10 MET


Il était 18 h 13 quand vous avez posté, et non 3 h 13 du matin.

Mauvais fuseau horaire, changer de fuseau horaire.


--
Sébastien Monbrun aka TiChou

Avatar
Nicolas George
Jean-Louis Liagre wrote in message
<45dc7da6$0$7501$:
Un malloc/new ou mmap qui plante, ca ne fait pas rebooter un serveur.


Si le sshd sur le serveur ne peut plus forker parce qu'un processus à la
con, non critique, a alloué toute la mémoire, tu n'as pas trop d'autre choix
que de rebooter de l'extérieur.

A supposer que non, rien ne garantit que le process a
l'origine de la fuite soit precisement celui que va degager l'OOM Killer.


Rien ne le garantit, mais il y a de bonnes chances, ce qui est mieux que pas
de chances du tout.

Je souhaite que le systeme avec lequel je travaille respecte les
standards et la semantique Posix.
En particulier, si mon code fait un malloc, je m'attend a ce que l'appel
retourne null si le malloc n'est pas garanti.


POSIX ne garantit pas l'absence d'overcommit.

Avatar
Jean-Louis Liagre
Nicolas George wrote:
Jean-Louis Liagre wrote in message
<45db27ee$0$3885$:

Admettons que j'ai 8 Go de RAM et 1 Go de swap. Je positionne le
l'overcommit a 2 et je laisse la config par defaut (50%).
Mon hardware + noyau utilisent 128Mo, l'O/S va donc refuser les
allocations au dela de "1Go + (8Go-128Mo)*50%" soit 4.94 Go.

J'ai donc plus de 4 Gigas de memoire virtuelle, dont plus de 3 gigas de
RAM !!!, qui sont inutilisables ...



Si je te comprends bien, tu te plains que si tu mets des valeurs
fantaisistes pour la taille du swap et les sysctl, le système fonctionne de
manière sous-optimale ? Je dois dire que ça ne me surprend pas.


La taille du swap me regarde, elle n'a rien de fantaisiste si la taille
de la RAM est suffisante aux besoins des applications que je fait tourner.

Les sysctl ont leur valeurs par defaut et en effet, Linux fait preuve
ici de beaucoup de fantaisie.


Avatar
Jean-Louis Liagre
Sébastien Monbrun aka TiChou wrote:
Dans le message <news:45dc7da6$0$7501$,
*Jean-Louis Liagre* tapota sur f.c.o.unix :

Date: Wed, 21 Feb 2007 18:13:54 -0800
NNTP-Posting-Date: 21 Feb 2007 18:13:10 MET



Il était 18 h 13 quand vous avez posté, et non 3 h 13 du matin.

Mauvais fuseau horaire, changer de fuseau horaire.


C'est fait, enfin j'espere.


Avatar
Nicolas George
Jean-Louis Liagre wrote in message
<45dc843e$0$32740$:
Date: Wed, 21 Feb 2007 09:42:04 -0800
NNTP-Posting-Date: 21 Feb 2007 18:41:18 MET

C'est fait, enfin j'espere.


Non, raté.

4 5 6 7 8