GNU/Linux 交换块系统

GNU/Linux 交换块系统

我在 4 MB RAM 到 512 GB RAM 的系统上使用过 GNU/Linux。当它们开始交换时,大多数时候您仍然可以登录并终止有问题的进程 - 您只需多 100-1000 倍的耐心即可。

在我的新 32 GB 系统上发生了变化: 当开始交换时它会阻塞。有时磁盘活动已满,但有时没有磁盘活动。

为了检查可能出现的问题,我编写了这个程序。这个想法是:

1 grab 3% of the memory free right now
2 if that caused swap to increase: stop
3 keep the chunk used for 30 seconds by forking off
4 goto 1

-

#!/usr/bin/perl

sub freekb {
    my $free = `free|grep buffers/cache`;
    my @a=split / +/,$free;
    return $a[3];
}

sub swapkb {
    my $swap = `free|grep Swap:`;
    my @a=split / +/,$swap;
    return $a[2];
}


my $swap = swapkb();
my $lastswap = $swap;
my $free;
while($lastswap >= $swap) {
    print "$swap $free";
    $lastswap = $swap;
    $swap = swapkb();
    $free = freekb();
    my $used_mem = "x"x(1024 * $free * 0.03);
    if(not fork()) {
    sleep 30;
    exit();
    }
}
print "Swap increased $swap $lastswap\n";

永远运行该程序应该使系统处于交换的限制,但只获取最少量的交换,并且执行速度非常慢(即一次最多几MB)。

如果我运行:

forever free | stdbuf -o0 timestamp > freelog

我应该看到交换每秒都在缓慢上升。 (永远和时间戳https://github.com/ole-tange/tangetools)。

但这不是我看到的行为:我看到交换在跳跃中增加,并且系统在这些跳跃期间完全被阻止。这里系统被阻塞 30 秒,交换空间使用量增加 1 GB:

secs
169.527 Swap:     18440184     154184   18286000
170.531 Swap:     18440184     154184   18286000
200.630 Swap:     18440184    1134240   17305944
210.259 Swap:     18440184    1076228   17363956

封锁:21秒。交换增加 2000 MB:

307.773 Swap:     18440184     581324   17858860
308.799 Swap:     18440184     597676   17842508
330.103 Swap:     18440184    2503020   15937164
331.106 Swap:     18440184    2502936   15937248

封锁:20秒。交换增加 2200 MB:

751.283 Swap:     18440184     885288   17554896
752.286 Swap:     18440184     911676   17528508
772.331 Swap:     18440184    3193532   15246652
773.333 Swap:     18440184    1404540   17035644

封锁:37秒。交换增加 2400 MB:

904.068 Swap:     18440184     613108   17827076
905.072 Swap:     18440184     610368   17829816
942.424 Swap:     18440184    3014668   15425516
942.610 Swap:     18440184    2073580   16366604

这已经够糟糕了,但更糟糕的是系统有时会完全停止响应——即使我等待了几个小时。我感觉这与交换问题有关,但我不能确定。

我的第一个想法是将 /proc/sys/vm/swappiness 从 60 调整为 0 或 100,只是为了看看这是否有任何效果。 0 没有影响,但 100 确实导致问题出现的频率降低。

如何才能让系统不阻塞这么长时间呢?

当少于 10 MB 就足够时,为什么它决定换出 1-3 GB?

系统信息:

$ uname -a
Linux aspire 3.8.0-32-generic #47-Ubuntu SMP Tue Oct 1 22:35:23 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

编辑:

我测试了问题是否是由于 32 GB RAM 引起的,方法是删除 24 GB 并尝试仅使用 8 GB - 我看到了相同的行为。

我还可以通过在 VirtualBox 中安装 GNU/Linux Mint 15 来重现交换行为(尽管不是冻结)。

我无法在 8 GB 笔记本电脑上重现该问题:上面的脚本可以完美地运行几个小时 - 交换出几兆字节,但永远不会是完整的千兆字节。所以我比较了两个系统上 /proc/sys/vm/* 中的所有变量:它们完全相同。这让我相信问题出在其他地方。笔记本电脑运行不同的内核:

Linux hk 3.2.0-55-generic #85-Ubuntu SMP Wed Oct 2 12:29:27 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

也许VM系统中的某些内容从3.2.0更改为3.8.0?

答案1

检查您在交换块设备上使用哪个 I/O 调度程序,尝试更改它以获得更好的结果。

http://andrux-and-me.blogspot.nl/2013/05/io-schedulers-and-performance.html

答案2

升级到以下版本后问题消失:

Linux aspire 3.16.0-31-lowlatency #43~14.04.1-Ubuntu SMP PREEMPT Tue Mar 10 20:41:36 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

并没有考虑到它是内核升级,修复了它。

相关内容