回答:
「swappiness」値を変更してみてください。
swappinessとは何ですか、どのように変更しますか?
swappinessパラメータは、カーネルがプロセスを物理メモリからスワップディスクに移動する傾向を制御します。ディスクはRAMよりもはるかに遅いため、プロセスがメモリから積極的に移動されすぎると、システムとアプリケーションの応答時間が遅くなる可能性があります。
swappinessの値は0〜100です。
swappiness = 0は、カーネルが物理メモリからプロセスをできるだけ長くスワップしないように指示します。カーネルバージョン3.5以降では、スワップが無効になります。
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
sudo sysctl --load=/etc/sysctl.conf
ファイルを編集した後に実行して変更を適用します
質問にはいくつかの異なる側面があります。
まず、「無料」の定義は何ですか。実際には、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が不足しているときに発生するため、システムのパフォーマンスが低下している場合にのみ関連付けられます。これにより、スワップがなくてもシステムの速度が低下します(または不安定になります)。そのため、物事を単純化するために、システムが動けなくなるためにスワップが発生します。
データがスワップされると、いつ再びデータが出ますか?
スワップからのデータの転送は、(少なくとも従来のハードディスクでは)そこにデータを入れるのと同じくらい時間がかかります。当然のことながら、カーネルは、特に実際に使用されていない(読み取りまたは書き込みされている)場合は特に、スワップからデータを削除することに消極的です。スワップ内にデータがあり、使用されていない場合、使用されている他のもののためにより多くのメモリを残し、潜在的にシステムを高速化する可能性があるため、実際にはスワップのままであることが良いことです。
free -m
。
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年近く問題なく使用しています。
一般的に、スワップは現在のシステムでは未使用のままです。私の経験では、長時間の集中的な操作なしで実行されているプロセスは、Linuxによってスワップにシフトされます。
影響を受けるいくつかのプログラムの実行が遅くなります。
あなたはラムの自由の多くを持っている場合は、コマンドを実行して、オフスワップを切り替えることがあります。
swapoff -av
(あなたが必要になりますsudo
。そのための権利を)
あなたはオフにスワップが気に入らない場合は、左右対称のコマンドを使用して、それを切り換えることができます:
swapon -av
(再びsudo
必要)。
スワップがプログラムに使用されると、プログラムの存続中はマップされたままになる傾向があります。多くのプログラムには、めったに使用されないコード(およびデータ)があります。メモリがスワップアウトされると、スワップインされる可能性は低くなります。
これらのページを強制的にメモリに入れる1つの方法は、スワップデバイスをオフにすることです。2つある場合は、1つをオフにし、再びオンにして、2つ目をオフにすることができます。スワップが本当に必要な場合、デバイス間を移動します。スワップデバイス(またはファイル)をオフにすることもできますが、スワップスペースが本当に必要な場合は、劇的なことが起こります。
メモリ内の通常のものに加えて、tempfsはスワップ領域を使用し、残りのメモリと同様にスワップアウトします。大量の一時ディスクを必要とするものを実行すると、ページが強制的にスワップアウトされる場合があります。作成された一時ファイルは、数分後には使用できなくなる可能性があり、スワップデバイスに移動するのに適した候補です。
ピンチでは、ファイルをスワップデバイスとして使用できます。これは、一時的に余分なスワップスペースが必要な場合に便利です。
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
free -m
、top -b 1