使用dtrace跟踪在Solaris上的ZFS中通过L2ARC的块

我的同事和我正试图跟踪OpenZFS中L2ARC的读/写。 我们需要块偏移量,IOtypes(读/写)和请求的设备ID。 请注意,我们不需要L2ARC设备中的偏移量,但是我们需要来自原始存储设备的偏移量/设备ID,以模拟哪些存储块通过L2ARCcaching。

浏览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__miss dtrace探针事件访问arc_buf_hdr_t (variables名是hdr )的arc__miss 。 这给了我们L2ARC的读取,但写入很难得到。 即l2arc__write dtrace探测器事件不能访问这个hdr ,它应该在io_private字段中传递给l2arc__write但是在我们的testing平台中它总是NULL,这对我们来说是没有意义的。

有没有一些干净的方法来获得DVA的l2arc__write dtrace探针事件?

原来,我们使用的是OpenIndiana的2015版本,在这个版本中, hdr没有设置在zio->io_private

从2016年的承诺可以解决这个问题,通过使用2016版的OpenIndiana,我们可以通过zio->io_private访问hdr