十分な空きRAMがあるのに、なぜスワップが使用されているのですか?


208

スワップの本質は、RAMがいっぱいのときに一時的なストレージセーフティネットとして機能することだと思いましたが、3GBの空きRAMがある場合でも、スワップパーティションは常に使用されています。これは正常ですか?


3
問題のトラブルシューティングに役立つように、次のコマンド/ファイルの内容または出力を共有してくださいこの回答の手順free -mtop -b 1
ish

明日、これらのコマンドのペーストビンで質問を更新します。今は午前12時です。(
ミステリオ

タイトルを編集して、「...しかし、今は気がかりすぎて眠れないので、皆さんも昼寝します」:P
ish

回答:


188

「swappiness」値を変更してみてください。

Ubuntuのスワップよくある質問

swappinessとは何ですか、どのように変更しますか?

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

  1. swappinessの値は0〜100です。

  2. swappiness = 0は、カーネルが物理メモリからプロセスをできるだけ長くスワップしないように指示します。カーネルバージョン3.5以降では、スワップが無効になります。

  3. swappiness = 100は、物理メモリから積極的にプロセスをスワップし、それらをスワップキャッシュに移動するようカーネルに指示します

Ubuntuのデフォルト設定はswappiness = 60です。swappinessのデフォルト値を減らすと、おそらく典型的なUbuntuデスクトップインストールの全体的なパフォーマンスが向上します。swappiness = 10の値が推奨されますが、自由に実験してください。注:Ubuntuサーバーのインストールには、デスクトップシステムとは異なるパフォーマンス要件があり、デフォルト値の60がより適切である可能性があります。

swappiness値を確認するには

cat /proc/sys/vm/swappiness

swappiness値を変更するにはswappiness値が10の一時的な変更(再起動時に失われる)は、次のようにして行うことができます。

sudo sysctl vm.swappiness=10

変更を永続的にするには、お好みのエディターで構成ファイルを編集します。

gksudo gedit /etc/sysctl.conf

vm.swappinessを検索し、必要に応じてその値を変更します。vm.swappinessが存在しない場合は、次のようにファイルの最後に追加します。

vm.swappiness=10

ファイルを保存して再起動します。

また、チェックアウトできます:https : //askubuntu.com/a/103916/54187


1
アイドル投機:これは実際にはパフォーマンスに有益です-しばらくアクセスされていないページをスワップスペースにコピーできます。これにより、メモリが必要になった場合にOSがすばやくそれらを排除できますが、ページの内容はメモリに残ります。
サイモンリヒター

7
@SimonRichterはい、それがアイデアです。ただし、最新のシステムでは60のSwappinessはおそらくあまりにも積極的です。これは、まだいくつかの空きメモリが残っているときにスワップアウトを開始していることを意味します。
ブレンダンロング

1
sudo sysctl --load=/etc/sysctl.confファイルを編集した後に実行して変更を適用します
deFreitas

92

質問にはいくつかの異なる側面があります。

まず、「無料」の定義は何ですか。実際には、Linux(または最新のオペレーティングシステム)のように単純ではありません。

LinuxがRAMを使用する方法(非常に単純化された)

各アプリケーションはメモリの一部を使用できます。Linuxは、「キャッシュ」として他のすべての未使用メモリ(最後の数MBを除く)を使用します。これには、ページキャッシュ、iノードキャッシュなどが含まれます。これは良いことです。ヒープを高速化するのに役立ちます。キャッシュにより、ディスクへの書き込みとディスクからの読み取りの両方を非常に高速化できます。

理想的には、すべてのアプリケーションに十分なメモリがあり、キャッシュ用に数百MBが残っていることが理想です。この状況では、アプリケーションがメモリ使用量を増加させず、システムがキャッシュに十分なスペースを取得するのに苦労していない限り、スワップは必要ありません。

アプリケーションがより多くのRAMを要求すると、キャッシュによって使用されていたスペースの一部に移動し、キャッシュを縮小します。キャッシュの割り当て解除は、リアルタイムで簡単に実行できるほど安価で簡単です-キャッシュ内にあるものはすべて、既にディスク上にあるものの2番目のコピーであるため、ただちに割り当てを解除することができます。とにかく数秒以内にディスクにフラッシュしなければならなかっ

これはLinuxに固有の状況ではありません-最新のオペレーティングシステムはすべてこのように動作します。異なるオペレーティングシステムでは、空きRAMの報告方法が異なる場合があります。「無料」と見なされるものの一部としてキャッシュを含むものとそうでないものがあります。

空きRAMについて話すときキャッシュは実際には無料であるためキャッシュを含める方がはるかに意味があります。アプリケーションが要求した場合に利用できます。Linuxでは、freeコマンドは両方の方法で報告します。最初の行には使用済みRAM列にキャッシュが含まれ、2番目の行には空き列にキャッシュ(およびバッファー)が含まれます。

Linuxでのスワップの使用方法(さらに簡素化)

スムーズに実行されるキャッシュに十分なメモリがなくなると、Linuxは未使用のアプリケーションメモリをRAMからスワップに再割り当てする場合があります。

明確なカットオフに従ってこれを行いません。割り当ての一定の割合に達すると、Linuxがスワップを開始するわけではありません。かなり「ファジー」なアルゴリズムがあります。それは多くのことを考慮に入れていますが、これは「メモリ割り当てにどれほどのプレッシャーがあるか」で最もよく説明できます。新しいメモリを割り当てるために多くの「プレッシャー」がある場合、より多くのスペースを確保するためにスワップされる可能性が高くなります。「プレッシャー」が少ない場合、これらの可能性は減少します。

システムには「スワップ」設定があり、この「圧力」の計算方法を微調整できます。通常、これを変更することはお勧めできません。変更することはお勧めしません。スワップは全体的に非常に良いことです-パフォーマンスを損なういくつかのエッジケースがありますが、全体的なシステムパフォーマンスを見ると、それは幅広いタスクにとって正味の利点です。swappinessを減らすと、キャッシュメモリの量を、実際に役立つ場合でも、そうでない場合よりも少しだけ縮小させます。これがスワッピングで発生している問題に対して十分なトレードオフであるかどうかは、あなた次第です。あなたは自分が何をしているのかを知っている必要があります。

スワップは、デスクトップシステムで認識されるパフォーマンスを本当に損なうというよく知られた状況があります。それは、長時間アイドル状態のままで、バックグラウンドプロセスがIOで重くなった後、アプリケーションがユーザー入力にすばやく応答できる速度にあります一晩バックアップ)実行。これは非常に目に見える動きの鈍さですが、スワップをすべてオフにすることを正当化するのに十分ではなく、どのオペレーティングシステムでも防ぐことは非常に困難です。スワップをオフにすると、バックアップ/ウイルススキャン後のこの最初の低迷は発生しませんが、システムは1日中少し遅くなります。これもLinuxに限った状況ではありません。

ディスクにスワップするものを選択するとき、システムは実際に使用されていないメモリ(読み取りまたは書き込み)を選択しようとします。ほとんどの場合、これを計算するための非常に単純なアルゴリズムが選択されています。

膨大な量のRAMを搭載したシステム(執筆時点では、典型的なLinuxディストリビューションでは8GBが膨大な量です)を使用している場合、スワップが必要になる状況はほとんどありません。スワップをオフにすることもできます。これを行うことはお勧めしませんが、それは、RAMが増えるとアプリケーションのクラッシュを防ぐことができるからです。しかし、あなたがそれを必要としないことを知っているなら、あなたそれをすることができます。

しかし、スワップはどのようにしてシステムを高速化できますか?遅いものを交換することは遅くありませんか?

RAMからスワップにデータを転送する動作は遅い動作ですが、カーネルが全体的なメリットがこれを上回ると確信している場合にのみ実行されます。たとえば、アプリケーションのメモリがキャッシュがほとんど残っていない状態まで上昇し、そのためにI / Oが非常に非効率的である場合、メモリを解放することで、実際にシステムからより多くの速度を得ることができます。データを解放するためにデータを交換する初期費用の後。

また、アプリケーションが実際より多くのメモリを実際に要求する場合の最後の手段です。この場合、アプリケーションのクラッシュや強制終了が頻繁に発生するメモリ不足の状況を防ぐために、スワップが必要です。

スワップは、使用可能なRAMが不足しているときに発生するため、システムのパフォーマンスが低下している場合にのみ関連付けられます。これにより、スワップがなくてもシステムの速度が低下します(または不安定になります)。そのため、物事を単純化するために、システムが動けなくなるためにスワップが発生します。

データがスワップされると、いつ再びデータが出ますか?

スワップからのデータの転送は、(少なくとも従来のハードディスクでは)そこにデータを入れるのと同じくらい時間がかかります。当然のことながら、カーネルは、特に実際に使用されていない(読み取りまたは書き込みされている)場合は特に、スワップからデータを削除することに消極的です。スワップ内にデータがあり、使用されていない場合、使用されている他のもののためにより多くのメモリを残し、潜在的にシステムを高速化する可能性あるため、実際にはスワップのままであることが良いことです。


5
詳細な説明については、+ 1。また、コンピューターで2GiBスワップを維持したいです。メモリリークなど、何かがうまくいかない場合は、スワップが発生していることを確認し、メモリ不足が発生する前に問題を探すことができます。セーフティネットであると同時にパフォーマンスツールでもあります。
ジョー

1
RAMが2GBしかないネットブックでは、4GBのスワップを保持しています。これは、ネットブックをより多くの目的で使用しており、プログラムが2GBを超えるメモリを頻繁に必要とするためです。Linuxはメモリ不足の状況では動作が非常に悪いため、大規模なセーフティネットが必要です。そして、十分なディスク容量があります。
スコットセヴェランス

プログラムが頻繁に2GBを超えるメモリを必要とする場合、RAMを使い果たすとパフォーマンスが低下するため、そこにRAMを追加することを検討します(超安価です!)。他の読者の利益のために:利用可能なRAMを独占することになっているキャッシュメモリを見ているだけではないことを確認してくださいfree -m
-thomasrutter

2
@neon_overload:HPによれば、ネットブックの最大RAMは1GBです。私は今そこに2GBを持っています、そしてインターネットソースは2GBが実際の最大値であることを示唆しています。したがって、これらの種類の回避策の必要性。
スコットセベランス

@thomasrutter:大型サーバーの場合、答えはどのように変わりますか。私の1つは1TB(はい1テラバイト)のRAMを持っていますが、まだスワップを使用しています。swappinessの設定と、swapパーティションの推奨サイズを教えてください。
chrisinmtown

24

swappiness値の設定は、すべての状況で機能するわけではありません。それがあなたのために働くなら、素晴らしい。そうでない場合は、スワップをオフにしてから再びオンにすることで、定期的にスワップをクリアするスクリプトを作成しました。

スワップの切り替えは、注意しないと少し危険です。あなたはRAMのすべてを保持するのに十分な空きRAMがない場合は、プラススワップのすべてを、スワップを無効にしようとすると、システムが応答しなくなることになります。私のスクリプトは、最初に十分な空きRAMがあるかどうかを確認し(空きRAMの実際の量は空きとfree報告するものとは異なるため、少し時間がかかります)、次にスワップを切り替えます。ただし、RAMが少し不足している場合は、スクリプトの実行中に別の主要なプロセスを開始しないでください。ここにあります:

#!/bin/bash

# Make sure that all text is parsed in the same language
export LC_MESSAGES=en_US.UTF-8
export LC_COLLATE=en_US.UTF-8
export LANG=en_US.utf8
export LANGUAGE=en_US:en
export LC_CTYPE=en_US.UTF-8

# Calculate how much memory and swap is free
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)"

# Do the work
if [[ $used_swap -eq 0 ]]; then
    echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $total_free ]]; then
    echo "Freeing swap..."
    swapoff -a
    swapon -a
else
    echo "Not enough free memory. Exiting."
    exit 1
fi

このスクリプトをルートとして実行する必要があります(たとえば、sudo)。このスクリプトにより、システムが応答しなくなることはありません。RAMが不足している場合、スワップの切り替えは拒否されます。私はこのスクリプトを5年近く問題なく使用しています。


スクリプトの場合は+1。出力でMBをMiBに変更することで、少し近代化することができます。同様のスクリプトを、すべての(良い)安全性テストを含めずに作成しました。スワップが頻繁に使用されていた私の古いノートブックでは、実行に少し時間がかかりました-1〜2分ですが、何も傷つけませんでした。実行するのに十分な空きメモリがなかったために、たまに失敗しましたが、追加の問題は発生しませんでした。私はそれが起こったときに物事をクリアするために再起動する必要がありました。これは、Transmissionのメモリリークのように見えた(修正されたと思うので)と関係があり、2GiBのRAMしかありませんでした。
ジョー

6
何かがスワップに移動され、それがスワップのままである場合、それは通常良いことです-それはデータが実際に使用されていないことを意味し、他のもののためにRAMの一部を解放し、速度の潜在的なブーストをもたらします。このデータをスワップ状態にすべきではなく、代わりに貴重なRAMを使用すべきだと考えるようになった理由は何ですか?通常、カーネルは使用されていないものと、RAMを解放するためにスワップに安全に残っているものを知るのが得意です。
-thomasrutter

@neon:私のマシンにはそれぞれ2GBと3GBのRAMがあることに注意してください。これは最近ではごくわずかです。証拠はパフォーマンスにあります。たとえば、Compos visoalエフェクトと同様に、スワッピングのためにメニューの表示やプログラムの切り替えが遅くなる場合があります。この遅さは、スワップを切り替えることで解消されます。したがって、少なくともいくつかの状況では、カーネルの最適化アルゴリズムが最適ではないことが示されます。私は繰り返しの経験で議論することはできません。
スコットセヴェランス

ふう!これはスワップの0%にまで押し下げられました。...この完全な質問とその答えを調べる時間はあまりありませんでしたが、空き時間があるときに読むのが好きでした。
AzkerM 14

swappinessを低い値に設定しないのはなぜですか?これはスクリプトと同じことをしているように見えますが、はるかに制御された方法で行われています。
jhfrontz

4

一般的に、スワップは現在のシステムでは未使用のままです。私の経験では、長時間の集中的な操作なしで実行されているプロセスは、Linuxによってスワップにシフトされます。
影響を受けるいくつかのプログラムの実行が遅くなります。
あなたはラムの自由の多くを持っている場合は、コマンドを実行して、オフスワップを切り替えることがあります。
swapoff -av(あなたが必要になりますsudo。そのための権利を)
あなたはオフにスワップが気に入らない場合は、左右対称のコマンドを使用して、それを切り換えることができます:
swapon -av(再びsudo必要)。


12
swapiness = 0は同じことを行うので、スワップを完全にオフにするのはやり過ぎです。しかし、より安全です(メモリ内に多くのものを入れてしまうと、スワップで何かをスローします)。
ブレンダンロング

@BrendanLongフェアポイント..教えてくれてありがとう。:)
drake01

3

スワップがプログラムに使用されると、プログラムの存続中はマップされたままになる傾向があります。多くのプログラムには、めったに使用されないコード(およびデータ)があります。メモリがスワップアウトされると、スワップインされる可能性は低くなります。

これらのページを強制的にメモリに入れる1つの方法は、スワップデバイスをオフにすることです。2つある場合は、1つをオフにし、再びオンにして、2つ目をオフにすることができます。スワップが本当に必要な場合、デバイス間を移動します。スワップデバイス(またはファイル)をオフにすることもできますが、スワップスペースが本当に必要な場合は、劇的なことが起こります。

メモリ内の通常のものに加えて、tempfsはスワップ領域を使用し、残りのメモリと同様にスワップアウトします。大量の一時ディスクを必要とするものを実行すると、ページが強制的にスワップアウトされる場合があります。作成された一時ファイルは、数分後には使用できなくなる可能性があり、スワップデバイスに移動するのに適した候補です。

ピンチでは、ファイルをスワップデバイスとして使用できます。これは、一時的に余分なスワップスペースが必要な場合に便利です。


2

Scott Severanceのスクリプトを編集して既に利用可能なメモリフィールドの合計が含まれている新しいバージョンのfreeに一致させました。

#!/bin/bash

free_mem="$(free | grep 'Mem:' | awk '{print $7}')"
used_swap="$(free | grep 'Swap:' | awk '{print $3}')"

echo -e "Free memory:\t$free_mem kB ($((free_mem / 1024)) MiB)\nUsed swap:\t$used_swap kB ($((used_swap / 1024)) MiB)"
if [[ $used_swap -eq 0 ]]; then
    echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $free_mem ]]; then
    echo "Freeing swap..."
    sudo swapoff -a
    sudo swapon -a
else
    echo "Not enough free memory. Exiting."
    exit 1
fi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.