システムメモリ上…特に「tmpfs」、「shm」、「hugepages…」の違い


16

最近、さまざまなLinuxカーネルメモリベースのファイルシステムについて興味があります。

Note:私の知る限り、タイトルで提示されていることをよりよく理解することと比較すると、以下の質問は多かれ少なかれオプションであると見なされるべきです。それらに答えることで違いを理解するのに役立つと信じているため、以下に質問しますが、私の理解は明らかに制限されているため、他の人がよりよく知っている可能性があります。タイトルに記載されている3つのファイルシステムの違いについての理解を深める答えを受け入れる用意があります。

最終的には、使用可能なファイルシステムをマウントしたいと思いますがhugepages,、いくつかの軽い研究(および、さらに軽い調整)により、a rewritable hugepage mountはオプションではないと信じるようになりました。私は間違っていますか?ここでプレイしているメカニズムは何ですか?

に関しても hugepages:

     uname -a
3.13.3-1-MANJARO \
#1 SMP PREEMPT \
x86_64 GNU/Linux

    tail -n8 /proc/meminfo
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:     8223772 kB
DirectMap2M:    16924672 kB
DirectMap1G:     2097152 kB

/ proc / meminfoおよび/ proc / cpuinfoのフルテキストバージョンです)

上記で何が起こっていますか?既に割り当てていますhugepages?DirectMapメモリページとhugepages?

アップデートは @Gillesからナッジのビットの後、私は上記の4行以上を追加しましたし、私は聞いたことがないと思いますけれども、違いが存在しなければならないようだDirectMapという引っ張って前にtail昨日...多分DMIか何か?

もう少しだけ...

このhugepages試みで成功しなかった場合、およびイメージファイルのハードディスクバックアップを想定した場合tmpfs?、ファイルシステムがswapped最悪のシナリオになっているかどうかからループをマウントするリスクは何ですか?tmpfsファイルシステムキャッシュがマウントされていることを理解しています-マウントされたループファイルがメモリから圧迫されますか これを回避するために実行できる緩和アクションはありますか?

最後に- shm,とにかく正確に何ですか?それはどのように異なるか、含まれていますhugepagestmpfs?


1
その中の前の行はどうですか(または、カーネルバージョンには/proc/meminfo含まれていHugePageません)?これはどのアーキテクチャ(x86_64と思われますか)ですか?
ジル 'SO-悪であるのをやめる'

それらを追加します。長すぎるのではないかと心配していました。
mikeserv 14年

@Gilles-上記のプレーンテキストにリンクしました。大丈夫だと思います。質問してくれてありがとう-私はそもそもそれを含めるべきだった-私はそれを逃した方法がわからない。
mikeserv 14年

回答:


13

tmpfsとshmに違いはありません。tmpfsはshmの新しい名前です。shmはSHaredMemoryの略です。

Linux tmpfsを参照してください。

tmpfsが今日でも使用されている主な理由は、gentooボックスの/ etc / fstabにあるこのコメントです。BTW Chromiumは以下の行がないとビルドしません:

# glibc 2.2 and above expects tmpfs to be mounted at /dev/shm for 
# POSIX shared memory (shm_open, shm_unlink). 
shm                     /dev/shm        tmpfs           nodev,nosuid,noexec     0 0 

Linuxカーネルのドキュメントから出てきました

引用:

tmpfsには次の用途があります。

1)カーネル内部マウントは常に存在し、まったく表示されません
。これは、共有匿名マッピングとSYSV共有
メモリに使用されます。

このマウントはCONFIG_TMPFSに依存しません。CONFIG_TMPFSが設定されていない場合、tmpfsのユーザーに見える部分はビルドされません。しかし、内部
メカニズムは常に存在します。

2)glibc 2.2以降では、
POSIX共有メモリ(shm_open、shm_unlink)のtmpfsが/ dev / shmにマウントされると想定しています。
/ etc / fstabに次の行を追加すると、これが処理されます。

tmpfs / dev / shm tmpfsデフォルト0 0

必要に応じて、tmpfsをマウントするディレクトリを作成することを忘れないでください。

このマウントは、SYSV共有メモリに必要ありません。そのために内部
マウントが使用されます。(2.3カーネルバージョンでは
、SYSV
共有メモリを使用するには、tmpfs(shm fs)の先行バージョンをマウントする必要がありました)

3)一部の人々(私を含む)は、
たとえば/ tmpや/ var / tmp にマウントして大きなスワップパーティションを作成すると非常に便利です。また
、tmpfsファイルのループマウントが機能するようになったため、ほとんどの
ディストリビューションに同梱されているmkinitrd はtmpfs / tmpで成功するはずです。

4)そしておそらく、私はもっと知らない:-)

tmpfsには、サイズ設定のための3つのマウントオプションがあります。

size: このtmpfsインスタンスに割り当てられたバイトの制限。デフォルトは、スワップなしの物理RAMの半分です。tmpfsインスタンスのサイズを大きくしすぎると、OOMハンドラーがそのメモリを解放できないため、マシンがデッドロックします。
nr_blocks:サイズと同じですが、PAGE_CACHE_SIZEのブロック単位です。
nr_inodes:このインスタンスのiノードの最大数。デフォルトは、物理RAMページの数の半分、または(highmemを搭載したマシンでは)lowmem RAMページの数のいずれか小さい方です。

Transparent Hugepage Kernel Docから:

Transparent Hugepage Supportは、すべての未使用メモリをキャッシュまたはその他の移動可能(または移動不可能なエンティティ)として使用できるようにすることで、hugetlbfsの予約アプローチと比較した場合の空きメモリの有用性を最大化します。hugeland割り当ての失敗がユーザーランドから目立つのを防ぐために予約は必要ありません。これにより、ページングおよびその他のすべての高度なVM機能をhugepagesで使用できます。アプリケーションがそれを利用するために変更する必要はありません。

ただし、たとえばmalloc(4k)ごとのmmapシステムコールのフラッドを回避するために以前に最適化されたなど、この機能を利用するためにアプリケーションをさらに最適化できます。ユーザーランドの最適化は必須ではなく、khugepagedは、大量のメモリを扱うhugepageを認識しないアプリケーションであっても、長寿命のページ割り当てをすでに処理できます。


いくつかの計算を行った後の新しいコメント:

HugePageサイズ:2MB
HugePages使用済み:なし/オフ。すべて0で示されていますが、上記の2Mbに従って有効になっています。
DirectMap4k:8.03Gb
DirectMap2M:16.5Gb
DirectMap1G:2Gb

THSの最適化に関する上記の段落を使用すると、メモリの8Gbが4Mのmallocを使用して動作するアプリケーションで使用されているように見えます。16.5Gbは、2Mのmallocを使用するアプリケーションによって要求されています。2Mのmallocを使用するアプリケーションは、2Mセクションをカーネルにオフロードすることにより、HugePageサポートを模倣しています。カーネルによってmallocが解放されると、メモリがシステムに解放されますが、hugepageを使用してtmpfsをマウントすると、システムがリブートされるまで完全なクリーニングは行われないため、これが推奨される方法です。最後に、簡単なものは、1Gbのmallocを要求する2つのプログラムを開いて実行したことです。

読んでいる人にとって、mallocはMemory ALLOCationの略であるCの標準構造です。これらの計算は、DirectMappingとTHSの間のOPの相関関係が正しい可能性があることの証拠となります。また、HUGEPAGE ONLY fsをマウントすると、2MBの増分しか得られませんが、THSを使用してシステムがメモリを管理できるのはほとんど4kブロックであるため、メモリ管理の観点から、malloc呼び出しごとに2044k(2048-4 )使用する他のプロセスの場合。


2
これは本当に良いです-THSは私のDirectMapですか?
mikeserv 14

DirectMappingをグーグルで検索しても答えられず、tmpfsなどに関連するものは何も見つかりませんでした。見つけることができる唯一のことは、Linuxのフレーバーで実行されているOracleデータベースのHugeMemサポートを構成する方法でした。つまり、THSの代わりにHugePagesを使用しています参照しました。ただし、2.6ブランチのすべてのカーネルはTHSをサポートしています。予言として、上記の新しいコメントを参照してください。
eyoung100 14

ええ、私もほとんど出ませんでした。私はHP、THPでいくつかの読書をしました。あなたのコメントにはとても興味があります。これは本当に形を整えています。この最後の部分-HP のみ -これを、巨大ページマウントの上に読み取り/書き込みファイルシステムをマウントできることを意味すると解釈すべきですか?例えば、画像ファイルはhugepageマウントからループマウントされていますか?書き込み可能?
mikeserv 14

はい。適切にマウントすると書き込み可能ですが、次のことに注意してください。1。マウントしてからクリーンアップを担当していること。キャラクター:こんにちは、マイクと申します。各文字が1kであると仮定すると、そのファイルは23kとして保存されます。Hugepageが2MBを提供したため、2025kを無駄にしました。その無駄な動作が、メモリ管理がカーネルに組み込まれた理由です。また、kernel32
eyoung100 14

最後に3。再起動またはクラッシュ時にマウントを失います。
eyoung100 14

4

「DirectMap」の問題に対処するために、カーネルには各ユーザープロセスに割り当てられた仮想マッピングとは別に、物理メモリの線形(「直接」)マッピングがあります。

カーネルはこのマッピングに可能な限り大きなページを使用して、TLBのプレッシャーを削減します。

DirectMap1Gは、CPUが1Gbページをサポートしている場合(バルセロナ以降、一部の仮想環境ではページを無効にします)、カーネルで有効にした場合に表示されます-デフォルトは2.6.29+でオンです。


3

との間には違いはshmありませんtmpfs(実際にtmpfsは、以前のの新しい名前のみshmfsです)。 hugetlbfsは、tmpfsカーネルのヒュージページからスペースを割り当てるベースのファイルシステムであり、追加の設定余裕が必要です(使用方法はDocumentation / vm / hugetlbpage.txtで説明されています)。


これは良い試みであり、もちろん私はそれらのドキュメントを読みました。または、もちろんそうではないかもしれません-しかし、私はこれを100repの賞金のために出すと思いますが、私がする前に、これを拡張できるなら私はあなたにそれを提供します。これまでのところ、あなたはまだ私の理解豊かにしていない -私はそれのほとんどをすでに知っていたが、2つは単に同義語であったことを除いて。いずれにせよ、明日の朝までにこれをより良い答えにできるなら、100repの賞金はあなたのものです。私にとって特に興味深いのDirectMapは、procfs manページにまったく言及がないことです。どうして?
mikeserv 14

1
@mikeserv-DirectMapがどの関数から計算されるかを示すこの差分を見つけました:lkml.org/lkml/2008/11/6/163
slm
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.