Cách kiểm tra phân vùng trao đổi


23

Tôi đang cố gắng chẩn đoán một số phân tách ngẫu nhiên trên một máy chủ không đầu và một điều có vẻ tò mò là chúng dường như chỉ xảy ra dưới áp lực bộ nhớ và kích thước hoán đổi của tôi sẽ không vượt quá 0.

Làm cách nào tôi có thể buộc máy của mình hoán đổi để đảm bảo rằng nó hoạt động tốt?

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

Có bất kỳ tin nhắn kern.logtại thời điểm của segfaults? Một thông báo về oom-killersẽ chỉ ra rằng hệ thống của bạn không có đủ bộ nhớ ảo, điều đó có nghĩa là trao đổi không được sử dụng. Đây có phải là một máy chủ ảo hóa (và loại nào)?
Gilles 'SO- ngừng trở nên xấu xa'

Không có mục sát thủ nào trong nhật ký chỉ là những thứ như segfault at 54 ip b7619ba8 sp bf9c3380 error 4tôi nghĩ đó là vấn đề phần cứng sẽ là một nỗi đau để theo dõi. Đây là một máy chủ vật lý với bộ xử lý Athlon MP 2000+ kép và 1,5 GB RAM. Nó chạy khá ổn định nhưng segfaults trong quá trình biên dịch.
joshperry

1
Chà, hóa ra là những chiếc quạt máy không được cắm vào, điều này gây ra sự cố khi máy chủ sẽ bắt đầu làm bất cứ thứ gì xử lý chuyên sâu khiến nó bị quá nóng.
joshperry

Câu trả lời:


30

Đây có phải là linux không? Nếu vậy bạn có thể thử như sau:

# sysctl vm.swappiness=100

Và sau đó sử dụng một chương trình sử dụng nhiều RAM hoặc viết một ứng dụng nhỏ vừa ăn ram. Sau đây sẽ làm điều đó (nguồn: 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;
}

Tôi đã thêm chế độ ngủ (1) để cho bạn thêm thời gian để xem các quy trình khi nó ngấu nghiến ram và trao đổi. Kẻ giết người OOM sẽ giết nó ngay khi bạn hết RAM và SWAP để cung cấp cho chương trình. Bạn có thể biên dịch nó với

gcc filename.c -o memeater

trong đó filename.c là tệp bạn lưu chương trình trên. Sau đó, bạn có thể chạy nó với ./memeater.

Tôi sẽ không làm điều này trên một máy sản xuất.


Cảm ơn, điều đó đã làm việc tốt để ngấu nghiến bộ nhớ và bắt đầu trao đổi. Tôi đoán sự phân biệt của tôi là do một thứ khác ... có lẽ là phần cứng: /
joshperry

Đối với linux, có thể hữu ích khi bắt đầu bằng cách viết để /proc/self/oom_score_adjđảm bảo rằng đó là nạn nhân giết người OOM có khả năng nhất ...
Gert van den Berg

2
cần bao gồm <unistd.h>cho giấc ngủ, nếu không nó sẽ đưa ra một cảnh báowarning: implicit declaration of function ‘sleep’;
Debanjan Basu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.