Rastreando quais blocos passam pelo L2ARC no ZFS no Solaris usando o dtrace

3

Meu colega e eu estamos tentando rastrear as leituras / gravações no L2ARC no OpenZFS. Queremos os offsets de bloco, o tipo de IO (leitura / gravação) e os IDs de dispositivo das solicitações. Observe que não queremos o deslocamento no dispositivo L2ARC, mas queremos o offset / device-id do dispositivo de armazenamento original para modelar quais blocos de armazenamento passam pelo cache L2ARC.

Percorrendo a fonte OpenZFS (github.com/openzfs/openzfs/blob/master/usr/src/uts/common/fs/zfs/arc.c) e usando o tutorial dtrace do Brendan (dtrace.org/blogs/brendan / 2012/01/09 / activity-of-the-zfs-arc) tem sido útil.

Acreditamos que o arc_buf_hdr_t struct contém as informações que estamos procurando. Mais precisamente, o campo dva_t b_dva; contém o deslocamento e o ID do dispositivo de armazenamento subjacente e podemos acessar uma instância de arc_buf_hdr_t (nome da variável é hdr ) por meio do evento de teste arc__miss dtrace. Isso nos dá as leituras L2ARC, mas as gravações são mais difíceis de obter. Ou seja, o evento de teste l2arc__write dtrace não tem acesso a esse hdr , ele should estar no io_private campo no zio_t que é passado para l2arc__write , mas é sempre NULL em nosso testbed, o que não faz sentido para nós.

Existe alguma maneira limpa de obter o DVA no evento de teste l2arc__write dtrace?

    
por trauzti 15.03.2017 / 16:48

1 resposta

1

Acontece que estávamos usando uma versão 2015 do OpenIndiana e, nessa versão específica, o hdr não foi definido em zio->io_private .

Este commit de 2016 resolve o problema e, usando uma versão 2016 do OpenIndiana, podemos obter acesso para hdr via zio->io_private .

    
por 23.03.2017 / 20:43