如何测试交换分区


23

我正在尝试诊断无头服务器上的一些随机段错误,似乎奇怪的是,它们似乎仅在内存压力下发生,并且我的交换大小不会超过0。

如何强制我的机器交换以确保其正常工作?

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

节段发生时是否有任何消息kern.log?关于的消息oom-killer将表明您的系统没有足够的虚拟内存,这可能意味着未使用交换。这是虚拟服务器(和哪种服务器)?
吉尔(Gilles)“所以,别再邪恶了”,2010年

日志中没有oom-killer条目,就像segfault at 54 ip b7619ba8 sp bf9c3380 error 4我认为这是一个硬件问题,要跟踪它会很麻烦。这是一台具有双Athlon MP 2000+处理器和1.5GB RAM的物理服务器。它运行稳定,但在编译过程中出现段错误。
joshperry

1
好吧,事实证明,当服务器开始执行任何处理器密集型操作而导致服务器过热时,机箱风扇未插入的情况会引起问题。
joshperry 2010年

Answers:


30

这是Linux吗?如果是这样,您可以尝试以下操作:

# sysctl vm.swappiness=100

然后,要么使用占用大量RAM的程序,要么编写一个占用RAM的小型应用程序。下面将执行此操作(源: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;
}

我添加了sleep(1)以便给您更多时间观看进程,因为它吞噬了ram和swap。一旦您用完RAM和SWAP交给程序,OOM杀手应该杀死它。您可以使用

gcc filename.c -o memeater

其中filename.c是保存上述程序的文件。然后,您可以使用./memeater运行它。

我不会在生产机器上这样做。


谢谢,它很好地吞噬了内存并开始交换。我猜我的segfaults是由其他原因引起的……可能是硬件:/
joshperry

对于linux来说,首先进行编写以/proc/self/oom_score_adj确保它是最有可能成为OOM杀手的受害者的做法可能会很有用...
Gert van den Berg

2
需要包括<unistd.h>睡眠,否则会引发警告warning: implicit declaration of function ‘sleep’;
Debanjan Basu
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.