85 votes

Comment fonctionne vm.overcommit_memory ?

Lorsque j'utilise les paramètres par défaut :

vm.overcommit_memory = 0
vm.overcommit_ratio = 50

Je peux lire ces valeurs à partir de /proc/meminfo fichier :

CommitLimit:     2609604 kB
Committed_AS:    1579976 kB

Mais quand je change vm.overcommit_memory de 0 a 2 Je suis incapable de lancer le même ensemble d'applications que je pouvais lancer avant le changement, en particulier Amarok. J'ai dû changer vm.overcommit_ratio a 300 La limite pourrait donc être augmentée. Maintenant, quand je commence Amarok, /proc/meminfo montre ce qui suit :

CommitLimit:     5171884 kB
Committed_AS:    3929668 kB

Cette machine n'a que 1GiB de RAM, mais amarok fonctionne sans problème lorsque vm.overcommit_memory est fixé à 0. Mais dans le cas où il est fixé à 2 amarok a besoin d'allouer plus de 2GiB de mémoire. Est-ce un comportement normal ? Si oui, quelqu'un pourrait-il expliquer pourquoi, par exemple, firefox (qui consomme 4-6x plus de mémoire qu'amarok) fonctionne de la même manière avant et après le changement ?

110voto

Kyle Brandt Points 81077

Vous pouvez trouver la documentation dans man 5 proc ( ou sur kernel.org ):

/proc/sys/vm/overcommit_memory
       This file contains the kernel virtual memory accounting mode.
       Values are:

              0: heuristic overcommit (this is the default)
              1: always overcommit, never check
              2: always check, never overcommit

       In mode 0, calls of mmap(2) with MAP_NORESERVE are not
       checked, and the default check is very weak, leading to the
       risk of getting a process "OOM-killed".

       In mode 2 (available since Linux 2.6), the total virtual
       address space that can be allocated (CommitLimit in /proc/mem
       info) is calculated as

           CommitLimit = (total_RAM - total_huge_TLB) *
                         overcommit_ratio / 100 + total_swap

La réponse simple est qu'en fixant overcommit à 1, on fait en sorte que lorsqu'un programme appelle quelque chose comme malloc() pour allouer un morceau de mémoire ( man 3 malloc ), elle réussira toujours, même si le système sait qu'il ne disposera pas de toute la mémoire demandée.

Le concept sous-jacent à comprendre est l'idée de mémoire virtuelle . Les programmes voient un espace d'adressage virtuel qui peut, ou non, être mappé à la mémoire physique réelle. En désactivant la vérification de l'overcommit, vous dites au système d'exploitation de supposer qu'il y a toujours assez de mémoire physique pour sauvegarder l'espace virtuel.

Exemple

Pour comprendre pourquoi cela peut parfois avoir de l'importance, jetez un coup d'œil à l'exemple suivant Guide de Redis pourquoi vm.overcommit_memory doit être mis à 1 pour elle.

27voto

d4nyll Points 284

C'est une vieille question avec une réponse bien établie, mais je pense qu'il y a plus à ajouter.

Tout d'abord, lorsque vm.overcommit_memory = 0 die vm.overcommit_ratio n'est pas pertinente. Le noyau utilisera un algorithme heuristique pour surcommettre la mémoire, de sorte que votre amarok peut se voir attribuer plus de mémoire que celle qui est disponible.

Lorsque vous définissez vm.overcommit_memory a 2 die vm.overcommit_ratio devient pertinente. Par défaut, cette valeur est fixée à 50 ce qui signifie que le système n'allouera que 50% de votre RAM (plus le swap). Cela explique pourquoi vous ne pouvez pas lancer les programmes qui étaient bien lorsque le système était en marche. vm.overcommit_memory = 0 - parce qu'il y a moins de 500MB de mémoire allouable (en supposant qu'il n'y a pas de swap).

Lorsque vous le réglez sur 300 vous permettez au système d'allouer jusqu'à 300% de votre RAM (plus le swap, s'il y en a un), c'est pourquoi l'option CommitLimit valeur dans /proc/meminfo est si élevé.

Bien que vm.overcommit_memory = 2 est généralement utilisé pour empêcher le surengagement, ici, vous l'utilisez pour plafonner le montant qui peut être surengagé. En le réglant sur 300 est dangereux car votre système n'a pas 5171884 kB de mémoire, et donc, en fonction de l'espace d'échange dont vous disposez, le système utilisera l'espace d'échange (ce qui est lent), ou manquera complètement de mémoire.

Quant à savoir pourquoi amarok utilise plus de mémoire lorsque vm.overcommit_memory = 2 - c'est probablement parce que amarok fonctionne mieux avec plus de mémoire, mais convient aussi avec moins. Ainsi, la logique du programme peut essayer d'allouer 2 Go de mémoire au départ, mais en cas d'échec, essayer 1 Go.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X