Linux

GNU/Linux 交換塊系統

  • May 4, 2020

我在 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

編輯:

我通過刪除 24 GB 並嘗試僅使用 8 GB 來測試問題是否是由於 32 GB RAM - 我看到了相同的行為。

我還可以通過在 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?

升級後問題消失:

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

並不是說是這個核心升級修復了它。

檢查您在交換塊設備上使用的 I/O 調度程序,嘗試更改它以獲得更好的結果。

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

引用自:https://unix.stackexchange.com/questions/101055