Estamos estudiando el uso de BtrFS en una matriz de discos SSD y me han pedido que verifique que BtrFS realmente realice operaciones TRIM al eliminar un archivo. Hasta ahora no he podido verificar que el comando TRIM se envíe a los discos.
Sé que BtrFS no se considera listo para la producción, pero nos gusta la vanguardia, por lo tanto, lo estoy probando. El servidor es Ubuntu 11.04 versión de servidor de 64 bits (mkfs.btrfs versión 0.19). He instalado el kernel de Linux 3.0.0 ya que el registro de cambios de BtrFS indica que el TRIM masivo no está disponible en el kernel que se incluye con Ubuntu 11.04 (2.6.38).
Aquí está mi metodología de prueba (inicialmente adoptada de http://andyduffell.com/techblog/?p=852 , con modificaciones para trabajar con BtrFS):
- RECORTAR manualmente los discos antes de comenzar:
for i in {0..10} ; do let A="$i * 65536" ; hdparm --trim-sector-ranges $A:65535 --please-destroy-my-drive /dev/sda ; done
- Verifique que la unidad se haya RECORTADO:
./sectors.pl |grep + | tee sectors-$(date +%s)
- Particionar el disco:
fdisk /dev/sda
- Haz el sistema de archivos:
mkfs.btrfs /dev/sda1
- Montar:
sudo mount -t btrfs -o ssd /dev/sda1 /mnt
- Crea un archivo:
dd if=/dev/urandom of=/mnt/testfile bs=1k count=50000 oflag=direct
- Verifique que el archivo esté en el disco:
./sectors.pl | tee sectors-$(date +%s)
- Eliminar el archivo de prueba:
rm /mnt/testfile
- Vea que el archivo de prueba se TRIME desde el disco:
./sectors.pl | tee sectors-$(date +%s)
- Verifique los bloques TRIM'd:
diff
los dossectors-*
archivos más recientes
En este punto, las verificaciones previas y posteriores a la eliminación aún muestran los mismos bloques de disco en uso. En cambio, debería ver una reducción en el número de bloques en uso. Esperar una hora (en caso de que tarde un tiempo en emitirse el comando TRIM) después de que se elimine el archivo de prueba aún muestra los mismos bloques en uso.
También he intentado montar con las -o ssd,discard
opciones, pero eso no parece ayudar en absoluto.
Partición que se creó desde fdisk
arriba (mantengo la partición pequeña para que la verificación pueda ir más rápido):
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
Mi sectors.pl
script (sé que esto es ineficiente, pero hace el trabajo):
#!/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";
¿Mi metodología de prueba es defectuosa? ¿Me estoy perdiendo de algo?
Gracias por la ayuda.
sync
después de ejecutar el archivo.
sync
después de eliminar el archivo y los resultados seguían siendo los mismos. Aunque volveré a comprobarlo cuando regrese a la oficina después de que termine el fin de semana.