Назад | Перейти на главную страницу

Отслеживание того, какие блоки проходят через 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 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.