blog

Linuxのメモリ管理機構の紹介

Linuxの初心者の中には、なぜメモリ・フットプリントが高いのかとよく質問する人がいます。Linuxでは、空きメモリがほとんどなく、すべてのメモリがシステムによって占有されているように見えるので、メモ...

Nov 15, 2022 · 8 min. read
シェア

初めて使う人が、なぜメモリフットプリントがこんなに大きいのかと質問するのによく出会います。

Linuxでは、空きメモリが非常に少なく、すべてのメモリがシステムに占有されているように見え、表面的にはメモリが不足しているように感じますが、実際にはそうではありません。これはLinuxのメモリ管理の優れた特徴で、この点でメモリ管理と一線を画しています。主な特徴は、どんなに大きな物理メモリは、Linuxがそれをフルに活用する、いくつかのプログラムでは、メモリにハードディスクのデータを読み取るために呼び出される、メモリの使用は、Linuxシステムのデータアクセスのパフォーマンスを向上させるために高速な特性を読み取り、書き込みます。Windowsは、その一方で、それが必要なときにのみ、アプリケーションのメモリを割り当て、大規模なメモリ空間をフルに活用することはありません。つまり、物理メモリを増設するたびに、Linuxはそれをフルに活用し、ハードウェア投資のメリットを活かすことができますが、Windowsは8GB、あるいはそれ以上増設しても、お飾りとしてしか使いません。

Linuxのこの機能は、主にデータアクセスのパフォーマンスを向上させるために、一部の領域に分割された空き物理メモリをキャッシュやバッファとして使用することです。

ページ・キャッシュはLinuxカーネルに実装されている主要なディスク・キャッシュです。主にディスクへのI/O操作を削減するために使用されます。具体的には、ディスクからのデータを物理メモリにキャッシュすることで、ディスク・アクセスを物理メモリ・アクセスに変換するために使用されます。

ディスク・キャッシュの価値は2つあります:*** ディスクへのアクセスはメモリへのアクセスよりもはるかに遅いため、メモリからデータにアクセスする方がディスクからアクセスするよりも高速です。第二に、一度アクセスされたデータは、短時間で再度アクセスされる可能性が高いことです。

Linuxのメモリ管理メカニズムを見てみましょう:

I. 物理メモリと仮想メモリ

物理メモリから直接データを読み書きする方が、ハードドライブからデータを読み書きするよりもはるかに高速であることを知っているため、データの読み書きはすべて有限であるメモリで行うことが望まれ、物理メモリと仮想メモリの概念が生まれました。

物理メモリは、システムハードウェアによって提供されるメモリのサイズは、物理メモリに相対的な実メモリは、Linuxでは仮想メモリの概念がある、仮想メモリは、物理メモリと提案された戦略の不足を満たすために、それは、ディスク領域の仮想メモリとして使用される論理メモリの一部を仮想化するディスク領域の使用は、スワップ領域と呼ばれます。

物理メモリの拡張として、Linuxは物理メモリが不足したときにスワップパーティションの仮想メモリを使用します。具体的には、カーネルが一時的に使用していないメモリブロックの情報をスワップ領域に書き込むことで、物理メモリを解放し、このメモリブロックを他の用途に使用できるようにし、元の内容を使用する必要があるときに、スワップ領域からこの情報を物理メモリに再読み込みします。

Linuxのメモリ管理はページドアクセスメカニズムを採用しており、物理メモリをフルに活用できるように、カーネルは物理メモリ内の使用頻度の低いデータブロックを適切なタイミングで仮想メモリに自動的にスワップし、使用頻度の高い情報は物理メモリに保持します。

Linuxのメモリ操作メカニズムを深く理解するには、以下の点を知る必要があります:

  1. メモリを必要とするものがない場合でも、Linux は現在使用されていないメモリ・ページをスワップします。これにより、スワップ待ちの時間を回避できます。
  2. Linuxのページスワップは条件付きで、すべてのページが使用されていないときに仮想メモリにスワップされるわけではありません。Linuxカーネルは、「最近使用された」アルゴリズムに従って、使用頻度の低い一部のページファイルだけを仮想メモリにスワップします。しかし、スワップ領域もたくさん使われています。実際には、これは驚くべきことではない、たとえば、実行するメモリの多くを占有するプロセスは、メモリリソースを大量に消費する必要がある、この時点でいくつかの頻繁に使用されないページファイルは、仮想メモリに交換されますが、後で終了し、メモリの多くを解放するためにメモリリソースを大量に占有するこのプロセスは、ちょうど今、ページファイルから交換された自動的に物理メモリに交換されません、そうする必要がない限り、物理メモリは、この瞬間にシステムの多くを解放されます。そうすると、スワップ領域も使用されているのに物理メモリがたくさん空くことになり、先ほどの現象が発生します。このことは気にしないでください。
  3. スワップスペースのページは、使用されるとまず物理メモリにスワップされ、そのページを保持する物理メモリが足りなくなると、またすぐにスワップアウトされるため、仮想メモリにそのスワップされたページを格納するスペースが足りなくなることがあり、結果的にLinuxの誤クラッシュやサービス異常などの問題につながり、Linuxは一定期間自力で復旧することができますがLinuxは一定期間であれば自力で復旧できるものの、復旧したシステムはすでに基本的に使用できません。

したがって、Linuxのメモリを賢く使用する計画を立て、設計することが非常に重要です。

メモリの監視

Linuxのシステム管理者として、それは非常にメモリの使用を監視することが重要です、監視を通じて、メモリの占有率が正常であるかどうか、メモリがタイトであるなど、メモリ使用の状態を理解するのに役立ち、最も一般的に使用されるコマンドのメモリを監視するfree、トップなど、次のシステムフリーの出力です:

[root@linuxeye ~]# free 
             total       used       free     shared    buffers     cached 
Mem:       3894036    3473544     420492          0      72972    1332348 
-/+ buffers/cache:    2068224    1825812 
Swap:      4095992     906036    3189956 

各オプションの意味

*** 列目

total: 物理メモリの合計サイズ

used: 使用された物理メモリのサイズ

free: 空き物理メモリのサイズ

shared: 複数のプロセスで共有されるメモリのサイズ

buffers/cached: ディスクキャッシュのサイズ

2行目 Mem: 物理メモリの使用量を表します。

行目:ディスクキャッシュの使用状況を表します。

4行目:Swapはスワップ領域のメモリ使用状況を示します。

freeコマンドによって出力されるメモリ状態は、カーネルから見た場合とアプリケーション層から見た場合の2つの視点から見ることができます。

カーネルから見たメモリの状態

つまり、カーネルは、追加の操作をせずに、現在に直接割り当てることができる、つまり、Mem項目の値の2行目の上記のフリーコマンドの出力については、このシステムの物理メモリは3894036Kを持っていることがわかりますが、空きメモリはわずか420492K、つまり、40M以上少し、この種の計算を行うには:

- 3473544 = 024492

実際には、総物理メモリからすでに使用されている物理メモリを差し引いたものが空き物理メモリサイズとなります。ここで使用可能なメモリの値420492には、バッファやキャッシュ状態のメモリサイズは含まれていないことに注意してください。

このシステムの空きメモリが少なすぎると思ったら大間違いです。実際、カーネルはメモリの使用量を完全に制御しており、Linuxはメモリが必要になったとき、あるいはシステムが漸進的に稼働しているときに、バッファやキャッシュされたメモリの状態を、システムが使用するメモリの空き状態に変更します。

アプリケーション層から見たシステムメモリの使用状況

つまり、Linux上で実行されているアプリケーションで使用することができるメモリのサイズは、つまり、フリーコマンドの3行目の出力-/+バッファ/キャッシュは、システムが使用中のメモリの唯一の2068224Kを持っていることがわかりますが、空きメモリは1825812Kに達し、このような計算を続けるために:

+ = 2815812

この式は、アプリケーションが使用可能な物理メモリの値が、Mem 項目の空き値とバッファとキャッシュの値の合計であることを示しています。つまり、この空き値にはバッファとキャッシュ項目のサイズが含まれています。なぜなら、buffers/cached はファイル読み込みのパフォーマンスを向上させるように設計されているからです。cached はファイル読み込みのパフォーマンスを向上させるように設計されているため、アプリケーションがメモリを使用する必要がある場合、buffers/cached はアプリケーションが使用できるように素早く回収されます。

バッファとキャッシュの類似点と相違点

Linuxオペレーティング・システムでは、アプリケーションがファイルからデータを読み取る必要がある場合、オペレーティング・システムはまずいくつかのメモリを割り当て、ディスクからこれらのメモリにデータを読み込んでから、アプリケーションにデータを配布します。また、ファイルにデータを書き込む必要がある場合、オペレーティング・システムはまずユーザー・データを受け取るためのメモリを割り当て、メモリからディスクにデータを書き込みます。しかし、ディスクからメモリへの読み出しや、メモリからディスクへの書き込みを行う必要があるデータが大量にある場合、ディスクからのデータの読み出しとディスクへのデータの書き込みの両方が非常に時間とリソースを消費する処理であるため、システムの読み書きのパフォーマンスは非常に低くなります。 このような場合、Linuxはバッファとキャッシュのメカニズムを導入します。

バッファとキャッシュは、システムがファイルだけでなく、ファイルの属性情報を開いている保存するために使用されるメモリ操作は、ので、オペレーティングシステムがいくつかのファイルを読み取る必要がある場合、最初のバッファとキャッシュされたメモリ領域で、もし見つかれば、直接アプリケーションへの送信を読み出し、データが見つからない場合は、オペレーティングシステムのキャッシュ機構は、キャッシュを介して、大幅にオペレーティングシステムのパフォーマンスを向上させるディスクから読み取る必要があります。これは、オペレーティングシステムのキャッシュ機構は、大幅にキャッシュを介して、オペレーティングシステムのパフォーマンスを向上させます。ただし、バッファとキャッシュされたキャッシュの内容は異なります。

バッファはブロックデバイスのバッファに使われ、ファイルシステムのメタデータとインフライトページのトラッキングのみを記録し、キャッシュはファイルのバッファに使われます。もっとわかりやすく言うと、バッファは主にディレクトリの中身やファイルの属性、パーミッションなどを保存するために使われます。キャッシュは、開いているファイルやプログラムを記憶するために直接使われます。

結論が正しいかどうかを確認するためには、キャッシュの変化を確認するためにviを介して非常に大きなファイルを開くことができますし、再びファイルをviは、類似点と相違点は何かを開くには、2つの時間の速度を感じる、速度を開くには2回目ではない****時間よりも大幅に高速ですか?

次に以下のコマンドを実行します:

find /* -name  *.conf 

バッファの値が変わるかどうかを確認し、findコマンドを繰り返して、2つのディスプレイの間で速度がどのように違うかを確認します。

Linuxオペレーティングシステムのメモリ動作原理は、主に設計するサーバーのニーズに基づいて、たとえば、システムのバッファリング機構は、頻繁にファイルとキャッシュにキャッシュされたデータに使用される、Linuxは常に多くのデータや情報をキャッシュするように努めていますので、再びこれらのデータが必要なときにメモリから直接取得することができます、長いディスク操作を持っている必要はありません、このデザインアイデアは、システムの全体的なパフォーマンスを向上させます。

Read next

NECはカメラなしで監視できるよう、地面に敷いたセンサーを押している

日本のNECは、監視装置のターゲットや人、物の軌跡の形状を正確に検出するための微弱電波を打ち上げる計画を持っています。この装置の動作原理は、NECが特別に開発したセンサーの一部と自動分析技術により、物体の動きや対象者のエリアや場所を監視するもので、監視システム全体にはカメラ装置はありません。

Nov 11, 2022 · 1 min read