Jak przetestować partycję wymiany

23

Próbuję zdiagnozować niektóre przypadkowe awarie na bezgłowym serwerze i jedną z rzeczy, która wydaje się ciekawa, jest to, że zdarzają się one tylko pod presją pamięci, a mój rozmiar wymiany nie przekroczy 0.

Jak zmusić maszynę do zamiany, aby upewnić się, że działa poprawnie?

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
źródło
Czy w kern.logczasie segfault są jakieś wiadomości ? Komunikat o oom-killeroznacza, że ​​twój system nie ma wystarczającej ilości pamięci wirtualnej, co może oznaczać, że swap nie jest używany. Czy to zwirtualizowany serwer (i jakiego rodzaju)?
Gilles „SO- przestań być zły”
W dzienniku nie ma wpisów o-zabójcy, tylko takie rzeczy, jak segfault at 54 ip b7619ba8 sp bf9c3380 error 4myślę, że jest to problem sprzętowy, który będzie trudny do wyśledzenia. Jest to fizyczny serwer z dwoma procesorami Athlon MP 2000+ i 1,5 GB pamięci RAM. Działa dość stabilnie, ale nie działa poprawnie podczas kompilacji.
joshperry
1
Okazało się, że wentylatory obudowy nie zostały podłączone, co powodowało problemy, gdy serwer zaczął robić wszystko, co wymagało intensywnego procesora, powodując jego przegrzanie.
joshperry

Odpowiedzi:

30

Czy to jest linux? Jeśli tak, możesz spróbować:

# sysctl vm.swappiness=100

A następnie albo użyj programu (programów), który wykorzystuje dużo pamięci RAM, albo napisz małą aplikację, która po prostu zjada RAM. Zrobią to (źródło: 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;
}

Dodałem sleep (1), aby dać ci więcej czasu na obserwowanie procesów, gdy pochłania barana i zamiany. Zabójca OOM powinien go zabić, gdy skończy Ci się pamięć RAM i SWAP, aby dać programowi. Możesz to skompilować

gcc filename.c -o memeater

gdzie nazwa_pliku.c to plik, w którym zapisałeś powyższy program. Następnie możesz go uruchomić za pomocą ./memeater.

Nie zrobiłbym tego na maszynie produkcyjnej.

Steven D.
źródło
Dzięki, że to zadziałało, by pożreć pamięć i zacząć wymieniać. Chyba moje segfault są spowodowane przez coś innego ... prawdopodobnie sprzęt: /
joshperry
W przypadku Linuksa warto zacząć od pisania, aby /proc/self/oom_score_adjupewnić się, że jest to najbardziej prawdopodobna ofiara zabójcy OOM ...
Gert van den Berg
2
trzeba dołączyć <unistd.h>do snu, w przeciwnym razie generuje ostrzeżeniewarning: implicit declaration of function ‘sleep’;
Debanjan Basu