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


314

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

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

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

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


最も簡単なことは、デバイス再起動し、 RAMに対処する時間を節約し、ラップトップの電力とCPU温度を節約する無料のRAM
Mohamed Slama

5
コンピューター上のすべてのものを再配置するのにかかる時間はそれよりも短いという大きな仮定。
-jQwierdy

少なくとも、Ubuntu 16.04は、必要になった後もスワップを使用し続けることができるため、不要になったとしてもスワップファイルに依存することで、システムを大幅に遅くすることができます。したがって、手動による介入は有用です。再起動は常にオプションとは限りません。
マット

回答:


167

スワップが割り当てられているからといって、それが「使用されている」という意味ではありません。システムモニターやtopなどのプログラムは、割り当てられているスワップ領域の一部(例では770MB)を表示しますが、これはシステムがアクティブにスワップイン/アウトしていることを意味しません。

何かがスワップイン/スワップアウトしているかどうかを調べるには、vmstatコマンドを使用できます。数秒実行したままにして、落ち着いてsi(スワピン)およびso(スワップアウト)列を確認します。何も起きていない場合、心配する理由はありません。

以下はrunningの出力で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

32
「心配する必要はありません」、スワップアウトされたアプリケーションを使用し続けるまで。それからすべての地獄は緩む。
törzsmókus

207
この投稿は質問に答えません。
emchristiansen 14年

18
質問の前提は誤解に基づいています。この投稿は誤解に対処します。
ポピー14年

30
誤解はありませんが、「使用」の意味について意見の相違があります。元の質問は「使用済み」で提示されているように見えますが、元の質問は「使用済み」を意味します。つまり、スワップアウトされたデータがあり、後でスワップインする必要がある場合があります。他の多くのメモリをスワップアウトするイベントの後にスワップをフラッシュしたい正当な理由は、基本的にユーザーが後で発生することがわかっているアクティブなスワップを先取りすることです(特に、後の「デスワップ」がディスクは他の理由で負荷がかかっています)。
drfrogsplat 14年

39
メモリを大量に消費するアプリケーションを実行した後、他のアプリケーションに切り替えると、おそらくスワップされているために応答しなくなります。可能な限り多くのデータをスワップ解除するようにシステムに指示する何らかの方法(コーヒーブレイクが続く)は、Alt + Tabを押すたびに20秒間待機するよりも優れています。
マークKコーワン14年

424

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

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

sudo swapoff -a
sudo swapon -a

または、単一行として

swapoff -a; swapon -a

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


8
それはうまくいきました、スワップはRAMにコピーされました。swapoffを実行する前に、少なくともRAMの空き容量として使用するスワップを確保する必要があると思いますか?
jfoucher

12
スワップはRAMにコピーされませんでした。単に無効になっただけです。これを行う前に、ボックスがスワップしていないことを確認する必要があります。その場合、カーネルはメモリが消えることを確認し、OOM-Killerはおそらくアプリケーションを任意に強制終了します。このようにスワップを「きれいにする」必要がある理由はありません。(他のコメントを参照):)
popey

51
実際、スワップは基本的にRAMにコピーされます。より正確には、スワップを無効にする前に、ページがディスクからRAMにスワップインされます。
SpamapS

14
ページは、何らかのプロセスで必要な場合にのみRAMにコピーされます。スワップされたページは既に終了したプロセスに属していることがあり、カーネルはこれらのページをすぐにスワップから削除することを気にしません。
ブルーノJCM

6
これは、スワップされたページをRAMに戻し、スワップメモリ​​を空にする方法であるため、正解であるはずです
アルフォンソヒメネス

144

「swappiness」値をデフォルトの60から設定することもできます。これにより、スワップが最初からそれほど大きくなることはありません。推奨値が10であるのに配送のデフォルトが60に設定されているのは困惑しています。Ubuntu 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およびすべてのシステムがスムーズに実行されています!

Ubuntu 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/


1
答えを更新して、swapinessを設定する永続的な方法を含めました。どのようにそれがそれほど賛成されたかはわかりません、私は誰もそれをテストしなかったと推測しています。
イライジャ・リン

1
この回答=>でswappinessを上より良い読書askubuntu.com/a/103916/11929
イライジャ・リン

3
作成者が最初に回答を投稿したときにこれが利用可能かどうかはわかりませんが、ubuntuサーバーのインストールには「60」のswappiness値が設定されています。 help.ubuntu.com/community/...
フリト

1
この設定は、スワップのサイズを制御するのに非常に効果的です。私のシステムには16G RAMと16Gスワップがあります。VMを実行しているときに、一部のアプリケーションがスワップアウトされることがあります。VMを閉じる​​と、RAMの使用量は低下しますが、スワップの使用量は同じままであり、アプリケーションを変更するときにシステムが遅れます。スワップ性を変更すると、パフォーマンスが向上しました。
カパッド

1
これは本当に受け入れられた答えであるべきです。問題の完全な説明とその解決策、およびスワップメモリ​​を保持するリンクと解決策ですが、そもそもそれを制御下に置くのに役立ちます。すごいもの。ありがとう。:)
Jack_Hu

53

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

こんなに素晴らしいものを探していました。少し安全にするために、数字とパーセンテージを提示してから、質問することができます。
アテリオン

2
コードを更新し、gist
-Jekis

これは、スワップを強制終了する前に、どうにかして十分なRAMがあることを確認する必要があるなど、すべてのヒントを読んだ後に到達した結論です。ありがとう、素晴らしいスクリプト。デフォルトでUbuntuに含める必要があります(冗談ではなく、本当に必要なものです。)
Shiki

ただし、スワップをオフにして新しいものを実行した場合、およびスワップをオンにする前には、十分なメモリがありません。
barteks2x

それは、空きメモリの量に依存します。スワップ内のすべてと新しいプロセスを保持するのに十分な空きメモリがあれば、問題はありません。そうでない場合、あなたは正しいです。
スコットセヴェランス

25

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

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


2
CPUがほとんど使用されていないのに、swapにいくつかのものがあり、vmstatはswapinとswapoutが発生していることを示し、Chromeは遅れていました。十分な理由がありますか?
ゼロス

デスクトップ上で特定のスワッピングを行うと動作が遅くなる場合があります。(スワッピング中ではなく、十分なRAMがある場合、その後も長時間)。だからせいぜいこの答えは主観的な経験であり、場合によっては起こります。
クレイ

-1

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


10
何かがあればうんしかしれるスワップされていることはない、したがって、この質問にパフォーマンスに影響を与えます。
quant

それは本当のナンセンスです。通常、大きなフォールバックスワップはHDDまたは一般的にRAMよりも遅いデバイスにあります-スペースがなくなった場合-既存のものはスワップされます-たとえば、インターネットブラウザー-そして、あなたは実際に遅いデバイスからそれを使用しています..
jave.web
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.