web-dev-qa-db-ja.com

十分な空きRAMがあるにもかかわらず、スワップが使用されるのはなぜですか?

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

204
Mysterio

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

buntuのスワップFAQ から:

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

185
jpetersen

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

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

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

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

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

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

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

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

Linuxがスワップを使用する方法(さらに簡略化された)

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

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

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

スワップは、デスクトップシステムで認識されるパフォーマンスに実際に悪影響を与えるよく知られた状況があります。それは、長時間アイドル状態のままでIO(夜間バックアップなど)実行。これは非常に目に見える動きの鈍さですが、スワップをすべてオフにすることを正当化するのに十分ではなく、どのオペレーティングシステムでも防ぐことは非常に困難です。スワップをオフにすると、バックアップ/ウイルススキャン後のこの最初の低迷は発生しませんが、システムは1日中少し遅くなります。これもLinuxに限った状況ではありません。

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

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

しかし、どうすればシステムの速度を上げることができますか?遅いものを入れ替えないのですか?

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

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

スワップは関連付け使用可能なRAMが不足している場合に発生するため、システムのパフォーマンスが低下している場合にのみ発生します。スワップがあります。そのため、物事を単純化するために、スワッピングが発生しますbecauseあなたのシステムは、その逆ではなく、動けなくなっています。

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

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

90
thomasrutter

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

スワップの切り替えは、注意しないと少し危険です。 RAM内のすべてを保持するのに十分な空きRAMがない場合plusスワップ内のすべて、スワップを無効にしようとすると、システムが応答しなくなります。私のスクリプトはまず、十分な空き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年近く問題なく使用しています。

23
Scott Severance

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

4
drake01

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

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

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

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

3
BillThor

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
2