\r\n\r\n

linuxのスワッピングとは?(と変更方法)

linuxのswappeinessの値は、スワップが開始される前に使用されたラムの量とは関係ありません。これは広く報道され、一般に信じられているバグである。その実態を解説します...

Linuxのswappeinessの値は、スワップが開始される前に使用されていたRAMの量とは関係ありません。これは広く報道され、一般に信じられている誤りです。その実態を解説します。

楽園にまつわる神話を払拭する

スワップとは、ランダムアクセスメモリー(RAM)からハードディスク上の特別な場所(スワップパーティションまたはスワップファイル)にデータを書き込み、RAMを空ける手法です。

Linuxには、スワップ値という設定があります。この設定が何を制御しているかについては、多くの混乱があります。スワップ可能性について最もよくある誤解は、RAMの使用量に閾値を設定し、その閾値に達するとスワップが開始される、というものです。

よく言われる誤解だが、今では常識として受け入れられている。もし(ほとんど)他のみんなが、交換はこうだと言っているのに、なぜ私たちがそうでないと言っても信じなければならないのでしょうか?

簡単なことです、証明すればいいんです。

あなたのラムはゾーンに分かれています

Linux では、RAM を 1 つの大きな均質なメモリプールとは見なさない。地域と呼ばれるいくつかの異なる領域に分割されていると考えている。コンピュータ上にどの領域が存在するかは、32ビットか64ビットかによって異なります。以下は、x86アーキテクチャのコンピュータで可能な領域を簡略化して説明したものである。

  • ダイレクトメモリーアクセス(DMA):下位16MBのメモリです。この領域の名前の由来は、昔、物理メモリのこの領域にしか直接アクセスできないコンピュータがあったためです。
  • Direct Memory Access 32: Direct Memory Access 32 (DMA32)は、その名前とは裏腹に、64ビットLinuxにのみ存在する領域である。メモリは4GB未満です。 32ビットコンピュータで動作するLinuxは、(物理アドレス拡張(PAE)カーネルを使用していない限り)この量のRAMに対してのみDMAを実行でき、これが領域の名前になります。ただし、32ビットコンピュータでは、HighMemと呼ばれる。
  • 通常:64ビットマシンでは、通常のRAMはすべてのRAMが4GB以上(目安)です。32ビットマシンでは、16MBから896MBのRAMになります。
  • HighMem:これは32ビットLinuxコンピュータにのみ存在します。896MB以上のすべてのRAMを搭載しており、十分な大きさのマシンでは4GB以上も搭載しています。

ページサイズ値

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:メモリブロックは全部で2つです^(0*PAGESIZE)。
  • 67:2^(1*ページサイズ)のメモリが67ブロックあります。
  • 58:2^(2*PAGESIZE)のメモリが58ブロック使用可能です。
  • といった具合に、それまで...
  • 17:2^(512*PAGESIZE)ブロックが17個あります。

しかし、実際には、この情報を見るのは、ノードとリージョンとの関係を見るためだけです。

ドキュメントページと匿名ページ

メモリマップは、ページテーブルエントリのセットを使用して、どのメモリページがどのような目的で使用されるかを記録します。

メモリマッピングが可能です。

  • ファイルバックアップ:ファイルバックアップマップには、ファイルから読み込まれたデータが格納されています。ファイルの種類は問いません。重要な点は、システムがこのメモリを解放し、再びそのデータを取得する必要がある場合、再びファイルから読み取ることができるということです。ただし、メモリ内のデータに変更が加えられている場合は、メモリを解放する前に、その変更をハードディスク上のファイルに書き込む必要があります。このままでは、変化が消えてしまいます。
  • 匿名:匿名メモリーは、ファイルやデバイスをサポートしないメモリーマップです。これらのページには、プログラムによって動的に要求されるデータ保持のためのメモリや、スタックやヒープなどのメモリが含まれることがあります。このタイプのデータはファイルが続かないため、匿名データを保存するための特別な場所を確保する必要があります。この場所は、スワップパーティションまたはスワップファイルです。匿名ページが公開される前に、匿名データがスワップに書き込まれます。
  • デバイスバックアップ:ブロックデバイスファイルによるデバイスのアドレス指定、ファイルとみなすことができる。データの読み出し、書き込みが可能です。デバイスがサポートするメモリーマップには、そのデバイスのデータが格納されています。
  • 共有:複数のページテーブルエントリをRAMの同じページにマッピングすることができます。どのマッピングでメモリロケーションにアクセスしても、同じデータが表示されます。これらの共通に監視されるメモリー位置のデータを変更することで、異なるプロセス同士が非常に効率的に通信することができます。書き込み可能な共有マッピングは、高性能なプロセス間通信を実現するための一般的な方法です。
  • Copy on Write: Copy on Writeは、遅延割り当て技術です。メモリ内に既に存在するリソースのコピーが要求された場合、元のリソースへのマップを返すことで要求を満たす。リソースを「共有」しているプロセスの1つがそのリソースに書き込もうとした場合、新しいコピーに変更を加えることができるように、リソースは実際にメモリ内にコピーされなければなりません。そのため、メモリの確保は最初の書き込みコマンドの時のみ行われます。

交換のためには、リストの最初の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と呼ばれる。

  • anonèprio変数には、Linuxのswap値が設定されます。
  • ファイル優先度」の値は、「非優先度」の値から200を引いた値に設定されます。

これらの変数は、連動して動作する値を保持しています。両方が100に設定されている場合、両者は等しくなります。この2つの値は、Linuxカーネルがファイルページと匿名ページのどちらを優先的にリサイクル(解放)して実行するかを決定する複雑なアルゴリズムに供給されます。

ファイルの優先順位は、システムがファイルページを解放する意志があること、非優先順位は、システムが匿名ページを解放する意志があることと考えることができます。これらの値は、スワップが使用される際のトリガーや閾値を設定するものではありません。それは別のところで決まります。

しかし、メモリを解放する必要がある場合、Recycle and Swap計算**はこの2つの変数とその比率を考慮し、どのページタイプを優先的に解放するかを決定します。これは、関連するハードディスクの活動が、ファイルページのためのファイル処理なのか、匿名ページのためのスワップスペースなのかを判断するものです。

交換はいつからですか?

Linuxのswappiness値は、潜在的な再利用のためにスキャンされるメモリページのタイプの優先順位を設定することを確認しました。これはいいのですが、いつ入れ替えが行われるかを決めるものが必要です。

各メモリーエリアには、ハイウォーターマークとローウォーターマークがあります。これらは、システム由来の値です。各リージョンのメモリに対する割合である。この値をスワップトリガーの閾値として使用する。

水位が高いラインと低いラインを確認するには、次のコマンドで /proc/zoneinfo ファイルを表示します。

less /proc/zoneinfo

各エリアには、ページ単位でメモリの値が設定されています。以下は、テスト機でのDMA32領域の値です。低水準で13966ページ、高水準で16759ページ。

  • 通常の動作条件下では、ある領域で利用可能なメモリがその領域のローウォーターマークを下回ると、スワップアルゴリズムは、anonu prioとfile prioの相対値を考慮して、再生できるメモリページを走査し始める。
  • Linuxのスワップネス値を0に設定すると、ファイルページとフリーページの合計値がハイウォーターマークより小さい場合にスワップが発生します。

したがって、Linuxのswappeinessの値を使用して、RAM使用量の観点からswapの動作に影響を与えることはできないことがわかります。そんなはずはないのです。

swapinessはどのように設定すればよいのでしょうか?

ハードウェア、作業量、ハードディスクの種類、お使いのコンピュータがデスクトップかサーバーかによって異なります。もちろん、これは一律に設定できるものではありません。

スワップは、単にメモリ領域が枯渇したときに RAM を解放する仕組みではないことを覚えておく必要があります。スワップは、よく機能するシステムにとって不可欠な要素であり、これなしでは、Linux は健全なメモリ管理を達成することが難しくなります。

Linuxのswappeinessの値を変更すると、すぐに反映されますので、リブートは必要ありません。だから、ちょっとした調整をして、その効果をモニタリングすることができるのです。理想は、数日間にわたってパソコンでさまざまな操作を行い、理想に最も近い設定を探っていくことです。

以下の点を考慮する必要がある。

  • Linuxのswappeinessの値をゼロにして「スワップを無効にする」ことを試みても、スワップ関連のハードドライブの活動がファイル関連のハードドライブの活動に変換されるだけです。
  • 機械式ハードディスクが老朽化している場合は、Linuxのスワップ性の値を下げて、匿名ページのリサイクルを回避し、スワップパーティションの変更を減らすとよいでしょう。もちろん、片方の設定を下げれば、もう片方の設定は上がります。スワップチャーンを減らすと、ファイルシステムのチャーンが増える可能性があります。しかし、お使いのコンピュータがどちらかの方法を好む場合もあります。本当に、試してみるしかないんです。
  • 単一目的のサーバー(データベースサーバーなど)については、データベースソフトウェアベンダーからガイダンスを得ることができます。多くの場合、これらのアプリケーションは、独自に設計されたファイルキャッシングとメモリ管理ルーチンを持っており、それを利用するのが最も適切です。ソフトウェアベンダーは、マシンの仕様と作業負荷に基づいて、Linuxのスワップ値を提案することがあります。
  • 最新のハードウェアを持つ一般的なデスクトップユーザー向け? そのままでいい。

linuxのスワップ値の設定方法

交換価値を変更する前に、その現在の価値を知る必要があります。少しでも減らすなら、問題は何倍以下か?このコマンドで調べます。

cat /proc/sys/vm/swappiness

交換可能な値を設定するには、sysctl コマンドを使用します。

sudo sysctl vm.swappiness=45

再起動せずにそのまま新しい値を使用します。

実際、再起動すればswap値はデフォルトの60に戻る。 実験を終えて使用する新しい値を決めたら、それを/etc/system control設定ファイルに追加すれば、再起動時に変更しないでおくことができる。お好きなエディターをお使いいただけます。nanoエディタを使用して、以下のコマンドでファイルを編集してください。

sudo nano /etc/sysctl.conf

nanoが開いたら、ファイルの一番下までスクロールして、この行を追加します。永久交換価値として35を使用していますが、使用したい値に置き換えてください。

vm.swappiness=35

変更を保存してnanoを終了するには、"Ctrl+O "を押し、"Enter "を押し、"Ctrl+Z "を押します。

メモリ管理が複雑

メモリ管理は複雑なので、一般ユーザーにとっては、カーネルに任せた方が良い場合が多いのです。

実際よりも多くのRAMを使用しているような印象を受けがちです。top や free などのユーティリティは間違った印象を与えることがあり、Linux はディスクキャッシングなどの独自の目的のために空き RAM を使用します。これにより、人為的に「使用済み」メモリ量を増加させ、「空き」メモリ量を減少させることができます。実際、ディスクキャッシュとして使用されるRAMは、いつでも素早く回収できるため、「使用済み」と「空き」の両方としてマークされる。

素人目には、swapが機能していない、またはswappeissの値を変更する必要があるように見えるかもしれません。

いつものように、重要なのは細部であり、この場合はデーモンである。

あなたが興味を持っているかもしれない記事

匿名者
匿名者

0 件の投稿

作家リスト

  1. admin 0 投稿
  2. 匿名者 0 投稿

おすすめ