Como faço para testar se todas as gravações no meu disco rígido estão alinhadas aos seus setores de 4k?

9

Estou usando o Linux com 4 discos rígidos que usam setores de 4k. Existem várias camadas entre o meu sistema de arquivos e os dispositivos brutos: Discos> Linux Raid 5> dm-crypt> LVM.

Todos os recursos que encontrei explicaram como configurar cada camada para garantir que as gravações em cima dessa camada sejam alinhadas com o limite do setor em 4k. No entanto, não encontrei nada que explique como verificar se as gravações feitas nos discos rígidos estão realmente acontecendo nos limites de 4k.

Não estou interessado em reexaminar minha configuração para usar a lógica para determinar se está alinhada corretamente. Quero examinar o que realmente está acontecendo quando as gravações são feitas no disco.

Como posso registrar ou visualizar os endereços e o tamanho das gravações que estão sendo feitas nos meus discos rígidos, para que eu possa verificar se elas estão alinhadas corretamente?

Brian Pellin
fonte

Respostas:

2

Fiz a mesma pergunta há algum tempo e simplesmente fiz o seguinte:

Escreveu com o shell algumas vezes uma string bastante incomum em um arquivo (algo como "WackaWacka"). Depois, basta pesquisar com um dump hexadecimal (usado od ) o conteúdo real do disco e verificar se a primeira ocorrência da string foi armazenada. exatamente no início de um bloco de 4k.

Dica: Não use um editor - ele pode criar arquivos temporários dos quais você não conhece, que também podem conter as strings. Faça assim:

 $ for i in 1 2 3 4 5 ...
 >  do
 >   echo "WackaWacka!"
 >  done > mytestfile

Portanto, .sh_history pode conter a sequência de pesquisa, mas não 5 vezes seguidas ;-)

E então, basta pesquisar:

 # sync
 # od -c /dev/sda | grep 'W   a   c   k   a'

Bem, é melhor fazê-lo em um disco vazio para evitar a busca por dados de Gigabytes ;-)

ktf
fonte
11
Como o dm-crypt é uma das camadas da minha pilha, essa solução não é suficiente, pois esses caracteres não serão gravados no disco.
Brian Pellin
Isso é ruim. Apenas outra solução em que pude pensar é alterar explicitamente um bloco de 4k em um arquivo e verificar se apenas o conteúdo de um bloco físico no disco foi alterado (ou se dois blocos consecutivos foram afetados) - e isso só funcionará se os dados não forem compactados pela camada de criptografia. No entanto um tem de saber, em qual disco-bloco do arquivo é armazenado e procurando quaisquer mudanças pode ser difícil em grandes discos.
Ktf 28/09/11
2

Escreva um bloco de 4k e observe quantos dados são lidos / gravados com iostat(as colunas 'Blk_read' 'Blk_wrtn'). Se os dados não estiverem alinhados, uma gravação acionará as leituras primeiro e mais de 4k de gravações.

Você precisará tomar cuidado para não medir nenhuma atualização de metadados ... ou apenas abafá-las fazendo milhares de gravações em 4k .... Portanto, verifique se nada mais está verificando discos ou mantendo arquivos abertos (acho lsofque seria suficiente?), abra um novo arquivo, aguarde, execute iostat, escreva 4k no arquivo, sincronize a gravação (ou aguarde um pouco?) e verifique iostatnovamente.

Isso parece dar uma saída razoável para mim:

iostat  -d /dev/hdb3
dd if=/dev/urandom of=/mount/path/ofhdb3/tmptest bs=4k count=10000 conv=fdatasync
iostat  -d /dev/hdb3

iostatA página de manual do Note alega um relatório em blocos de 512 bytes, e vejo que mais de 80000 blocos adicionais foram gravados e nenhum bloco foi lido. Se o seu alinhamento estiver desativado, você verá um número semelhante de leituras (pois para escrever um 4k desalinhado, é necessário ler os dois blocos afetados, modificá-los e escrevê-los de volta). De fato, a única razão pela qual o alinhamento é importante é evitar essas leituras (então é isso que você realmente deseja procurar: uma carga de trabalho de gravação aciona leituras?)

PT
fonte
Você sabe se o iostat está relatando o número de leituras / gravações que o SO faz no dispositivo de bloco ou esse número é baseado na unidade que informa quantos blocos foram lidos e gravados?
Brian Pellin
Suspeito que seja da abstração do dispositivo de bloco do SO, não diretamente da unidade, mas não tenho certeza. Também não tenho certeza se seria "acima" ou "abaixo" da camada dm-crypt.
PT