Мы рассматриваем возможность использования BtrFS на массиве дисков SSD, и меня попросили проверить, действительно ли BtrFS выполняет операции TRIM после удаления файла. До сих пор я не смог убедиться, что команда TRIM отправлена на диски.
Я знаю, что BtrFS не считается готовым к производству, но нам нравится новейшая технология, поэтому я тестирую ее. Сервер является 64-разрядной версией сервера Ubuntu 11.04 (mkfs.btrfs версия 0.19). Я установил ядро Linux 3.0.0, так как в журнале изменений BtrFS говорится, что основная масса TRIM недоступна в ядре, поставляемом с Ubuntu 11.04 (2.6.38).
Вот моя методология тестирования (первоначально принятая с http://andyduffell.com/techblog/?p=852 , с изменениями для работы с BtrFS):
- Вручную TRIM диски перед запуском:
for i in {0..10} ; do let A="$i * 65536" ; hdparm --trim-sector-ranges $A:65535 --please-destroy-my-drive /dev/sda ; done
- Убедитесь, что диск TRIM'd:
./sectors.pl |grep + | tee sectors-$(date +%s)
- Разбить диск:
fdisk /dev/sda
- Сделайте файловую систему:
mkfs.btrfs /dev/sda1
- Установить:
sudo mount -t btrfs -o ssd /dev/sda1 /mnt
- Создать файл:
dd if=/dev/urandom of=/mnt/testfile bs=1k count=50000 oflag=direct
- Убедитесь, что файл находится на диске:
./sectors.pl | tee sectors-$(date +%s)
- Удалить тестовый файл:
rm /mnt/testfile
- Посмотрите, что тестовый файл TRIM'd с диска:
./sectors.pl | tee sectors-$(date +%s)
- Проверьте блоки TRIM'd:
diff
два последнихsectors-*
файла
На этом этапе проверки перед удалением и после удаления по-прежнему показывают те же блоки диска, которые используются. Вместо этого я должен увидеть уменьшение количества используемых блоков. Ожидание часа (в случае, если для выполнения команды TRIM требуется некоторое время) после удаления тестового файла все еще показывает те же блоки, которые используются.
Я также пробовал монтировать с -o ssd,discard
опциями, но это, похоже, совсем не помогает.
Раздел, созданный fdisk
сверху (я держу раздел маленьким, чтобы проверка могла проходить быстрее):
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
Мой sectors.pl
сценарий (я знаю, что это неэффективно, но он выполняет свою работу):
#!/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";
Моя методика тестирования несовершенна? Я что-то здесь упускаю?
Спасибо за помощь.
sync
файл после изменения файла.
sync
после удаления файла, и результаты остались прежними. Я проверю это дважды, хотя, когда вернусь в офис после выходных.