Como testar a partição de troca

23

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 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
joshperry
fonte
Existem mensagens no kern.logmomento dos segfaults? Uma mensagem sobre oom-killerindicaria que seu sistema não possui memória virtual suficiente, o que pode significar que a troca não está sendo usada. Este é um servidor virtualizado (e de que tipo)?
Gilles 'SO- stop be evil'
Não há entradas matadoras no log, apenas coisas como segfault at 54 ip b7619ba8 sp bf9c3380 error 4eu estou pensando que é um problema de hardware que será difícil de rastrear. Este é um servidor físico com dois processadores Athlon MP 2000+ e 1,5 GB de RAM. Ele é executado de forma bastante estável, mas segfaults durante compilações.
Joshperry
1
Bem, verificou-se que os ventiladores do gabinete não estavam conectados, o que estava causando problemas quando o servidor começava a fazer qualquer coisa intensiva no processador, causando superaquecimento.
Joshperry

Respostas:

30

É este linux? Nesse caso, você pode tentar o seguinte:

# sysctl vm.swappiness=100

E então use um programa que use muita memória RAM ou grave um aplicativo pequeno que consome memória RAM. O seguinte será feito (fonte: 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;
}

Eu adicionei o sono (1) para dar mais tempo para assistir aos processos, pois ele devora ram e swap. O assassino do OOM deve matar isso assim que você estiver sem memória 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.

Steven D
fonte
Obrigado, isso funcionou bem para devorar memória e começar a trocar. Eu acho que meus segfaults são causados ​​por outra coisa ... provavelmente hardware: /
joshperry
Para Linux, pode ser útil começar por escrito, /proc/self/oom_score_adjpara garantir que ele é o mais provável vítima OOM-killer ...
Gert van den Berg
2
precisa incluir <unistd.h>para dormir, caso contrário, ele lança um avisowarning: implicit declaration of function ‘sleep’;
Debanjan Basu