Como saber o que é armazenado em cache pelo dm-cache?

10

Estou usando o dm-cache com sucesso por um bom tempo agora. Agora eu gostaria de saber quais arquivos estão sendo atualmente no cache. Eu entendo que o dm-cache funciona com blocos, não com arquivos, mas como existe um sistema de arquivos acima, em teoria deve ser possível traduzir isso para (partes de) arquivos que estão sendo armazenados em cache.

É claro que me preocupo com uma solução prática: como posso listar o que está atualmente no dm-cache?

Fabian
fonte

Respostas:

1

De acordo com a documentação do kernel , dm-cachepossui metadados, que é uma família com metadados de thin provisioning:

O destino reutiliza a biblioteca de metadados usada na biblioteca de thin provisioning.

Assim, você pode usar o thin-provisioning-toolspacote, que fornece cache_dump.

O uso desta ferramenta não é muito simples, no entanto. O README sugere que você precise capturar o dispositivo primeiro , mas, mesmo assim, não consegui fazê-lo funcionar.

# cache_dump /dev/mapper/foo-bar_cmeta
syscall 'open' failed: Device or resource busy
Note: you cannot run this tool with these options on live metadata.

Então acabei fazendo algo estranho:

# cp /dev/mapper/foo-bar_cmeta /dev/shm
# losetup --find --show /dev/shm/foo-bar_cmeta
/dev/loop1
# cache_dump /dev/loop1

Resultado:

<superblock uuid="" block_size="128" nr_cache_blocks="16384" policy="smq" hint_width="4">
  <mappings>
    <mapping cache_block="0" origin_block="163832" dirty="false"/>
    <mapping cache_block="1" origin_block="163833" dirty="false"/>
    <mapping cache_block="2" origin_block="163834" dirty="false"/>
    ...
    <mapping cache_block="5295" origin_block="16568" dirty="false"/>
    <mapping cache_block="5296" origin_block="16569" dirty="false"/>
    <mapping cache_block="5297" origin_block="16570" dirty="false"/>

Então, o que temos aqui. Um tamanho de bloco de "128" (setores) e o primeiro bloco ("0") no dispositivo de cache devem ser idênticos ao bloco "163832" do dispositivo de origem. Vamos verificar se faz algum sentido.

Para <mapping cache_block="0" origin_block="163832" dirty="false"/>:

# hexdump -C --skip $((512*128*0)) -n 32 /dev/mapper/foo-bar_cdata 
00000000  61 51 a3 09 88 ad 72 f8  6a 90 7f 93 fd 64 c0 c3  |aQ....r.j....d..|
00000010  e4 01 c5 cf e1 ba 37 53  d0 d8 06 cf 3a da d8 2d  |......7S....:..-|
00000020
# hexdump -C --skip $((512*128*163832)) -n 32 /dev/mapper/foo-bar_corig 
27ff80000  61 51 a3 09 88 ad 72 f8  6a 90 7f 93 fd 64 c0 c3  |aQ....r.j....d..|
27ff80010  e4 01 c5 cf e1 ba 37 53  d0 d8 06 cf 3a da d8 2d  |......7S....:..-|
27ff80020

Para <mapping cache_block="5297" origin_block="16570" dirty="false"/>:

# hexdump -C --skip $((512*128*5297)) -n 32 /dev/mapper/foo-bar_cdata 
14b10000  68 72 65 61 64 5d 3a 20  56 2f 6e 73 48 74 74 70  |hread]: V/nsHttp|
14b10010  20 30 30 30 30 33 44 31  30 3a 20 30 33 20 44 37  | 00003D10: 03 D7|
14b10020
# hexdump -C --skip $((512*128*16570)) -n 32 /dev/mapper/foo-bar_corig 
40ba0000  68 72 65 61 64 5d 3a 20  56 2f 6e 73 48 74 74 70  |hread]: V/nsHttp|
40ba0010  20 30 30 30 30 33 44 31  30 3a 20 30 33 20 44 37  | 00003D10: 03 D7|
40ba0020

Parece bom para mim. Todo o resto é o mesmo "descobrir qual arquivo é onde". Isso pode ser feito com filefrag, hdparm --fibmapou ferramentas específicas do sistema de arquivos como debugfs icheck. Mesmo velho, infelizmente, não significa simples ...

Esta é a abordagem muito estúpida, muito manual:

# echo $((512*128*16570/4096))
265120
# filefrag -v -e *
[...]
File size of firefox-network.log-main.2270 is 605582660 (147848 blocks of 4096 bytes)
 ext:     logical_offset:        physical_offset: length:   expected: flags:
   0:        0..  147847:     163856..    311703: 147848:             last,eof

265120está dentro, 163856..311703então esse é o arquivo! Ou é?

# hexdump -C --skip $((512*128*16570-163856*4096)) -n 32 firefox-network.log-main.2270 
18b90000  68 72 65 61 64 5d 3a 20  56 2f 6e 73 48 74 74 70  |hread]: V/nsHttp|
18b90010  20 30 30 30 30 33 44 31  30 3a 20 30 33 20 44 37  | 00003D10: 03 D7|
18b90020

O DNA combina, o tempo funciona, tudo dá certo.

É claro que me preocupo com uma solução prática: como posso listar o que está atualmente no dm-cache?

Infelizmente, isso não é muito prático até você fazer o script a cada passo do caminho. Não consegui encontrar um script pronto para usar. Então, tudo o que posso oferecer neste momento são os ingredientes necessários. Desculpa :-)

frostschutz
fonte