RAMを集中的に使用するアプリ(VirtualBoxを2GBのRAMに設定)を開くと、その時点で開いている他の内容に応じて、通常はいくつかのスワップスペースが使用されます。
ただし、その最後のアプリケーションを終了すると、2GBのRAMは解放されますが、同じスワップ領域の使用は残ります。
たとえば、VirtualBoxを閉じてから約2時間後、1.6GBの空きRAMがあり、まだ770MBのスワップがあります。
Ubuntuにそのスワップの使用を停止し、RAMの使用に戻すように指示するにはどうすればよいですか?
スワップが割り当てられているからといって、それが「使用されている」という意味ではありません。システムモニターやtopなどのプログラムは、割り当てられているスワップ領域の一部(例では770MB)を表示しますが、これはシステムがアクティブにスワップイン/アウトしていることを意味しません。
スワップイン/アウトの有無を調べるには、vmstat
コマンドを使用できます。落ち着いてsi
(swapin)およびso
(swapout)の列を確認するには、数秒実行したままにします。何も起きていない場合、心配する理由はありません。
実行中のvmstat 1
の出力は、私のマシンがまったくスワップしていないことがわかります。
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 78588 230788 9596 72196 0 0 0 0 543 652 12 6 78 0
0 0 78588 230780 9596 72196 0 0 0 0 531 410 1 0 99 0
0 0 78588 230796 9596 72196 0 0 0 0 300 335 1 1 97 0
1 0 78588 230788 9608 72224 0 0 40 0 737 762 4 4 84 8
5 0 78588 230788 9608 72224 0 0 0 0 415 385 9 3 84 0
0 0 78588 230540 9616 72224 0 0 0 44 611 556 55 5 31 0
0 0 78588 230532 9616 72224 0 0 0 0 574 662 1 6 89 0
しかし、ここtop
では、スワップスペースが割り当てられていることがわかります。
Mem: 475236k total, 245076k used, 230160k free, 9720k buffers
Swap: 491512k total, 78588k used, 412924k free, 72476k cached
Ubuntuの基盤となるLinuxカーネルは、必要に応じてこれらのページをディスクからRAMに自動的に「スワップイン」します。したがって、一般的には自然に発生させます。
ただし、強制的に実行する必要があると本当に感じた場合(後でシステムが応答することを知りたいシナリオを見ることができます)、スワップを一時的に無効にしてから再度有効にすることができます
Sudo swapoff -a
Sudo swapon -a
または、単一の行として
swapoff -a; swapon -a
特にRAMがすでに少ない場合は、システムを不安定にする可能性があるため、これを行うには注意してください。
「swappiness」の値をデフォルトの60から設定することもできます。これにより、スワップは最初からそれほど大きくなりません。推奨値が10であるのに配送のデフォルトが60に設定されているのは困惑します。 buntu SwapFAQから :
Ubuntuのデフォルト設定はswappiness = 60です。 swappinessのデフォルト値を減らすと、一般的なUbuntuデスクトップインストールの全体的なパフォーマンスがおそらく向上します。 swappiness = 10の値を推奨しますが、自由に実験してください。
この値を10または0に変更することにより、低速ドライブを搭載した古いシステムに大幅で知覚可能な速度向上を追加できます。この値を0に設定しても、Linuxカーネル3.4以前ではスワップはオフになりませんが、3.5 +ではオフになります。そのため、最低の設定のままにする場合は値1を使用します。
ディスクにヒットするものはRAMより遅いため、これを0に設定しない理由はありません。 8個の仮想コア、高速SSD、8 GBのメモリがあり、スワップが0に設定されています。この時点で、3つの仮想マシンが実行されており、メモリ使用量は7.7 GBの7.1、使用済みスワップは576 KB 952MBおよびすべてのシステムがスムーズに実行されています!
Swappinessパラメータは、カーネルがプロセスを物理メモリからスワップディスクに移動する傾向を制御します。ディスクはRAMよりはるかに遅いため、プロセスがメモリから積極的に移動されすぎると、システムとアプリケーションの応答時間が遅くなる可能性があります。
- swappinessの値は0〜100です。
- swappiness = 0は、物理メモリからのプロセスのスワップを可能な限り回避するようカーネルに指示します
- swappiness = 100は、カーネルにプロセスを物理メモリから積極的にスワップし、スワップキャッシュに移動するように指示します。
以下は、swappinessをチェックし、swapを空にし、swappinessを0に変更するための基本的な手順です:
Swappiness値を確認するには:
cat /proc/sys/vm/swappiness
スワップを一時的に0に設定するには( SpamapSの提案どおり ):
これにより、スワップが空になり、すべてのスワップがメモリに戻されます。最初に、gnome-system-monitorのリソースタブを表示して、十分なメモリがあることを確認します。空きメモリは、使用されているスワップよりも大きくなければなりません。このプロセスには時間がかかる場合があります。gnome-system-monitorを使用して進行状況を監視および確認します。
Sudo swapoff --all
新しい値を0に設定するには:
Sudo sysctl vm.swappiness=0
スワップをオンに戻すには:
Sudo swapon --all
Swappinessを永続的に0に設定するには:
sudoedit /etc/sysctl.conf
vm.swappiness = 0
Sudo shutdown -r now
#システムを再起動*カーネルバージョン3.5+では、swappinessを0に設定すると完全にオフになります。最低のswapinessアルゴリズムが必要な場合は、1の設定をお勧めします。ソース: https://www.percona.com/blog/2014/04/28/oom-relation-vm-swappiness0-new-kernel/
空のスワップは、低速のディスクと限られたRAMを搭載したシステムで非常に役立つことがわかりました。もちろん、既に述べたように、これを行う方法はSudo swapoff -a; Sudo swapon -a
を実行することです。ここでの問題は、RAMが不十分な場合、あらゆる種類の問題が発生することです。
私はtoggle_swap
と呼ぶスクリプトを書きましたが、これは過去数年間私のために働いてきました。実際にスワップを無効にする前に、十分な空きRAMをチェックします。ここにあります:
#!/bin/bash
free_data="$(free)"
mem_data="$(echo "$free_data" | grep 'Mem:')"
free_mem="$(echo "$mem_data" | awk '{print $4}')"
buffers="$(echo "$mem_data" | awk '{print $6}')"
cache="$(echo "$mem_data" | awk '{print $7}')"
total_free=$((free_mem + buffers + cache))
used_swap="$(echo "$free_data" | grep 'Swap:' | awk '{print $3}')"
echo -e "Free memory:\t$total_free kB ($((total_free / 1024)) MB)\nUsed swap:\t$used_swap kB ($((used_swap / 1024)) MB)"
if [[ $used_swap -eq 0 ]]; then
echo "Congratulations! No swap is in use."
Elif [[ $used_swap -lt $total_free ]]; then
echo "Freeing swap..."
Sudo swapoff -a
Sudo swapon -a
else
echo "Not enough free memory. Exiting."
exit 1
fi
数日間 swappiness をいじくり回した後、カーネルは独自のデバイスに任せるべきだという結論に達しました。それは何をしているかを知っており、最高の体験を提供するために最適化されています。
そのディスクを元に戻したいという本当に正当な理由がない限り、そのままにしておきます。
スワップ領域が占有されている場合、パフォーマンスには影響しません。パフォーマンスのペナルティは、スワップに出入りするものだけです。何もスワップイン/スワップアウトされていない場合、何も心配する必要はありません。