web-dev-qa-db-fra.com

Comment tester la partition de swap

J'essaie de diagnostiquer des segfaults aléatoires sur un serveur sans tête et une chose qui semble curieuse est qu'elles ne semblent pas se produire sous pression de mémoire et que ma taille d'échange ne deviendra pas supérieure à 0.

Comment puis-je forcer ma machine à échanger pour vous assurer que cela 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
23
joshperry

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

# sysctl vm.swappiness=100

Puis utilisez un programme qui utilise beaucoup de RAM ou écrivez une petite application qui mange simplement RAM. Ce qui suit le fera (source: expériences et amusantes avec Le cache de disque Linux ):

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

#include <unistd.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, 1, 1024*1024);
        mb++;
        printf("Allocated %d MB\n", mb);
        sleep(1);
    }      
    return 0;
}

Codé la ligne MEMSET pour initialiser les blocs avec 1S plutôt que 0s, car le gestionnaire de mémoire virtuel Linux peut être suffisamment intelligent pour ne pas réellement allouer RAM sinon. J'ai ajouté le sommeil (1) afin de vous donner plus de temps pour regarder les processus car il gobbles bélier et échanger. Le tueur OMM devrait tuer cela une fois que vous êtes sorti de RAM et échangeez-vous pour donner au programme. Vous pouvez le compiler avec

gcc filename.c -o memeater

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

Je ne ferais pas cela sur une machine de production.

31
Steven D