ti-enxame.com

Como testar a partição de troca

Estou tentando diagnosticar alguns segfaults aleatórios em um servidor sem cabeça e uma coisa que parece curiosa é que eles parecem acontecer apenas sob pressão de memória e meu tamanho de troca não ultrapassa 0.

Como posso forçar minha máquina a trocar para garantir que ela esteja funcionando corretamente?

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

Isso é Linux? Nesse caso, você pode tentar o seguinte:

# sysctl vm.swappiness=100

E, em seguida, use um programa que use muito RAM ou escreva um aplicativo pequeno que consome apenas memória RAM. O seguinte será feito (fonte: experimentos e diversão com cache de disco do 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;
}

Codifiquei a linha memset para inicializar blocos com 1s em vez de 0s, porque o gerenciador de memória virtual do Linux pode ser inteligente o suficiente para não alocar realmente RAM caso contrário. Adicionei o sleep (1) para você terá mais tempo para assistir aos processos, pois ele devora ram e swap. O assassino do OOM deve matar isso assim que estiver fora de RAM e SWAP para dar ao programa. Você pode compilá-lo com

gcc filename.c -o memeater

onde filename.c é o arquivo em que você salva o programa acima. Em seguida, você pode executá-lo com ./memeater.

Eu não faria isso em uma máquina de produção.

31
Steven D