FreeBSDはどのようにメモリを割り当てますか?


9

私は、これは単純化/一般説明、しかしであることを認識していますtop(1)6 pools-へのFreeBSDにおける有用性が分裂メモリActiveInactiveWiredCacheBuffersFreetop(1)出力の例:

Mem: 130M Active, 42M Inact, 51M Wired, 14M Cache, 34M Buf, 648K Free
Swap: 512M Total, 512M Free

Active実行中のプロセスによってWired使用され、主にカーネルに使用されます。Inactive閉じたプロセスのメモリであり、再利用が必要な場合に備えてCacheキャッシュされます。データはキャッシュされ、Buffersディスクバッファー(cachedLinuxのfree(1)出力(?)と同様)で、Free完全に未使用のメモリです。FreeBSDがから自動的に割り当てカーネル空間というアム私は正しいInactiveCacheBuffersプールにActiveまたはWired必要に応じて?

回答:


13

短くするために、アクティブワイヤードのメモリが使用されており、メモリを解放するためにスワップアウトすることはできません。一方で、非アクティブが適切にスワップアウトすることができますが、まだ所有している、これは頻繁にメモリを使用しますが、まだ使用されていないので、プロセスまたはカーネルによって(解放されません)。

新しいものは、スワップデバイスに書き込む必要があるダーティメモリページのリストであるランドリーです。ダーティメモリをスワップする必要があるかどうかにかかわらず、それらは非アクティブなキューに戻されます。

ワイヤードメモリは、安全のため(カーネルの場合)、またはユーザーランドプロセスの最適化(ZFSなど)のために、スワップされることは想定されていません。有線メモリはファイルシステムのキャッシュに使用され、カーネルによって解放される場合があります。少なくともZFSの場合、これはほとんど空きメモリと見なすことができます。

空きメモリは間違いなく無料です。

すでにスワップアウトされており、再割り当てが可能な場合にのみキャッシュされるため、キャッシュ(現在は非推奨、おそらく非推奨)を解放する準備ができています。

バッファは、ほとんどのファイルシステム(UFS、FATなど)でキャッシュとして使用され、ファイルシステムで使用されるメモリの量です。それはactice、inactive、またはwiredのいずれかです。

ARC(Adaptive Replacement Cache)はZFSによって使用されるキャッシュであり、必要なときに解放できるメモリです。

メモリに関するFreeBSD Wikiから

メモリクラス

アクティブ

  • ユーザーランドによって「アクティブに」(最近)参照されているページが含まれています
  • クリーンページとダーティページが混在しています
  • ページはページデーモンによって定期的にスキャンされます(各ページはvm.pageout_update_period秒ごとに1回アクセスされます)
  • スキャンは、最後のスキャン以降にページが参照されているかどうかを確認します
  • 参照を見ずに十分なスキャンが完了すると、ページは非アクティブなキューに移動されます
  • 疑似LRUを実装します

非活性

  • アクティブなキューから期限切れになったページが含まれています
  • バッファキャッシュから削除されたページが含まれます
  • クリーンページとダーティページが混在しています
  • メモリが不足している場合、ページはページデーモン(キューの先頭から開始)によってスキャンされます。
    • 参照されたページは、アクティブなキューまたは非アクティブなキューの末尾に戻されます
    • ダーティなページはランドリーキューの末尾に移動されます
    • 参照されていないクリーンなページは解放され、すぐに再利用できます
  • セカンドチャンスLRUを実装

ランドリー

  • ダーティで非アクティブなページを管理するためのキュー。再利用する前にクリーンアップ(「ロンダー」)する必要があります。
  • ページデーモンではなく、独立したスレッドであるランドリースレッドによって管理されます。
  • ランドリースレッドは、非アクティブなキューとランドリーキューのバランスをとるために少数のページを洗濯します
  • ロンダリングの頻度は以下に依存します。
    • ページデーモンが解放しているクリーンページの数。フリーの数が多いほど、洗濯の頻度が高くなります
    • 非アクティブなキューに対するランドリーキューのサイズ。ランドリーキューが増えている場合は、より頻繁に洗濯します
  • ページはランドリースレッドによってスキャンされます(キューの先頭から開始)。
    • 参照されたページは、アクティブキューまたはランドリーキューの末尾に戻されます
    • ダーティページは洗浄され、非アクティブなキューの先頭近くに移動されます

自由

  • システムの他の部分が使用できるメモリ。

有線

  • 非ページング可能メモリ:所有者が明示的に解放するまで解放できません
  • ユーザーランドのメモリはmlock(2)によって配線できます(システムおよびユーザーごとの制限に従う)
  • カーネルメモリアロケータが有線メモリを返す
  • ARCとバッファキャッシュの内容は有線です
  • 一部のメモリは永続的に配線され、決して解放されません(たとえば、カーネルファイル自体)

FreeBSDオペレーティングシステムの章6.12ページ置換の設計と実装から(これ以上完全に正確ではありませんが、古い質問の参照用にここにあります):

カーネルはメインメモリを5つのリストに分割します。

  1. 有線:有線ページはメモリ内でロックされており、ページアウトすることはできません。通常、これらのページはカーネルまたは物理メモリページャーによって使用されているか、mlockでロックされています。さらに、ロードされた(つまり、スワップアウトされていない)プロセスのスレッドスタックを保持するために使用されているすべてのページもワイヤリングされます。
  2. アクティブ:アクティブページは、仮想メモリの1つ以上の領域で使用されています。カーネルはそれらをページアウトすることができますが、そうすることで、アクティブなプロセスがそれらを再びフォールトさせる可能性があります。
  3. 非アクティブ:非アクティブなページはダーティであり、コンテンツがまだ認識されている可能性がありますが、通常はアクティブな領域の一部ではありません。ページのコンテンツがダーティである場合、ページを再利用する前に、コンテンツをバッキングストアに書き込む必要があります。ページがクリーンアップされると、キャッシュリストに移動されます。システムのメモリが不足すると、ページアウトデーモンは、実際に使用されていないページを見つけるために、アクティブページを非アクティブリストに移動しようとする場合があります。アクティブリストから非アクティブリストに移動するページを選択するためにページアウトデーモンが使用する選択基準については、このセクションで後述します。空きメモリとキャッシュのリストが低くなると、ページアウトデーモンは非アクティブリストを走査して、キャッシュと空きページをさらに作成します。
  4. キャッシュ:キャッシュページにはまだ認識されているコンテンツがありますが、マッピングの一部ではありません。それらがアクティブ領域にフォールトされている場合、それらはマッピングの一部ではありません。アクティブな領域で障害が発生した場合、それらはキャッシュリストからアクティブリストに移動されます。それらが読み取りまたは書き込みに使用される場合、それらは最初にキャッシュリストからバッファキャッシュに移動され、最終的に非アクティブリストに解放されます。mlockシステムコールは、キャッシュリストからページを再生し、それをワイヤリングできます。キャッシュリストのページは、ページインされたために変更されていないか、バッキングストアに書き込まれているためにダーティではないことを除いて、非アクティブページに似ています。それらは、ページが必要なときに新しい使用を要求できます。
  5. 無料:無料のページには有用なコンテンツがなく、新しいページフォルト要求を満たすために使用されます。

元の質問に答えるには

FreeBSDカーネルは、必要に応じて、非アクティブ、キャッシュ、およびバッファのプールからアクティブまたは有線にスペースを自動的に割り当てることを訂正しますか?

アクティブなページは、しばらく使用されなかった場合、非アクティブになる可能性があります。カーネルが非アクティブなページをスワップアウトすると、このページはキャッシュリストに移動されます。キャッシュリストのページは、プロセスの仮想マッピングの一部ではありませんが、アクティブまたは有線として簡単に再利用できます。または、バッファキャッシュとしてのI / Oに必要な場合。

有線メモリをメインメモリからスワップアウトすることはできません。プロセスによって配線されている場合、再びアクティブなメモリmunlockになるためには、呼び出しによって配線を解除する必要があります。

アクティブアクティブ、および有線のメモリは、プロセスまたはカーネルによって解放され、空きリストに追加されます。


最初の質問の間違いに気づきました。私は尋ねた「アム私は修正を自動的にFreeBSDカーネルから割り当てスペースInactiveWiredCacheおよびBuffersにプールActiveまたはWired必要に応じて?」私が尋ねることを意図しながら、「アム私はFreeBSDカーネルから自動的に割り当てスペース正しいInactiveCacheBuffersプールがへActiveたりWired、必要に応じて?」。最初の質問を更新しました。だから、一言で言えば、FreeBSDの中に使用されるメモリがあるWired+ Activeとそれら二つのプールは、メモリの追加量を必要とする場合、これはから取られInacativeCachedBuffersまたはFreeプール?
マーティン

@Martinはい、それはほぼ正しいように聞こえます。私はあなたの質問に対する私の答えを更新しました。
Raphael Ahrens
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.