87 votes

Comment fonctionne vm.overcommit_memory ?

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

vm.overcommit_memory = 0
vm.overcommit_ratio = 50

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

CommitLimit:     2609604 kB
Committed_AS:    1579976 kB

Mais quand je change vm.overcommit_memory de 0 à 2, je ne peux pas démarrer le même ensemble d'applications que je pouvais démarrer avant le changement, en particulier amarok. J'ai dû changer vm.overcommit_ratio à 300, donc la limite pourrait être augmentée. Maintenant, quand je démarre amarok, /proc/meminfo affiche ce qui suit :

CommitLimit:     5171884 kB
Committed_AS:    3929668 kB

Cette machine a seulement 1GiB de RAM, mais amarok fonctionne sans problèmes lorsque vm.overcommit_memory est réglé à 0. Mais dans le cas de le régler à 2, amarok doit allouer plus de 2GiB de mémoire. Est-ce un comportement normal ? Si c'est le cas, est-ce que quelqu'un pourrait expliquer pourquoi, par exemple, firefox (qui consomme 4-6 fois plus de mémoire que amarok) fonctionne de la même manière avant et après le changement ?

0 votes

Qu'est-ce que le amarok dit.

0 votes

Voir également une limite apparentée des applications à très grande mémoire vm.max_map_count stackoverflow.com/questions/41268091/…

112voto

Kyle Brandt Points 81077

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

/proc/sys/vm/overcommit_memory
       Ce fichier contient le mode de comptabilité de la mémoire virtuelle du noyau.
       Les valeurs sont :

              0: surallocation heuristique (c'est la valeur par défaut)
              1: toujours surallouer, ne jamais vérifier
              2: toujours vérifier, ne jamais surallouer

       En mode 0, les appels à mmap(2) avec MAP_NORESERVE ne sont pas
       vérifiés, et la vérification par défaut est très légère, ce qui peut conduire au
       risque de voir un processus être "tué par OOM".

       En mode 2 (disponible depuis Linux 2.6), l'espace d'adressage virtual total
       pouvant être alloué (CommitLimit dans /proc/mem
       info) est calculé comme suit :

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

La réponse simple est que définir overcommit à 1, prépare le terrain pour que lorsqu'un programme appelle quelque chose comme malloc() pour allouer une partie de mémoire (man 3 malloc), cela réussira toujours indépendamment du fait que le système sait qu'il n'aura pas 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é sur de la mémoire physique réelle. En désactivant la vérification de l'overcommit, vous dites au système d'exploitation de simplement supposer qu'il y a toujours suffisamment de mémoire physique pour sauvegarder l'espace virtuel.

Exemple

Pour mettre en lumière pourquoi cela peut parfois être important, consultez les guidances Redis sur la raison pour laquelle vm.overcommit_memory devrait être défini à 1 pour cela.

2 votes

Mais la valeur de Committed_AS ne devrait-elle pas être la même dans les deux cas ?

0 votes

@MikhailMorfikov: En théorie, je crois que oui, mais qui sait ce que ces programmes sont en train de faire. Je voudrais voir un environnement plus contrôlé avec un programme simple qui alloue par exemple un gigaoctet de RAM via Malloc. Et ensuite exécuter le test après avoir redémarré entre les tests.

0 votes

D'accord, donc je vais rester avec 0 pour l'instant.

27voto

d4nyll Points 284

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

Tout d'abord, lorsque vm.overcommit_memory = 0, la valeur de vm.overcommit_ratio est sans importance. Le noyau utilisera un algorithme heuristique pour surcompenser la mémoire, de sorte que votre processus amarok puisse se voir allouer plus de mémoire que ce qui est disponible.

Lorsque vous définissez vm.overcommit_memory sur 2, la valeur de vm.overcommit_ratio devient pertinente. Par défaut, cette valeur est définie sur 50, ce qui signifie que le système n'allouerait que jusqu'à 50% de votre RAM (plus de swap). Cela explique pourquoi vous ne pouvez pas démarrer des programmes qui fonctionnaient bien lorsque vm.overcommit_memory = 0 - car il y a moins de 500 Mo de mémoire allouable (en supposant aucun swap).

Lorsque vous le définissez sur 300, vous permettez au système d'allouer jusqu'à 300% de votre RAM (plus de swap, le cas échéant), c'est pourquoi la valeur de CommitLimit dans /proc/meminfo est si élevée.

Bien que vm.overcommit_memory = 2 soit généralement utilisé pour éviter la surallocation, ici, vous l'utilisez pour plafonner la quantité qui peut être surcompensée. Le définir sur 300 est dangereux car votre système n'a pas 5171884 ko de mémoire, et donc, en fonction de la quantité d'espace de swap que vous avez, le système utilisera le swap (qui est lent) ou manquera complètement de mémoire.

Quant à 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 fonctionne bien avec moins aussi. Ainsi, la logique du programme peut essayer d'allouer 2 Go de mémoire initialement, mais en cas d'échec, essayer 1 Go.

2 votes

Principalement correct - mais le taux de sur-engagement définit combien de mémoire virtuelle EN PLUS de la quantité disponible peut être allouée - par exemple, overmmit_ratio=50 permettrait d'allouer 150 % de la RAM + SWAP. Voir kernel.org/doc/Documentation/vm/overcommit-accounting

1voto

Ajmal Points 1

Le noyau Linux prend en charge les modes de gestion des sur-engagements suivants

0 - Gestion heuristique des sur-engagements. Les sur-engagements évidents de l'espace d'adresse sont refusés. Utilisé pour un système typique. Il garantit qu'une allocation excessivement grande échoue tout en permettant le sur-engagement pour réduire l'utilisation de l'échange. root est autorisé à allouer légèrement plus de mémoire dans ce mode. C'est le mode par défaut.

1 - Toujours sur-engagement. Approprié pour certaines applications scientifiques. L'exemple classique est du code utilisant des tableaux clairsemés et se reposant uniquement sur la mémoire virtuelle composée presque entièrement de pages de zéro.

2 - Pas de sur-engagement. Le total des engagements de l'espace d'adresse pour le système n'est pas autorisé à dépasser l'échange + une quantité configurable (par défaut 50%) de la RAM physique. En fonction de la quantité utilisée, dans la plupart des situations, cela signifie qu'un processus ne sera pas tué lors de l'accès aux pages mais recevra des erreurs lors de l'allocation de mémoire comme il se doit.

    Utile pour les applications qui veulent garantir que leurs
    allocations mémoire seront disponibles à l'avenir
    sans avoir à initialiser chaque page.

https://www.kernel.org/doc/Documentation/vm/overcommit-accounting

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