Comment tester la partition de swap

23

J'essaie de diagnostiquer des erreurs de segmentation aléatoires sur un serveur sans tête et une chose qui semble curieuse est qu'elles ne semblent se produire que sous la pression de la mémoire et ma taille de swap ne dépassera pas 0.

Comment forcer ma machine à permuter pour m'assurer qu'elle fonctionne correctement?

orca ~ # free
             total       used       free     shared    buffers     cached
Mem:       1551140    1472392      78748          0     333920    1046368
-/+ buffers/cache:      92104    1459036
Swap:      1060280          0    1060280

orca ~ # swapon -s
Filename                                Type            Size    Used    Priority
/dev/sdb2                               partition       1060280 0       -1
joshperry
la source
Y a-t-il des messages kern.logau moment des erreurs de segmentation? Un message sur oom-killerindiquerait que votre système n'a pas assez de mémoire virtuelle, ce qui pourrait signifier que le swap n'est pas utilisé. S'agit-il d'un serveur virtualisé (et de quel type)?
Gilles 'SO- arrête d'être méchant'
Il n'y a pas d'entrées oom-killer dans le journal, juste des trucs comme segfault at 54 ip b7619ba8 sp bf9c3380 error 4je pense que c'est un problème matériel qui va être difficile à retrouver. Il s'agit d'un serveur physique avec deux processeurs Athlon MP 2000+ et 1,5 Go de RAM. Il fonctionne de manière assez stable mais segfaults lors des compilations.
joshperry
1
Eh bien, il s'est avéré que les ventilateurs du boîtier n'étaient pas branchés, ce qui causait des problèmes lorsque le serveur commençait à faire quoi que ce soit qui nécessite beaucoup de processeur, ce qui le faisait surchauffer.
joshperry

Réponses:

30

Est-ce Linux? Si oui, vous pouvez essayer ce qui suit:

# sysctl vm.swappiness=100

Et puis, utilisez un ou des programmes qui utilisent beaucoup de RAM ou écrivez une petite application qui mange de la mémoire vive. Ce qui suit fera cela (source: http://www.linuxatemyram.com/play.html ):

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char** argv) {
    int max = -1;
    int mb = 0;
    char* buffer;

    if(argc > 1)
        max = atoi(argv[1]);

    while((buffer=malloc(1024*1024)) != NULL && mb != max) {
        memset(buffer, 0, 1024*1024);
        mb++;
        printf("Allocated %d MB\n", mb);
        sleep(1);
    }      
return 0;
}

J'ai ajouté le sommeil (1) afin de vous donner plus de temps pour regarder les processus pendant qu'il engloutit le bélier et échange. Le tueur OOM devrait tuer cela une fois que vous êtes hors de RAM et SWAP pour donner au programme. Vous pouvez le compiler avec

gcc filename.c -o memeater

où filename.c est le fichier dans lequel vous enregistrez le programme ci-dessus. Ensuite, vous pouvez l'exécuter avec ./memeater.

Je ne ferais pas ça sur une machine de production.

Steven D
la source
Merci, cela a bien fonctionné pour engloutir la mémoire et commencer à échanger. Je suppose que mes erreurs de segmentation sont causées par autre chose ... probablement du matériel: /
joshperry
Pour linux, il pourrait être utile de commencer par écrire pour /proc/self/oom_score_adjs'assurer qu'il est la victime la plus probable du tueur OOM ...
Gert van den Berg
2
besoin d'inclure <unistd.h>pour dormir, sinon il lance un avertissementwarning: implicit declaration of function ‘sleep’;
Debanjan Basu