Мой коллега и я пытаемся отследить чтение / запись в 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
struct содержит информацию, которую мы ищем. Точнее 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?
Оказалось, что мы использовали версию OpenIndiana 2015 года, и в этой конкретной версии hdr
не был установлен zio->io_private
.
Этот коммит от 2016 года решает проблему, и с помощью версии OpenIndiana 2016 года мы можем получить доступ к hdr
через zio->io_private
.