私は4MB RAMから512GB 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
毎秒Exchangeがゆっくりと上昇していく様子がわかります。 (永遠にタイムスタンプ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秒。スワップは2000MBを追加します。
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秒。スワップに2200MBを追加:
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秒。スワップに2400MBを追加:
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は問題が頻繁に発生しないようにします。
このように長い間システムがブロックされるのを防ぐにはどうすればよいですか?
10MB未満であれば、1〜3GBを交換することを決めたのはなぜですか?
システムメッセージ:
$ 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をインストールしてスワップ動作(停止しない)を再現することができました。
8GBノートパソコンでは問題を再現できません。上記のスクリプトは数時間完全に実行されます。数メガバイトを交換しますが、ギガバイト全体は交換しません。そのため、両方のシステムの/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
そのような点を考慮せずにこれカーネルのアップグレードで問題が修正されました。