使用 dtrace 跟踪 Solaris 上 ZFS 中哪些块经过 L2ARC

使用 dtrace 跟踪 Solaris 上 ZFS 中哪些块经过 L2ARC

我和我的同事正在尝试跟踪 OpenZFS 中 L2ARC 的读取/写入。我们需要块偏移量、IO 类型(读取/写入)和请求的设备 ID。请注意,我们不需要 L2ARC 设备中的偏移量,而是需要原始存储设备的偏移量/设备 ID,以便模拟哪些存储块经过 L2ARC 缓存。

浏览 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,我们可以通过 dtrace 探测事件访问arc_buf_hdr_t(变量名称为hdr)的实例arc__miss。这为我们提供了 L2ARC 读取,但写入更难获得。也就是说,l2arc__writedtrace 探测事件无法访问此hdr,它应该io_privatezio_t传递到的字段l2arc__write但是在我们的测试平台中它始终为 NULL,这对我们来说没有意义。

是否有一些干净的方法可以在 dtrace 探测事件上获取 DVA l2arc__write

答案1

事实证明,我们使用的是 2015 版的 OpenIndiana,而在该特定版本中hdr并未设置zio->io_private

这是 2016 年的提交解决了该问题,通过使用 2016 版 OpenIndiana,我们能够hdr通过进行访问zio->io_private

相关内容