GNU/Linux >> Linux の 問題 >  >> Linux

LinuxのSwappiness:知っておくべきことすべて

Linuxのユーザーまたは愛好家である場合、スワップまたはスワップメモリ​​という用語はニュースではありません。しかし、残念ながら、多くのLinuxユーザーは、スワップメモリ​​の概念とswappinessを混同する傾向があります。最も一般的な誤解は、swappiness値は、実際のスワッピングプロセスが開始される前に使用可能な最大RAMを示しているというものです。

この広く報告されている誤解を解消するには、スワッピングとスワッピネスの両方の定義を分解する必要があります。

一般的な誤解からのswappinessの利用

swappinessから、スワッピングという用語が考えられます。スワッピングを実行するには、RAM(ランダムアクセスメモリ)にシステムデータが必要です。このデータがスワップファイルやスワップパーティションなどの専用ハードディスクの場所に書き込まれると、システムRAMから必要なスペースが解放されます。このシステムRAMの解放は、スワッピングの定義を構成します。

Linux OSには、swappiness値の構成設定が含まれています。この値の存在は、意図されたシステム機能について多くの誤解を生み続けています。最も一般的なものは、RAM使用量のしきい値との関連付けです。スワッピングの定義から、swappinessは、スワッピングの開始をトリガーする最大RAMストレージ値と誤解されています。

RAM分割ゾーン

前に説明したswappinessの誤解から明確にするために、この誤解が始まった場所から開始する必要があります。まず、ランダムアクセスメモリ(RAM)を確認する必要があります。 RAMの解釈は、LinuxOSの認識とは大きく異なります。 LinuxはRAMを分割メモリゾーンまたはリージョンとして解釈しますが、RAMは単一の同種メモリエンティティと見なされます。

マシンでこれらのゾーンを使用できるかどうかは、使用しているマシンのアーキテクチャによって異なります。たとえば、32ビットアーキテクチャマシンまたは64ビットアーキテクチャマシンである可能性があります。この分割ゾーンの概念をよりよく理解するには、次のx86アーキテクチャのコンピュータゾーンの内訳と説明を検討してください。

  • ダイレクトメモリアクセス(DMA) :ここでは、割り当て可能なメモリ領域またはゾーンの容量は16MBと低くなっています。その名前は、その実装に関連しています。初期のコンピュータは、ダイレクトメモリアクセスアプローチを介してのみコンピュータの物理メモリと通信できました。
  • ダイレクトメモリアクセス32 (DM A 32) :この割り当てられた命名規則に関係なく、DMA32は64ビットLinuxアーキテクチャにのみ適用可能なメモリゾーンです。ここで、割り当て可能なメモリ領域またはゾーン容量は4GBを超えません。したがって、32ビットを搭載したLinuxマシンは、4GBのRAMDMAしか達成できません。この場合の唯一の例外は、LinuxユーザーがPAE(物理アドレス拡張)カーネルを使用することを決定した場合です。
  • 通常 :推定では、64ビットコンピュータアーキテクチャで4GBを超えるマシンRAMの比率は、通常のメモリのメトリック定義と要件を満たしています。一方、32ビットコンピュータアーキテクチャでは、16MBから896MBの通常のメモリが定義されています。
  • M em :このメモリゾーンは、32ビットのLinux搭載コンピュータアーキテクチャでのみ明らかになります。これは、小型マシンの場合は896 MBを超え、大型マシンまたは高性能のハードウェア機能と仕様を備えたマシンの場合は4GBを超えるRAM容量として定義されます。

RAMとPAGESIZEの値

コンピュータのRAM割り当ては、ページ単位で決定されます。これらのページ割り当ては、固定サイズに構成されています。システムカーネルは、これらの固定サイズの割り当ての決定要因です。ページの割り当ては、カーネルがコンピュータアーキテクチャを検出したシステムの起動時に行われます。このようなLinuxコンピュータでは、通常のページサイズは約4キロバイトです。

Linuxマシンのページサイズを決定するには、以下に示すように「getconf」コマンドを使用できます。

$ getconf PAGESIZE

端末で上記のコマンドを実行すると、次のような出力が得られます。

4096

ゾーンとノードの添付ファイル

説明したメモリゾーンは、システムノードに直接接続されています。 CPUまたは中央処理装置は、これらのノードに直接関連付けられます。同じCPUで実行するようにスケジュールされたプロセスでは、メモリを割り当てるときにシステムカーネルが参照するこのノードとCPUの関連付けが必要です。

これらのノードからCPUへの層は、混合メモリタイプのインストールに不可欠です。スペシャリストのマルチCPUコンピューターは、これらのメモリインストールの主なターゲットです。この手順は、Non-UniformMemoryAccessアーキテクチャが使用されている場合にのみ成功します。

このようなハイエンドの要件がある場合、Linuxコンピューターは平均して1つの特定のノードに関連付けられます。そのOS用語はノードゼロです。このノードは、使用可能なすべてのメモリゾーンを所有しています。これらのノードとゾーンには、LinuxOSからもアクセスできます。まず、「/ proc/buddyinfo」ファイルにアクセスする必要があります。次のコマンドを使用して、この目的を達成できます。

$ less /proc/buddyinfo

端末の出力は、次のスクリーンショットのようになります。

ご覧のとおり、私の側からは、DMA、DMA32、および通常ゾーンの3つのゾーンを扱っています。

これらのゾーンのデータの解釈は簡単です。たとえば、DMA32ゾーンを使用すると、いくつかの重要な情報を解明できます。左から右に移動すると、次のことがわかります。

4846: 使用可能なメモリチャンクは、2 ^(0 * PAGESIZE)の4846として解釈できます

3946: 使用可能なメモリチャンクは、2 ^(1 * PAGESIZE)の3946として解釈できます

2490: 使用可能なメモリチャンクは、2 ^(2 * PAGESIZE)

の2490として解釈できます。

0: 使用可能なメモリチャンクは、0 of 2 ^(512 * PAGESIZE)

として解釈できます。

上記の情報は、ノードとゾーンが互いにどのように関連しているかを明らかにしています。

ファイルページと匿名ページ

ページテーブルエントリは、特定のメモリページの使用状況を記録するために必要な手段を備えたメモリマッピング機能を提供します。そのため、メモリマッピングは次の機能フェーズに存在します。

バックアップされたファイル: このタイプのマッピングでは、ここに存在するデータはファイルから発生します。マッピングは、その機能を特定のファイルタイプに制限しません。マッピング関数がそこからデータを読み取ることができる限り、任意のファイルタイプを使用できます。このシステム機能の柔軟性は、システムから解放されたメモリを簡単に再取得し、データを含むファイルが読み取り可能である限り、そのデータを再利用できることです。

偶然にデータの変更がメモリで発生した場合、ハードドライブファイルはデータの変更を記録する必要があります。使用中のメモリが再び解放される前に実行する必要があります。この予防措置を講じないと、ハードドライブファイルはメモリ内で発生したデータの変更を記録できなくなります。

匿名: このタイプのメモリマッピング技術には、デバイスまたはファイルのバックアップ機能はありません。これらのページで利用可能なメモリ要求は、オンザフライとして記述でき、データを緊急に保持する必要があるプログラムによって開始されます。このようなメモリ要求は、メモリスタックとヒープを処理するときにも効果的です。

これらのデータ型はファイルに関連付けられていないため、それらの匿名性には、信頼できる保存場所として瞬時に機能するための何かが必要です。この場合、これらのプログラムデータを保持するためにスワップパーティションまたはスワップファイルが作成されます。これらのデータを保持していた匿名ページが解放される前に、データは最初にスワップに移動します。

バックアップされたデバイス: ブロックデバイスファイルは、システムデバイスをアドレス指定するために使用されます。システムは、デバイスファイルを通常のシステムファイルと見なします。ここでは、データの読み取りと書き込みの両方が可能です。デバイスストレージデータは、デバイスに基づくメモリマッピングを容易にし、開始します。

共有: 単一のRAMページは、複数のページテーブルエントリに対応するか、マッピングすることができます。これらのマッピングのいずれかを使用して、使用可能なメモリ位置にアクセスできます。どちらのマッピングルートでも、最終的なデータ表示は常に同じになります。ここでのメモリ位置は共同で監視されるため、プロセス間通信はデータ交換を通じてより効率的になります。プロセス間通信も、書き込み可能なマッピングが共有されているため、パフォーマンスが高くなります。

コピーオンライト: この割り当て手法は、やや怠惰な方向を向いています。リソース要求が発生し、要求されたリソースがすでにメモリに存在する場合、元のリソースはその要求を満たすようにマップされます。また、リソースは他の複数のプロセスによって共有されている可能性があります。

このような場合、プロセスはそのリソースに書き込もうとする可能性があります。この書き込み操作を成功させるには、そのリソースのレプリカがメモリに存在する必要があります。リソースのコピーまたはレプリカは、有効な変更に対応できるようになります。つまり、メモリ割り当てを開始して実行するのは、この最初の書き込みコマンドです。

議論されたこれらの5つのメモリマッピングアプローチのうち、swappinessはファイルバックページと匿名ページのメモリマッピングルーチンを扱います。したがって、これらは最初に説明した2つのメモリマッピング手法です。

Swappinessを理解する

これまでに取り上げて説明した内容に基づいて、swappinessの定義を簡単に理解できるようになりました。

簡単に言うと、swappinessは、メモリページのスワッピングにおけるシステムカーネルの攻撃性の強度を詳細に示すシステム制御メカニズムです。 swappiness値は、このシステムカーネルの攻撃レベルを識別するために使用されます。カーネルの攻撃性の増加は、swappinessの値が高いことで示されますが、swapの量は値が小さいほど減少します。

値が0の場合、カーネルにはスワッピングを開始するための認証がありません。代わりに、カーネルはスワッピングを開始する前に、ファイルでバックアップされたページと空きページを参照します。したがって、swappinessとswapを比較する場合、swappinessはスワップの上下を集中的に計測する役割を果たします。興味深いことに、swappiness値をゼロに設定しても、スワッピングの実行が妨げられることはありません。代わりに、システムカーネルがいくつかのスワッピング条件が実行可能になるのを待つため、スワッピングを停止するだけです。

Githubは、swappinessの実装に関連するより説得力のあるソースコードの説明と値を提供します。定義上、そのデフォルト値は次の変数宣言と初期化で表されます。

Int vm_swappiness = 60;

swappinessの値の範囲は0〜100です。上記のGithubリンクは、その実装のソースコードを指しています。

理想的なswappiness値

Linuxシステムの理想的なswappiness値は、いくつかの要因によって決まります。これには、コンピューターのハードドライブの種類、ハードウェア、ワークロード、およびサーバーまたはデスクトップコンピューターとして機能するように設計されているかどうかが含まれます。

また、スワップの主な役割は、使用可能なメモリスペースが不足しているときに、マシンのRAMのメモリ解放メカニズムを開始しないことであることに注意する必要があります。スワップの存在は、デフォルトで、正常に機能しているシステムの指標です。これがないということは、Linuxシステムが異常なメモリ管理ルーチンに準拠している必要があることを意味します。

LinuxOSに新しい値またはカスタムのswappiness値を実装した場合の効果は瞬時に発生します。システムを再起動する必要がなくなります。したがって、このウィンドウは、新しいswappiness値の影響を調整および監視する機会です。これらの値の調整とシステム監視は、Linux OSのパフォーマンスと正常性に影響を与えない数値に到達するまで、数日から数週間にわたって行う必要があります。

スワップピネスの値を調整するときは、次の点を考慮してください。

  • まず、設定されたswappiness値として0を実装しても、スワップ機能は無効になりません。代わりに、システムのハードドライブアクティビティがスワップ関連からファイル関連に変更されます。
  • 古いまたは古いコンピュータのハードドライブで作業している場合は、関連するLinuxのswappiness値を減らすことをお勧めします。スワップパーティションチャーンの影響を最小限に抑え、匿名ページの再利用を防ぎます。スワップチャーンが減少すると、ファイルシステムチャーンが増加します。 1つの設定を増やすと別の設定が減るので、Linuxシステムは、2つの方法で平均的なパフォーマンスを生成するのではなく、1つの効果的なメモリ管理方法でより健康的でパフォーマンスが高くなります。
  • データベースサーバーおよびその他の単一目的サーバーには、サプライヤーからのソフトウェアガイドラインが必要です。信頼性の高いメモリ管理と目的に合わせて設計されたファイルキャッシュメカニズムが付属しています。このソフトウェアのプロバイダーは、マシンのワークロードと仕様に基づいて、推奨されるLinuxのswappiness値を提案するように義務付けられています。
  • 平均的なLinuxデスクトップユーザーの場合、特にかなり最近のハードウェアを使用している場合は、すでに設定されているswappiness値を使用することをお勧めします。

Linuxマシンでカスタマイズされたswappiness値を操作する

Linuxのswappiness値を任意のカスタム数値に変更できます。まず、現在設定されている値を知る必要があります。これにより、システム設定のswappiness値をどれだけ増減したいかがわかります。次のコマンドを使用して、Linuxマシンで現在設定されている値を確認できます。

$ cat /proc/sys/vm/swappiness

システムに設定されているデフォルトであるため、60のような値を取得する必要があります。

「sysctl」は、このswappiness値を新しい数値に変更する必要がある場合に役立ちます。たとえば、次のコマンドで50に変更できます。

$ sudo sysctl vm.swappiness=50

Linuxシステムは、再起動することなく、この新しく設定された値をすぐに取得します。マシンを再起動すると、この値がデフォルトの60にリセットされます。上記のコマンドの使用は、主な理由の1つが原因で一時的なものです。これにより、Linuxユーザーは、永続的に使用する予定の固定値を決定する前に、念頭に置いているswappiness値を試すことができます。
システムの再起動が成功した後もswappiness値を永続化する場合は、設定値を「/etc/sysctl.conf」システム構成ファイルに含めます。デモンストレーションのために、nanoエディターを介したこの議論されたケースの次の実装を検討してください。もちろん、Linuxでサポートされている任意のエディターを使用できます。

$ sudo nano /etc/sysctl.conf

この構成ファイルがターミナルインターフェイスで開いたら、一番下までスクロールして、swappiness値を含む変数宣言行を追加します。次の実装を検討してください。

 
vm.swappiness=50

このファイルを保存すれば、準備は完了です。次回のシステムの再起動では、この新しい設定されたswappiness値が使用されます。

最後のメモ

メモリ管理の複雑さは、平均的なLinuxユーザーにとっては頭痛の種になるため、システムカーネルにとって理想的な役割になります。 swappinessはメモリ管理に関連しているため、RAMを使いすぎていると過大評価または考えている可能性があります。一方、Linuxは、ディスクキャッシングなどのシステムの役割に最適な空きRAMを見つけています。この場合、「空き」メモリ値は人為的に低くなり、「使用済み」メモリ値は人為的に高くなります。

実際には、この空きメモリ値と使用済みメモリ値の比例関係は使い捨てです。理由?自分自身をディスクキャッシュとして割り当てる空きRAMは、どのシステムインスタンスでも取得できます。これは、システムカーネルが使用可能メモリスペースと再利用可能メモリスペースの両方としてフラグを立てるためです。


Linux
  1. Podman vs Docker:知っておくべきことすべて

  2. Ubuntu13.04について知っておくべきことすべて

  3. Linux tmpディレクトリ:知っておくべきことすべて

  1. Linuxファイル圧縮:知っておくべきことすべて

  2. Linuxファイルのパーミッション:知っておくべきことすべて

  3. Linuxファイルシステムについて知っておくべきことすべて

  1. LinuxChmodコマンドについて知っておくべきことすべて

  2. Linuxコンテナー(LXC)について知っておくべきことすべて

  3. LinuxUbuntuサーバーについて知っておくべきことすべて