「高価なのに、もっとRAMが必要か」という動機で、ZFSプールのARCがどのように使用されているかを確認しようとしています。
私は128GBの高速ECCを使用しており、L2ARCにNVMe SSDを使用していますが、それでもDDT /スペースマップの組み合わせに関連する小さなIO読み取りスラッシングを大量に実行しています。システムはDDT用に仕様化されており、 3.5x〜4x dedup比なので、「DDT is baad」の返信はしないでください、私は知っていますが、DDTが必要なので、少なくともそのddtを確保することにより、残りの読み取りスラッシングに取り組んでいます最小化/spacemapメタデータは、システムがウォームになると、ほとんどすべてARCに保持されます。
RAMが使用されることを期待している方法は-DDTは約35〜40 GBであり、メタデータ用に85GBのARCを予約するためにsysctlを使用しました。スペースマップのブロックサイズも設定しましたより大きなサイズに変更し、プールのフラグを解除しました(新しいプールにコピーされました)。これは大いに役立っているようです。しかし、さまざまなタイプのメタデータがどれだけロードまたは削除されたかのメトリックが表示されないため(ddt/spacemap/other )、ZFS ddtブロックサイズを設定したり、DDTエントリをARCにプリロードしたりするツールはありません。正確な影響について、またはもっとRAMが役立つかどうか、またはより良くするための他の体系的な方法。
私は解決策を探しました。 zdb
、arc-stats
などは、メタデータARCの状況の内訳を公開せず、すべてのメタデータの一括払いのみを公開します。
より多くのRAMが正確でなくても役立つかどうかを評価するため、または(不正確であっても)より良い感覚を得るために、何が起こっているのかを理解する簡単な方法はありますか?ロード/キャッシュ/削除されているddt/spacemap /「その他」のメタデータMRU/MFUの量の内訳?
特にFreeBSDを使用しているため、この目的のためのarcstatsのような組み込みツールはないと思います。これにはmdb
(illumos/Solarisから)がないと思います。
最も簡単な解決策は、もう少しRAMを与えて、それが役立つかどうかを確認することです。もちろん、それはお金がかかりますが、答えを見つけようとする時間よりも安価かもしれません(あなたはこの仕事に対して報酬を受け取っています)。
次に試すのが最も簡単なのは、テストワークロードの実行中にARCメモリの制限に煩わされることです。これらがワークロードに与える影響は直感的でないことが多いため、すべてのデフォルト設定から始めて、徐々に変更して複雑にすることをお勧めします。たとえば、メタデータ用に予約された最小メモリを設定しようとすると、実際には誤って最大を設定し、説明したようにスラッシングが発生する可能性があります。したがって、これらの設定の「ドキュメント」を注意深く読んでください。
最後に、複雑なデータを分析して質問への回答を決定する能力に少し勇気があり、かなり自信がある場合は、これにDTraceを使用することもできます。このプローブは、ARCでキャッシュミスが発生するたびにトリガーされます。
_DTRACE_PROBE4(arc__miss, arc_buf_hdr_t *, hdr, blkptr_t *, bp,
uint64_t, lsize, zbookmark_phys_t *, zb);
_
したがって、_:::arc_miss
_プローブをリッスンするDスクリプトを記述し、_args[0]
_、_args[1]
_、および/またはバックトレースを使用して、キャッシュが欠落している要求のタイプを特定できます。
_blockptr_t
_の_args[1]
_のタイプを調べるのが最も簡単な方法だと思います。残念ながら、ビットフィールドの一部であるため、抽出するのはやや面倒です。ブロックポインタオブジェクトの定義は ここ であり、DTraceスクリプトでBP_GET_TYPE(args[1])
が出力するものと同じものを出力し、値と比較してそれらの値を解釈する必要があります。 _dmu_object_type
_の ここ から。
または、解釈がより複雑になる可能性のある、より単純なスクリプトをお勧めします。プローブが起動するたびにバックトレースを収集し、トレースを後処理して フレームグラフ を作成して解釈を容易にすることができます。 ZFSのメソッド名は、一般的にかなり説明的です(少なくとも、それらはすべて頭字語を持っています。たとえば、オンラインで検索できる「重複排除テーブル」のddt
)。したがって、呼び出し元がそれを行っていることを理解できるでしょう。仕方。
ファイルやディレクトリのデータではない値が大量に表示される場合は、より多くのメタデータをキャッシュに保持する必要があります。これを行うには、チューナブルを使用してより多くのスペースを割り当てるか、マシンにより多くのRAMを割り当てます。