Estamos estudando o uso do BtrFS em uma matriz de discos SSD e me pediram para verificar se o BtrFS realmente executa operações TRIM ao excluir um arquivo. Até agora não consegui verificar se o comando TRIM é enviado para os discos.
Sei que o BtrFS não é considerado pronto para produção, mas gostamos do que há de mais atual, portanto estou testando. O servidor é o Ubuntu 11.04, versão de 64 bits (mkfs.btrfs versão 0.19). Instalei o kernel do Linux 3.0.0, pois o changelog do BtrFS afirma que o TRIM em massa não está disponível no kernel fornecido com o Ubuntu 11.04 (2.6.38).
Aqui está minha metodologia de teste (adotada inicialmente em http://andyduffell.com/techblog/?p=852 , com modificações para trabalhar com o BtrFS):
- APERTE manualmente os discos antes de iniciar:
for i in {0..10} ; do let A="$i * 65536" ; hdparm --trim-sector-ranges $A:65535 --please-destroy-my-drive /dev/sda ; done
- Verifique se a unidade foi TRIM'd:
./sectors.pl |grep + | tee sectors-$(date +%s)
- Particione a unidade:
fdisk /dev/sda
- Faça o sistema de arquivos:
mkfs.btrfs /dev/sda1
- Montagem:
sudo mount -t btrfs -o ssd /dev/sda1 /mnt
- Crie um arquivo:
dd if=/dev/urandom of=/mnt/testfile bs=1k count=50000 oflag=direct
- Verifique se o arquivo está no disco:
./sectors.pl | tee sectors-$(date +%s)
- Exclua o arquivo de teste:
rm /mnt/testfile
- Veja que o arquivo de teste é TRIM'd do disco:
./sectors.pl | tee sectors-$(date +%s)
- Verifique os blocos TRIM'd:
diff
os doissectors-*
arquivos mais recentes
Nesse ponto, as verificações de pré-exclusão e pós-exclusão ainda mostram os mesmos blocos de disco em uso. Em vez disso, eu deveria ver uma redução no número de blocos em uso. Esperar uma hora (caso demore algum tempo para que o comando TRIM seja emitido) após a exclusão do arquivo de teste ainda mostra os mesmos blocos em uso.
Eu também tentei montar com as -o ssd,discard
opções, mas isso não parece ajudar em nada.
Partição criada a partir de fdisk
cima (mantenho a partição pequena para que a verificação possa ser mais rápida):
root@ubuntu:~# fdisk -l -u /dev/sda
Disk /dev/sda: 512.1 GB, 512110190592 bytes
255 heads, 63 sectors/track, 62260 cylinders, total 1000215216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x6bb7542b
Device Boot Start End Blocks Id System
/dev/sda1 63 546209 273073+ 83 Linux
Meu sectors.pl
script (eu sei que isso é ineficiente, mas faz o trabalho):
#!/usr/bin/perl -w
use strict;
my $device = '/dev/sda';
my $start = 0;
my $limit = 655360;
foreach ($start..$limit) {
printf "\n%6d ", $_ if !($_ % 50);
my @sector = `/sbin/hdparm --read-sector $_ $device`;
my $status = '.';
foreach my $line (@sector) {
chomp $line;
next if $line eq '';
next if $line =~ /$device/;
next if $line =~ /^reading sector/;
if ($line !~ /0000 0000 0000 0000 0000 0000 0000 0000/) {
$status = '+';
}
}
print $status;
}
print "\n";
Minha metodologia de teste é falha? Estou faltando alguma coisa aqui?
Obrigado pela ajuda.
sync
após rmming do arquivo.sync
após remover o arquivo e os resultados ainda eram os mesmos. Vou checar isso quando voltar ao escritório após o fim de semana.Respostas:
Então, depois de muitos dias trabalhando nisso, pude demonstrar que o BtrFS usa o TRIM. Não foi possível que o TRIM funcionasse com êxito no servidor no qual implantaremos esses SSDs. No entanto, ao testar usando a mesma unidade conectada a um laptop, os testes são bem-sucedidos.
Hardware usado para todos esses testes:
Após muitas tentativas fracassadas de verificar o BtrFS no servidor, decidi fazer o mesmo teste usando um laptop antigo (remova a camada da placa RAID). As tentativas iniciais deste teste usando Ext4 e BtrFS no laptop falham (dados não são TRIM).
Em seguida, atualizei o firmware da unidade SSD da versão 0001 (fornecida de fábrica) para a versão 0009. Os testes foram repetidos com Ext4 e BtrFS e os dois sistemas de arquivos TRIM efetuaram os dados com êxito.
Para garantir que o comando TRIM tivesse tempo de executar, fiz uma
rm /mnt/testfile && sync && sleep 120
antes de executar a validação.Uma coisa a observar se você está tentando esse mesmo teste: os SSDs possuem blocos de apagamento nos quais eles operam (não sei o tamanho dos blocos de apagamento Crucial m4). Quando o sistema de arquivos envia o comando TRIM para a unidade, a unidade apaga apenas um bloco completo; se o comando TRIM for especificado para uma parte de um bloco, esse bloco não será TRIM devido aos dados válidos restantes no bloco de exclusão.
Então, para demonstrar do que estou falando (saída do
sectors.pl
script acima). Isso ocorre com o arquivo de teste no SSD. Períodos são setores que contêm apenas zeros. As vantagens têm um ou mais bytes diferentes de zero.Arquivo de teste na unidade:
Arquivo de teste excluído da unidade (após a
sync && sleep 120
):Parece que o primeiro e o último setor do arquivo estão dentro de um bloco de exclusão diferente do restante do arquivo. Portanto, alguns setores foram deixados intocados.
Como exemplo: algumas instruções de teste do Ext4 TRIM solicitam ao usuário que verifique apenas se o primeiro setor foi TRIM do arquivo. O testador deve exibir uma parte maior do arquivo de teste para realmente ver se o TRIM foi bem-sucedido ou não.
Agora, para descobrir por que os comandos TRIM emitidos manualmente enviados ao SSD através do cartão RAID funcionam, mas os comandos TRIM automáticos para não ...
fonte
Com base no que li, pode haver uma falha na sua metodologia.
Você está assumindo que o TRIM resultará no seu SSD zerando os blocos que foram excluídos. Entretanto, este normalmente não é o caso.
http://www.redhat.com/archives/linux-lvm/2011-April/msg00048.html
BTW, eu estava procurando uma maneira confiável de verificar o TRIM e ainda não encontrei uma. Eu adoraria saber se alguém encontra uma maneira.
fonte
Aqui está a metodologia de teste para 10.10 e EXT4. Talvez ajude.
/ubuntu/18903/how-to-enable-trim
Ah, e acho que você precisa do parâmetro descarte na montagem fstab. Não tenho certeza se o parâmetro SSD é necessário, pois acho que ele deve detectar automaticamente o SSD.
fonte
ssd
opção mount para garantir que o BtrFS soubesse usar seu código específico de SSD, mesmo que ele devesse detectar automaticamente. Eu também tentei usardiscard
(como mencionado acima) e não ajudou.Para btrfs, você precisa da
discard
opção para ativar o suporte ao TRIM.Um teste muito simples, mas funcional, para o TRIM funcional está aqui: http://techgage.com/article/enabling_and_testing_ssd_trim_support_under_linux/2
fonte
discard
opção e assd
opção. Os documentos do BtrFS mencionam muito assd
opção, então concentrei meus testes lá, mas nenhuma opção resultou no resultado esperado. A maioria das páginas da web que mostram como testar o TRIM são para Ext4 e similares. O BtrFS não pode ser testado usando essas metodologias devido à diferença no design do sistema de arquivos.hdparm --fibmap
é FS agnóstico. Um bloco em um determinado endereço LBA é zerado ou não, seja a opção extN, btrfs, xfs, jfs ...ssd
é irrelevante para aparar, consulte, por exemplo, esta discussão na lista de discussão btrfs : mail-archive.com/linux-btrfs @ vger.kernel.org / msg10932.html .hdparm --fibmap
mas ele não funciona no BtrFS. Se você olhar para o README do wiper.sh (distribuído ao lado do hdparm), eles explicitamente afirmam que "as chamadas FIEMAP / FIBMAP ioctl () são completamente inseguras quando usadas em um sistema de arquivos btrfs". Então o hdparm foi lançado, o que é muito ruim, pois isso tornaria os testes muito mais fáceis. Eu não sabia que assd
opção não tinha nada a ver com o TRIM, pois os documentos não são muito claros sobre a utilidade da opção.Algumas coisas em que pensar (para ajudar a responder à sua pergunta "estou perdendo alguma coisa?"):
o que exatamente é / dev / sda? um único SSD? ou uma matriz RAID (hardware?) de SSDs?
se este último, que tipo de controlador RAID?
e seu controlador RAID suporta TRIM?
e finalmente,
fonte
Praticamente todos os SSDs com uma interface SATA executam algum tipo de sistema de arquivos com estrutura de log que está completamente oculto para você. O comando SATA 'trim' informa ao dispositivo que o bloco não está mais em uso e que o sistema de arquivos da estrutura de log subjacente pode fazer flash / se / o bloco de apagamento correspondente (que pode ser substancialmente maior) / somente / contém blocos marcados com trim.
Não li os documentos padrão, que estão aqui: http://t13.org/Documents/MinutesDefault.aspx?keyword=trim , mas não tenho certeza se existe alguma garantia de nível padrão que você possa veja os resultados de um comando trim. Se você pode ver alguma coisa mudar, como o primeiro byte sendo zerado no início de um bloco de apagamento, não acho que exista garantia de que isso seja aplicável em diferentes dispositivos ou talvez na versão do firmware.
Se você pensar sobre o modo como a abstração pode ser implementada, deve ser possível tornar o resultado do comando trim completamente invisível para aquele que apenas lê / grava blocos. Além disso, pode ser difícil dizer quais blocos estão no mesmo bloco de apagamento, pois apenas a camada de conversão em flash precisa saber disso e pode ter reordenado-os logicamente.
Talvez haja um comando SATA (comando OEM, talvez?) Para buscar metadados relacionados à camada de conversão flash dos SSDs?
fonte