如何测试交换分区

jos*_*rry 22 linux swap

我正在尝试诊断无头服务器上的一些随机段错误,一件看起来很奇怪的事情是它们似乎只在内存压力下发生,而且我的交换大小不会超过 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
Run Code Online (Sandbox Code Playgroud)

Ste*_*n D 33

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

# sysctl vm.swappiness=100
Run Code Online (Sandbox Code Playgroud)

(您可能想先使用sysctl vm.swappiness以查看默认值,在我的系统上它是10

然后要么使用使用大量 RAM 的程序,要么编写一个只会占用 RAM 的小应用程序。以下将做到这一点(来源:Linux 磁盘缓存的实验和乐趣):

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include <unistd.h>


int main(int argc, char** argv) {
    int max = -1;
    int mb = 0;
    int multiplier = 1; // allocate 1 MB every time unit. Increase this to e.g.100 to allocate 100 MB every time unit.
    char* buffer;

    if(argc > 1)
        max = atoi(argv[1]);

    while((buffer=malloc(multiplier * 1024*1024)) != NULL && mb != max) {
        memset(buffer, 1, multiplier * 1024*1024);
        mb++;
        printf("Allocated %d MB\n", multiplier * mb);
        sleep(1); // time unit: 1 second
    }      
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

对 memset 行进行编码以使用 1s 而不是 0s 初始化块,因为 Linux 虚拟内存管理器可能足够聪明,否则实际上不会分配任何 RAM。我添加了 sleep(1) 是为了让您有更多时间观察进程,因为它吞噬了 ram 和交换。一旦您的 RAM 和 SWAP 用完以提供给程序,OOM 杀手就应该杀死它。你可以编译它

gcc filename.c -o memeater
Run Code Online (Sandbox Code Playgroud)

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

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

  • 需要包含 `&lt;unistd.h&gt;` 用于睡眠,否则会抛出警告 `warning: 函数 'sleep' 的隐式声明;` (2认同)