web-dev-qa-db-ja.com

dtraceを使用して、Solaris上のZFSでL2ARCを通過するブロックをトレースする

私の同僚と私は、OpenZFSのL2ARCへの読み取り/書き込みをトレースしようとしています。ブロックオフセット、IOタイプ(読み取り/書き込み)および要求のデバイスIDが必要です。L2ARCデバイスではオフセットは必要ありませんが、オフセット/が必要であることに注意してください。 L2ARCキャッシュを通過するストレージブロックをモデル化するための、元のストレージデバイスからのdevice-id。

OpenZFSソース(github.com/openzfs/openzfs/blob/master/usr/src/uts/common/fs/zfs/arc.c)に目を通し、Brendanのdtraceチュートリアル(dtrace.org/blogs/brendan/2012/ 01/09/activity-of-the-zfs-arc)が役に立ちました。

arc_buf_hdr_t構造体には、探している情報が含まれていると考えています。より正確には、dva_t b_dva;フィールドには、基になるストレージデバイスのオフセットとデバイスIDが含まれ、arc_buf_hdr_tdtraceプローブイベントを介してarc__miss(変数名はhdr)のインスタンスにアクセスできます。これにより、L2ARCの読み取りが可能になりますが、書き込みを取得するのは困難です。つまり、l2arc__writedtraceプローブイベントはこのhdrにアクセスできません、それは shouldio_privateに渡されるzio_tl2arc__write フィールドにありますがテストベッドでは常にNULLであり、意味がありません。

l2arc__write dtraceプローブイベントでDVAを取得するためのクリーンな方法はありますか?

4
trauzti

2015バージョンのOpenIndianaを使用していたことが判明しました。その特定のバージョンでは、hdrzio->io_privateに設定されていませんでした。

2016年からのこのコミット 問題を解決し、2016バージョンのOpenIndianaを使用することで、zio->io_privateを介してhdrにアクセスできます。

1
trauzti