Come testare la partizione di swap


23

Sto cercando di diagnosticare alcuni segfault casuali su un server senza testa e una cosa che sembra curiosa è che sembrano accadere solo sotto pressione della memoria e la mia dimensione di scambio non supererà lo 0.

Come posso forzare lo scambio della mia macchina per assicurarmi che funzioni correttamente?

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

Ci sono dei messaggi kern.logal momento dei segfault? Un messaggio oom-killerindica che il tuo sistema non ha memoria virtuale sufficiente, il che potrebbe significare che lo swap non viene utilizzato. È un server virtualizzato (e che tipo)?
Gilles 'SO- smetti di essere malvagio' il

Nel registro non ci sono voci di killer oom, ma solo cose come segfault at 54 ip b7619ba8 sp bf9c3380 error 4sto pensando che sia un problema hardware che sarà difficile da rintracciare. Questo è un server fisico con doppio processore Athlon MP 2000+ e 1,5 GB di RAM. Funziona in modo abbastanza stabile ma segfault durante le compilazioni.
joshperry,

1
Bene, si è scoperto che i fan del case non erano collegati, il che stava causando problemi quando il server avrebbe iniziato a fare qualsiasi cosa intensiva per il processore causandone il surriscaldamento.
joshperry,

Risposte:


30

Questo è Linux? In tal caso, puoi provare quanto segue:

# sysctl vm.swappiness=100

E poi usa un programma (i) che usa molta RAM o scrivi una piccola applicazione che consuma semplicemente ram. Lo faranno (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;
}

Ho aggiunto sleep (1) per darti più tempo per guardare i processi mentre divorano ram e swap. Il killer OOM dovrebbe uccidere questo una volta che hai esaurito la RAM e SWAP per dare al programma. Puoi compilarlo con

gcc filename.c -o memeater

dove nomefile.c è il file in cui si salva il programma sopra. Quindi è possibile eseguirlo con ./memeater.

Non lo farei su una macchina di produzione.


Grazie, ha funzionato bene per inghiottire la memoria e iniziare a scambiare. Immagino che i miei segfault siano causati da qualcos'altro ... probabilmente hardware: /
joshperry

Per Linux, potrebbe essere utile iniziare scrivendo per /proc/self/oom_score_adjassicurarsi che sia la vittima del killer OOM più probabile ...
Gert van den Berg,

2
bisogno di includere <unistd.h>per dormire, altrimenti getta un avvertimentowarning: implicit declaration of function ‘sleep’;
Debanjan Basu
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.