Cara menguji partisi swap

23

Saya mencoba mendiagnosis beberapa segfault acak pada server tanpa kepala dan satu hal yang tampaknya aneh adalah bahwa sepertinya hanya terjadi di bawah tekanan memori dan ukuran swap saya tidak akan di atas 0.

Bagaimana saya bisa memaksa mesin saya untuk bertukar untuk memastikan bahwa itu berfungsi dengan baik?

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
sumber
Apakah ada pesan kern.logpada saat segfaults? Pesan tentang oom-killerakan menunjukkan bahwa sistem Anda tidak memiliki cukup memori virtual, yang bisa berarti swap tidak digunakan. Apakah ini server yang tervirtualisasi (dan jenis apa)?
Gilles 'SANGAT berhenti menjadi jahat'
Tidak ada entri oom-killer di log hanya hal-hal seperti segfault at 54 ip b7619ba8 sp bf9c3380 error 4saya pikir itu masalah perangkat keras yang akan sulit untuk dilacak. Ini adalah server fisik dengan prosesor Athlon MP 2000+ ganda dan RAM 1,5GB. Ini berjalan cukup stabil tetapi segfault selama kompilasi.
joshperry
1
Nah, ternyata case fans tidak terhubung di mana yang menyebabkan masalah ketika server akan mulai melakukan sesuatu yang intensif prosesor menyebabkannya menjadi terlalu panas.
joshperry

Jawaban:

30

Apakah ini linux? Jika demikian, Anda dapat mencoba yang berikut:

# sysctl vm.swappiness=100

Dan kemudian menggunakan program yang menggunakan banyak RAM atau menulis aplikasi kecil yang hanya memakan ram. Berikut ini akan melakukan itu (sumber: 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;
}

Saya menambahkan tidur (1) untuk memberi Anda lebih banyak waktu untuk menonton proses karena melahap ram dan swap. Pembunuh OOM harus membunuh ini setelah Anda kehabisan RAM dan SWAP untuk diberikan kepada program. Anda dapat mengompilasinya dengan

gcc filename.c -o memeater

di mana filename.c adalah file tempat Anda menyimpan program di atas. Kemudian Anda dapat menjalankannya dengan ./memeater.

Saya tidak akan melakukan ini pada mesin produksi.

Steven D
sumber
Terima kasih, itu bekerja dengan baik untuk melahap memori dan mulai bertukar. Saya kira segfaults saya disebabkan oleh sesuatu yang lain ... mungkin perangkat keras: /
joshperry
Untuk linux, mungkin berguna untuk memulai dengan menulis untuk /proc/self/oom_score_adjmemastikan bahwa itu adalah korban OOM-killer yang paling mungkin ...
Gert van den Berg
2
perlu termasuk <unistd.h>untuk tidur, jika tidak itu akan memberikan peringatanwarning: implicit declaration of function ‘sleep’;
Debanjan Basu