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