Cómo probar la partición de intercambio

23

Estoy tratando de diagnosticar algunos fallos aleatorios en un servidor sin cabeza y una cosa que parece curiosa es que solo parecen ocurrir bajo presión de memoria y mi tamaño de intercambio no superará 0.

¿Cómo puedo forzar a mi máquina a cambiar para asegurarse de que funciona correctamente?

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
fuente
¿Hay algún mensaje en kern.logel momento de las segfaults? Un mensaje sobre oom-killerindicaría que su sistema no tiene suficiente memoria virtual, lo que podría significar que no se está utilizando el intercambio. ¿Es este un servidor virtualizado (y de qué tipo)?
Gilles 'SO- deja de ser malvado'
No hay entradas de Oom-Killer en el registro, solo cosas como segfault at 54 ip b7619ba8 sp bf9c3380 error 4si estuviera pensando que es un problema de hardware que será difícil de localizar. Este es un servidor físico con procesadores duales Athlon MP 2000+ y 1.5GB de RAM. Se ejecuta de manera bastante estable pero se daña durante las compilaciones.
joshperry
1
Bueno, resultó que los ventiladores de la carcasa no estaban conectados, lo que estaba causando problemas cuando el servidor comenzaría a hacer cualquier cosa que requiera un procesador intensivo, lo que provocaría un sobrecalentamiento.
joshperry

Respuestas:

30

¿Es esto Linux? Si es así, puede intentar lo siguiente:

# sysctl vm.swappiness=100

Y luego use uno o varios programas que usen mucha RAM o escriba una pequeña aplicación que solo consume RAM. Lo siguiente hará eso (fuente: 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;
}

Agregué el modo de suspensión (1) para darle más tiempo para ver los procesos a medida que engulle ram e intercambia. El asesino OOM debería matar esto una vez que se haya quedado sin RAM y SWAP para dar al programa. Puedes compilarlo con

gcc filename.c -o memeater

donde filename.c es el archivo en el que guarda el programa anterior. Luego puede ejecutarlo con ./memeater.

No haría esto en una máquina de producción.

Steven D
fuente
Gracias, funcionó bien para engullir memoria y comenzar a intercambiar. Supongo que mis segfaults son causados ​​por algo más ... probablemente hardware: /
joshperry
Para Linux, podría ser útil comenzar escribiendo para /proc/self/oom_score_adjasegurarse de que sea la víctima más probable del asesino OOM ...
Gert van den Berg
2
debe incluir <unistd.h>para dormir, de lo contrario arroja una advertenciawarning: implicit declaration of function ‘sleep’;
Debanjan Basu