Мы с коллегой пытаемся отследить чтение / запись в L2ARC в OpenZFS. Нам нужны смещения блоков, тип ввода-вывода (чтение / запись) и идентификаторы устройств запросов. Обратите внимание, что нам не нужно смещение в устройстве L2ARC, но нам нужно смещение / идентификатор устройства от исходного устройства хранения, чтобы смоделировать, какие блоки хранения проходят через кеш L2ARC.
Просмотр исходного кода OpenZFS (github.com/openzfs/openzfs/blob/master/usr/src/uts/common/fs/zfs/arc.c) и использование учебника Брендана по dtrace (dtrace.org/blogs/brendan / 2012/01/09 / activity-of-the-zfs-arc)
Мы полагаем, что структура arc_buf_hdr_t
содержит информацию, которую мы ищем. Точнее, поле dva_t b_dva;
содержит смещение и идентификатор устройства нижележащего запоминающего устройства, и мы можем получить доступ к экземпляру arc_buf_hdr_t
(имя переменной hdr
) через событие зондирования arc__miss
dtrace. Это дает нам чтение L2ARC, но записи труднее получить. А именно, событие зондирования l2arc__write
dtrace не имеет доступа к этому hdr
, он должен быть в поле io_private
в zio_t
, который передается в l2arc__write
, но на нашем стенде он всегда равен NULL, что не соответствует Это имеет для нас смысл.
Есть ли какой-нибудь чистый способ получить DVA на l2arc__write
dtrace probe event?
Оказывается, мы использовали версию 2015 года. OpenIndiana и в этой конкретной версии hdr
не были установлены на zio-> io_private
.
Эта фиксация от 2016 года решает проблему, и, используя версию OpenIndiana 2016 года, мы можем получить доступ к hdr
через zio-> io_private
.