\r\n\r\n
Linuxのswappeinessの値は、スワップが開始される前に使用されていたRAMの量とは関係ありません。これは広く報道され、一般に信じられている誤りです。その実態を解説します。
スワップとは、ランダムアクセスメモリー(RAM)からハードディスク上の特別な場所(スワップパーティションまたはスワップファイル)にデータを書き込み、RAMを空ける手法です。
Linuxには、スワップ値という設定があります。この設定が何を制御しているかについては、多くの混乱があります。スワップ可能性について最もよくある誤解は、RAMの使用量に閾値を設定し、その閾値に達するとスワップが開始される、というものです。
よく言われる誤解だが、今では常識として受け入れられている。もし(ほとんど)他のみんなが、交換はこうだと言っているのに、なぜ私たちがそうでないと言っても信じなければならないのでしょうか?
簡単なことです、証明すればいいんです。
Linux では、RAM を 1 つの大きな均質なメモリプールとは見なさない。地域と呼ばれるいくつかの異なる領域に分割されていると考えている。コンピュータ上にどの領域が存在するかは、32ビットか64ビットかによって異なります。以下は、x86アーキテクチャのコンピュータで可能な領域を簡略化して説明したものである。
RAMは固定サイズのページで割り振られます。このサイズは、ブート時にカーネルがコンピュータのアーキテクチャを検出して決定します。一般的に、Linuxコンピュータのページサイズは4KBである。
ページサイズは、getconfコマンドで確認することができます。
getconf PAGESIZEパーティションはノードに付属しています。ノードは、CPU(Central Processing Unit)と関連しています。カーネルは、CPU上で動作するプロセスのために、そのCPUに関連するノードからメモリを確保しようとします。
CPUにノードをバインドするというコンセプトにより、マルチCPUの専門コンピュータに、不均一なメモリアクセスのアーキテクチャを使用して、混合メモリタイプを搭載することができます。
これらは非常にハイエンドなものです。典型的なLinuxコンピュータは、ノードゼロと呼ばれる1つのノードしか持っていません。すべてのリージョンはそのノードに属します。コンピュータのノードとリージョンを見るには、/proc/buddyinfo ファイルを見ます。使用する資源を少なくする。
less /proc/buddyinfoこれは、本稿で研究した64ビットコンピュータの出力である。
Node 0, zone DMA 1 1 1 0 2 1 1 0 1 1 3 Node 0, zone DMA32 2 67 58 19 8 3 3 1 1 1 17ノード0というノードが1つあります。このコンピュータはRAMが2GBしかないので、「正常な」領域はありません。領域はDMAとDMA32の2つだけです。
各列は、特定のサイズの利用可能なページ数を示します。例えば、DMA32エリアでは、左から読み取ります。
しかし、実際には、この情報を見るのは、ノードとリージョンとの関係を見るためだけです。
メモリマップは、ページテーブルエントリのセットを使用して、どのメモリページがどのような目的で使用されるかを記録します。
メモリマッピングが可能です。
交換のためには、リストの最初の2つ、つまりドキュメントページと匿名ページに注目すればいいのです。
以下は、GitHubにあるLinuxのドキュメントから、スワップについて説明したものです。
このコントロールは、カーネルがメモリページをスワップする際のアグレッシブさ(sic)を定義するために使用されます。値を大きくすると攻撃性が増し、値を小さくするとスワッピングが減少する。値0は、フリーページとファイルバックアップページの数がその領域のハイウォーターマークより少なくなるまでスワップを開始しないようカーネルに指示します。
初期値は "60 "です。
これは、スワップが強弱で切り替わるような感じですね。興味深いのは、swappeinessを0に設定してもswapがオフになるわけではないということです。これは、ある条件が満たされるまでswapしないようにカーネルに指示するものです。しかし、スワッピングはまだ起こり得ます。
カーネルのソースファイル vmscan.c にある vmu swap の定義とデフォルト値を以下に示します。
/* 0から順に、100になるとスワップ回数が多くなる */ int vmintu swappeiness=60.
Swappinessの値は0から100まであり、このメモを見ると、Swappinessの値はスワップが発生する回数に関連しており、値が高いほどスワップ回数が多くなるようだ。
さらにソースコードを見ると、swappeinessという新しい変数に、memu cgroup neu swappeiness()という関数が返す値が代入されていることがわかる。さらにソースコードを辿っていくと、この関数が返す値はvmētu swappeissであることがわかります。そこで、変数swappeissにvmētu swappeissで設定された値をセットします。
int swappeiness=memu cgroup neu swappeiness(memcg).
少し先のページで、同じソースコード・ファイルに、次のような記述があります。
/* swap が 100 の場合、anonymous と file は同じ優先度を持つ。*このスキャン優先度は、本質的にIOオーバーヘッドとは逆のものです。*/anonu prio=swappeiss; fileu prio=200-anonu prio.
それは面白いですね。2つの異なる値が交換され、anon 001とfile 001がこれらの値を保持します。一方が増え、他方が減り、またその逆もある。
Linuxのswappeinessの値は、実際には2つの値の間の比率を設定します。
メモリが解放されれば、ファイルページに保存されているデータは簡単に取り出せますので、linuxは再びファイルを読むことができます。これまで見てきたように、RAM上のファイルデータに変更が加えられた場合、ファイルページを解放する前に、その変更をファイルに書き込む必要があります。しかし、いずれにせよ、ファイルからデータを読み出すことで、RAM上のファイルページを再作成することができます。では、なぜわざわざスワップパーティションやスワップファイルにこれらのページを追加するのでしょうか?そのデータが再び必要になった場合、スワップ領域にある冗長なコピーを読むよりも、元のファイルから読み返した方がよいでしょう。そのため、ファイルページはスワップには格納されません。元のファイルに「保存」されているのです。
匿名ページでは、メモリ上の値に関連するベースファイルは存在しない。これらのページの値は、動的に到着します。単純にファイルから読み戻すことはできません。匿名ページのメモリ内値を復元する唯一の方法は、メモリを解放する前にデータをどこかに保存することである。そこで登場するのが、スワップです。再度参照する必要がある匿名ページ。
ただし、ファイルページや匿名ページでは、メモリを解放するためにハードディスクへの書き込みが必要になる場合があります。ファイルのページデータまたは匿名ページデータが、前回書き込みまたはスワップされたときから変更されている場合、ファイルシステムの書き込みが必要になります。データを取得するためには、ファイルシステムの読み込みが必要です。どちらのタイプのページ回収もコストがかかる。匿名ページのスワッピングを最小限にすることでハードディスクの入出力を減らそうとすると、ファイルへの書き込みやファイルからの読み出しを処理するために必要なハードディスクの入出力が増えるだけです。
先ほどのコードでお分かりのように、2つの変数があります。ひとつは「ファイル優先」でfile、もうひとつは「匿名優先」でanonu prioと呼ばれる。
これらの変数は、連動して動作する値を保持しています。両方が100に設定されている場合、両者は等しくなります。この2つの値は、Linuxカーネルがファイルページと匿名ページのどちらを優先的にリサイクル(解放)して実行するかを決定する複雑なアルゴリズムに供給されます。
ファイルの優先順位は、システムがファイルページを解放する意志があること、非優先順位は、システムが匿名ページを解放する意志があることと考えることができます。これらの値は、スワップが使用される際のトリガーや閾値を設定するものではありません。それは別のところで決まります。
しかし、メモリを解放する必要がある場合、Recycle and Swap計算**はこの2つの変数とその比率を考慮し、どのページタイプを優先的に解放するかを決定します。これは、関連するハードディスクの活動が、ファイルページのためのファイル処理なのか、匿名ページのためのスワップスペースなのかを判断するものです。
Linuxのswappiness値は、潜在的な再利用のためにスキャンされるメモリページのタイプの優先順位を設定することを確認しました。これはいいのですが、いつ入れ替えが行われるかを決めるものが必要です。
各メモリーエリアには、ハイウォーターマークとローウォーターマークがあります。これらは、システム由来の値です。各リージョンのメモリに対する割合である。この値をスワップトリガーの閾値として使用する。
水位が高いラインと低いラインを確認するには、次のコマンドで /proc/zoneinfo ファイルを表示します。
less /proc/zoneinfo各エリアには、ページ単位でメモリの値が設定されています。以下は、テスト機でのDMA32領域の値です。低水準で13966ページ、高水準で16759ページ。
したがって、Linuxのswappeinessの値を使用して、RAM使用量の観点からswapの動作に影響を与えることはできないことがわかります。そんなはずはないのです。
ハードウェア、作業量、ハードディスクの種類、お使いのコンピュータがデスクトップかサーバーかによって異なります。もちろん、これは一律に設定できるものではありません。
スワップは、単にメモリ領域が枯渇したときに RAM を解放する仕組みではないことを覚えておく必要があります。スワップは、よく機能するシステムにとって不可欠な要素であり、これなしでは、Linux は健全なメモリ管理を達成することが難しくなります。
Linuxのswappeinessの値を変更すると、すぐに反映されますので、リブートは必要ありません。だから、ちょっとした調整をして、その効果をモニタリングすることができるのです。理想は、数日間にわたってパソコンでさまざまな操作を行い、理想に最も近い設定を探っていくことです。
以下の点を考慮する必要がある。
交換価値を変更する前に、その現在の価値を知る必要があります。少しでも減らすなら、問題は何倍以下か?このコマンドで調べます。
cat /proc/sys/vm/swappiness交換可能な値を設定するには、sysctl コマンドを使用します。
sudo sysctl vm.swappiness=45再起動せずにそのまま新しい値を使用します。
実際、再起動すればswap値はデフォルトの60に戻る。 実験を終えて使用する新しい値を決めたら、それを/etc/system control設定ファイルに追加すれば、再起動時に変更しないでおくことができる。お好きなエディターをお使いいただけます。nanoエディタを使用して、以下のコマンドでファイルを編集してください。
sudo nano /etc/sysctl.confnanoが開いたら、ファイルの一番下までスクロールして、この行を追加します。永久交換価値として35を使用していますが、使用したい値に置き換えてください。
vm.swappiness=35変更を保存してnanoを終了するには、"Ctrl+O "を押し、"Enter "を押し、"Ctrl+Z "を押します。
メモリ管理は複雑なので、一般ユーザーにとっては、カーネルに任せた方が良い場合が多いのです。
実際よりも多くのRAMを使用しているような印象を受けがちです。top や free などのユーティリティは間違った印象を与えることがあり、Linux はディスクキャッシングなどの独自の目的のために空き RAM を使用します。これにより、人為的に「使用済み」メモリ量を増加させ、「空き」メモリ量を減少させることができます。実際、ディスクキャッシュとして使用されるRAMは、いつでも素早く回収できるため、「使用済み」と「空き」の両方としてマークされる。
素人目には、swapが機能していない、またはswappeissの値を変更する必要があるように見えるかもしれません。
いつものように、重要なのは細部であり、この場合はデーモンである。