web-dev-qa-db-ja.com

空きRAMがある場合にスワップを空にする方法は?

RAMを集中的に使用するアプリ(VirtualBoxを2GBのRAMに設定)を開くと、その時点で開いている他の内容に応じて、通常はいくつかのスワップスペースが使用されます。

ただし、その最後のアプリケーションを終了すると、2GBのRAMは解放されますが、同じスワップ領域の使用は残ります。

たとえば、VirtualBoxを閉じてから約2時間後、1.6GBの空きRAMがあり、まだ770MBのスワップがあります。

Ubuntuにそのスワップの使用を停止し、RAMの使用に戻すように指示するにはどうすればよいですか?

312
jfoucher

スワップが割り当てられているからといって、それが「使用されている」という意味ではありません。システムモニターや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
168
popey

Ubuntuの基盤となるLinuxカーネルは、必要に応じてこれらのページをディスクからRAMに自動的に「スワップイン」します。したがって、一般的には自然に発生させます。

ただし、強制的に実行する必要があると本当に感じた場合(後でシステムが応答することを知りたいシナリオを見ることができます)、スワップを一時的に無効にしてから再度有効にすることができます

Sudo swapoff -a
Sudo swapon -a

または、単一の行として

swapoff -a; swapon -a

特にRAMがすでに少ない場合は、システムを不安定にする可能性があるため、これを行うには注意してください。

418
SpamapS

「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およびすべてのシステムがスムーズに実行されています!

buntu SwapFAQから

Swappinessパラメータは、カーネルがプロセスを物理メモリからスワップディスクに移動する傾向を制御します。ディスクはRAMよりはるかに遅いため、プロセスがメモリから積極的に移動されすぎると、システムとアプリケーションの応答時間が遅くなる可能性があります。

  1. swappinessの値は0〜100です。
  2. swappiness = 0は、物理メモリからのプロセスのスワップを可能な限り回避するようカーネルに指示します
  3. 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に設定するには:

  1. sudoedit /etc/sysctl.conf
  2. この行を追加vm.swappiness = 0
  3. Sudo shutdown -r now#システムを再起動

*カーネルバージョン3.5+では、swappinessを0に設定すると完全にオフになります。最低のswapinessアルゴリズムが必要な場合は、1の設定をお勧めします。ソース: https://www.percona.com/blog/2014/04/28/oom-relation-vm-swappiness0-new-kernel/

144
Elijah Lynn

空のスワップは、低速のディスクと限られた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
53
Scott Severance

数日間 swappiness をいじくり回した後、カーネルは独自のデバイスに任せるべきだという結論に達しました。それは何をしているかを知っており、最高の体験を提供するために最適化されています。

そのディスクを元に戻したいという本当に正当な理由がない限り、そのままにしておきます。

26
Erigami

スワップ領域が占有されている場合、パフォーマンスには影響しません。パフォーマンスのペナルティは、スワップに出入りするものだけです。何もスワップイン/スワップアウトされていない場合、何も心配する必要はありません。

0
Rory