私の同僚と私は、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_t
dtraceプローブイベントを介してarc__miss
(変数名はhdr
)のインスタンスにアクセスできます。これにより、L2ARCの読み取りが可能になりますが、書き込みを取得するのは困難です。つまり、l2arc__write
dtraceプローブイベントはこのhdr
にアクセスできません、それは shouldio_private
に渡されるzio_t
の l2arc__write
フィールドにありますがテストベッドでは常にNULLであり、意味がありません。
l2arc__write
dtraceプローブイベントでDVAを取得するためのクリーンな方法はありますか?
2015バージョンのOpenIndianaを使用していたことが判明しました。その特定のバージョンでは、hdr
がzio->io_private
に設定されていませんでした。
2016年からのこのコミット 問題を解決し、2016バージョンのOpenIndianaを使用することで、zio->io_private
を介してhdr
にアクセスできます。