Nous envisageons d'utiliser BtrFS sur un tableau de disques SSD et on m'a demandé de vérifier que BtrFS effectue effectivement des opérations TRIM lors de la suppression d'un fichier. Jusqu'à présent, je n'ai pas pu vérifier que la commande TRIM est envoyée aux disques.
Je sais que BtrFS n'est pas considéré comme prêt pour la production, mais nous aimons le bord de fuite, donc je le teste. Le serveur est une version 64 bits du serveur Ubuntu 11.04 (mkfs.btrfs version 0.19). J'ai installé le noyau Linux 3.0.0 car le journal des modifications BtrFS indique que TRIM en vrac n'est pas disponible dans le noyau livré avec Ubuntu 11.04 (2.6.38).
Voici ma méthodologie de test (initialement adoptée à partir de http://andyduffell.com/techblog/?p=852 , avec des modifications pour fonctionner avec BtrFS):
- TRIM manuellement les disques avant de commencer:
for i in {0..10} ; do let A="$i * 65536" ; hdparm --trim-sector-ranges $A:65535 --please-destroy-my-drive /dev/sda ; done
- Vérifiez que le disque a été TRIM:
./sectors.pl |grep + | tee sectors-$(date +%s)
- Partitionnez le lecteur:
fdisk /dev/sda
- Faites le système de fichiers:
mkfs.btrfs /dev/sda1
- Monter:
sudo mount -t btrfs -o ssd /dev/sda1 /mnt
- Créez un fichier:
dd if=/dev/urandom of=/mnt/testfile bs=1k count=50000 oflag=direct
- Vérifiez que le fichier se trouve sur le disque:
./sectors.pl | tee sectors-$(date +%s)
- Supprimez le fichier de test:
rm /mnt/testfile
- Vérifiez que le fichier de test est TRIM à partir du disque:
./sectors.pl | tee sectors-$(date +%s)
- Vérifiez les blocs TRIM'd:
diff
les deuxsectors-*
fichiers les plus récents
À ce stade, les vérifications pré-suppression et post-suppression affichent toujours les mêmes blocs de disque utilisés. Je devrais plutôt voir une réduction du nombre de blocs en cours d'utilisation. L'attente d'une heure (au cas où il faudrait un certain temps pour que la commande TRIM soit émise) après la suppression du fichier de test affiche toujours les mêmes blocs utilisés.
J'ai également essayé de monter avec les -o ssd,discard
options, mais cela ne semble pas du tout aider.
Partition créée par le fdisk
haut (je garde la partition petite pour que la vérification puisse aller plus vite):
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
Mon sectors.pl
script (je sais que c'est inefficace, mais il fait le travail):
#!/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";
Ma méthodologie de test est-elle défectueuse? Est-ce que j'ai râté quelque chose?
Merci pour l'aide.
sync
après avoir rmé le fichier.
sync
après avoir supprimé le fichier et que les résultats étaient toujours les mêmes. Je vérifierai cela quand je serai de retour au bureau après la fin du week-end.