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.