Forum Linux.noyau OOM Killer, avec la moitié de la RAM utilisé par le cache

Posté par .
Tags : aucun
0
6
jan.
2012

Bonjour,

je dispose d'un serveur avec 64Go de RAM et un Linux 2.6.39
Hier soir, le OOM Killer m'a tué un processus kvm, et je ne comprends pas pourquoi.

Voici l'utilisation mémoire actuelle:

MemTotal: 66108636 kB
MemFree: 1032244 kB
Buffers: 20732 kB
Cached: 29441080 kB
SwapCached: 1048556 kB
SwapTotal: 1925116 kB
SwapFree: 4300 kB

C'est plus ou moins pareil toute la journée. Il y a 29Go de cache, et il me semblait que le noyau allait se servir là dedans avant de tuer un processus.
Est-ce une question de rapidité à libérer le cache ? La vm en question fait tourner une instance redis sur laquelle je vais stocker des chaînes de caractères plus de 30 fois par seconde, donc j'imagine que ça représente pas mal d'allocation mémoire, corrigez moi si je me trompe.

De manière générale, comment puis-je éviter ce problème à l'avenir ?

  • # Détails ?

    Posté par (page perso) . Évalué à 1. Dernière modification le 06/01/12 à 12:16.

    Peux-tu préciser si tu es en 32 ou 64 bits ? (oui, un Kernel 32 bits Hugemem ou PAE gère 64Go).

    EnSeules les données actuellement inutilisées peuvent être libérées du cache. Tu peux tenter un :

    sync ; echo 3 > /proc/sys/vm/drop_caches

    pour voir si tu as une grosse différence avant/après. Si tu en as peu, alors tes processus utilisent actuellement le cache.

    Il se peut aussi que la qté de RAM pouvant être libérée ne suffise pas. Notamment, il faudrait le détail de l'oom killer (zone normal/high/dma, etc.).

    • [^] # Re: Détails ?

      Posté par . Évalué à 1.

      Je suis en 64 bits.
      Le drop_caches m'a fait gagner environ 3 go de mémoire, je suis à 26Go de cache.

      Concernant le détail de l'oom killer je ne suis pas sûr de ce que tu souhaites comme informations, donc voilà ce que j'ai dans mon syslog: http://pastie.org/3137082

      Je n'ai pas inclus une liste de processus avec plusieurs centaines d'entrées de ce type:

      Jan 5 18:38:28 bub6 kernel: [8046096.424174] [25613] 33 25613 47013 1180 34 0 0 apache2

      Je sais pas si c'est pertinent mais je peux le fournir si besoin.

      • [^] # Re: Détails ?

        Posté par (page perso) . Évalué à 1.

        Je pensais à des entrées de ce genre :

        May 1 18:18:00 ks354723 kernel: Node 0 DMA: 331*4kB 320*8kB 0*16kB 0*32kB 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 3884kB
        May 1 18:18:00 ks354723 kernel: Node 0 DMA32: 485*4kB 8*8kB 0*16kB 1*32kB 0*64kB 0*128kB 1*256kB 1*512kB 1*1024kB 0*2048kB 0*4096kB = 3828kB
        ...
        qui précisent le nombre de segments de la taille donnée disponibles. Si ton application a besoin d'un segment de 2048ko et qu'aucun n'est dispo, le noyau déclenchera un oom_killer même si le total disponible dépasse les 2048 ko.

        Dans ton cas, la purge des caches ne libère "que" 3 Go de mémoire. Le reste n'a pas pu être libéré car il est effectivement en cours d'utilisation. Il est possible que ces 3 Go étaient utilisés et non libérables lors du déclenchement de l'OOM killer.

        Ton serveur est un hyperviseur, c'est en effet embêtant qu'il tue tes VM. Cependant il semble qu'il y avait une réelle saturation dans ton cas. Quelle quantité cumulée de RAM as-tu affecté pour l'ensemble des VM ?

        Te voyant mal rajouter de la RAM (tu es au taquet, limite matérielle atteinte non ?), tu devrais répartir tes VM sur d'autres serveurs. Il n'y a, je pense, mais je peux me tromper, pas grand chose d'autre à faire.

        • [^] # Re: Détails ?

          Posté par . Évalué à 1. Dernière modification le 06/01/12 à 16:31.

          Je n'ai aucune ligne de ce genre dans mon syslog ou mon kern.log malheureusement, ce que j'ai fourni plus haut c'est tout ce que j'ai avec la liste de processus.

          J'ai 6 vm avec 4096mo, une vm avec 2048 mo et une vm avec 8192 mo de RAM. 34816mo en tout.
          La quantité de cache me paraît phénoménale, mais c'est sans doute normal.

          Je pourrais rajouter de la RAM (c'est une grosse machine), mais pour le moment j'ai coupé 3 vm ce qui me donne un peu de marge, et ai transféré les services sur d'autres machines.

          A tout hasard, est-il possible de connaître le détail de ce qui est en cache ?

          EDIT: je viens de refaire un drop_caches pour voir, il vient de passer de 39 à 25go...

          Merci de ton aide en tout cas.

          • [^] # KSM ?

            Posté par . Évalué à 1.

            Si tu utilise des VM assez semblable, tu pourrais peut être gagner un peu de ram en activant le KSM si ce n'est déjà pas le cas.

            echo 1 > /sys/kernel/mm/ksm/run
            
            
            • [^] # Re: KSM ?

              Posté par . Évalué à 1.

              Merci de ta proposition, mais c'était déjà activé.

  • # augmenter le swap ?

    Posté par (page perso) . Évalué à 1.

    si on regarde le swap : il est quasi-plein (99,7%) , ce qui n'est pas une situation "normale" :
    SwapTotal: 1925116 kB
    SwapFree: 4300 kB

    je te conseille d'augmenter ton swap , par exemple avec une autre partition de même taille, ce qui te ramerait à un taux d'occupation plus confortable de 50%.

    • [^] # Re: augmenter le swap ?

      Posté par (page perso) . Évalué à 2.

      Il a 64 Go de mémoire et 2 Go de swap, soit 3% de gain --> supprimer le swap

      • [^] # Re: augmenter le swap ?

        Posté par . Évalué à 1.

        La taille du swap je l'ai choisi un peu au pif pour être honnête. Je voulais pas respecter la "règle" de la moitié de la ram en swap, parce que mon espace disque est limité, et je me disais aussi qu'on va jamais consommer autant de ram.
        Comme dit plus bas, cette machine à la base n'était pas prévu pour faire tourner des vm, elle devait uniquement faire tourner un postgresql pas vraiment chargé.
        Depuis, on a eu un nouveau projet et on a du utiliser cette machine, et le temps qu'on ait accès à des machines physiques pour nos process java, j'ai décidé d'y faire tourner quelques vm.

        Jusqu'à présent ça marchait sans que rien ne se fasse tuer, mais ces dernières semaines la charge sur postgresql a augmenté, ainsi que la charge sur la vm avec Redis dessus, et le oom killer a commencé à frapper.

        Bref, la config de cette machine est certainement pas parfaite, mais à la base je suis développeur, et ça a été mis en place en peu de temps.
        Si je supprime le swap ça va pas accentuer le problème, vu qu'il est utilisé à 100% ?

  • # OOM_SCORE_ADJ_MIN

    Posté par . Évalué à 0.

    oomkiller et kernel 2.6.36
    http://linux-mm.org/OOM

    Essai de jouer sur le paramètre OOM_SCORE_ADJ_MIN pour tes processus KVM.

  • # vmware / cache disque

    Posté par . Évalué à 1. Dernière modification le 07/01/12 à 11:59.

    bon, je vais peut-être faire un léger hors-sujet (pas OOM Killer ni KVM), mais c'est tout de même en rapport avec les vm et la mémoire...

    Il y a quelque temps, sur ma machine de travail (dév web, sous débian), j'avais installé un vmware server (2.xx) qui me servait à faire tourner des windows 2000 avec IE6 pour tester mes pages sous ce "navigateur", ces vm avaient peu de besoin en mémoire et disque (512 mo de ram et 4 go de disque virtuel en mode fichier d'un seul morceau), pas de pb.

    Puis mon client principal a migré son park de machines sous vista/ie7, j'ai donc créé un vm sous vista, avec plus de mémoire (4 go pour le guest, 8 go pour le host) et surtout un plus gros disque virtuel (15-20 go), j'ai commencé à avoir des problèmes de réactivité dans la vm.
    Je n'ai pas vraiment eu le temps (ni les compétences) pour rechercher l'origine de ces lenteurs, mais j'en suis venu à me demander si mon host linux n'essayait pas de stocker en cache disque le fichier représentant le disque virtuel de la vm, ce qui ne me semblait pas une très bonne idée (je me suis même demandé si ça ne faisait pas double emploi avec le mécanisme de cache disque tournant le guest ?).
    Je n'ai pas trouvé comment interdire la mise cache disque de ces gros fichiers (qui sont souvent modifiés par le fonctionnement de la vm).
    La prochaine fois que je jouerai avec des vm, je prévois d'essayer kvm avec des disques virtuels en LVM.

    Tu as indiqué les besoins mémoire de tes VMs, mais, juste par curiosité, quelles configurations disques pour tes vm (LVM, NAS/SAN,...) ?

    encore une fois, je suis dév web, pas admin système, je ne me pose probablement pas les bonnes questions, désolé pour la non pertinence de mon commentaire, mais j'essaie d'apprendre en lisant les mésaventures des autres...

    Envoyé depuis mon Archlinux

    • [^] # Re: vmware / cache disque

      Posté par . Évalué à 2.

      de mes precedentes experiences de VM (kvm/vmware/virtualbox)

      je m'arrange pour mettre plus de RAM pour le guest
      afin de desactiver le swap de ce dernier.

      car il me semble evident que si le guest swap, cela va generer les I/O sur l'hote principal puisqu'on accede au disque.

      ex :
      machine windows XP : 1 à 2Go de ram, 0 swap
      machine seven : 2Go de ram mini, toujours 0 swap

      donc il faut qu'il regarde DANS ces VMs si y en a qui cherche à swapper,
      et augmenter leur quantité de RAM allouée.

    • [^] # Re: vmware / cache disque

      Posté par . Évalué à 1.

      Ce sont de simples fichiers sur un volume raid. Ce sont pas des vm qui font beaucoup d'io, à part un fichier de log d'un process java.
      Si ça avait été prévu dès le départ de faire tourner des vm j'aurai certainement fait du lvm, mais à la base cette machine devait que de la base de données.

      Apparemment il y a cette option pour désactiver le cache, mais je viens de vérifier et le cache est déjà désactivé sur mes vm. Ou bien je comprends mal ce que cette option est censé faire.

      • [^] # Re: vmware / cache disque

        Posté par . Évalué à 2.

        je ne parlais pas de desactiver le cache dans les VM, mais bien de supprimer le swap.

        car si ta VM est juste en RAM, elle utilise le SWAP
        le SWAP etant un acces disque cela cree des I/O qui sont retransmis à ta machine principale
        ce qui occupe alors le processeur, ralentissant alors toutes les machines.

        ca ne resoud surement pas ton probleme avec OOMkiller, mais ca peut ameliorer quand meme tes performances.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.