Ми розглядаємо можливість використання 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):
- Вручну обріжте диски перед запуском:
for i in {0..10} ; do let A="$i * 65536" ; hdparm --trim-sector-ranges $A:65535 --please-destroy-my-drive /dev/sda ; done
- Переконайтеся, що диск був TRIM:
./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:
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
після видалення файлу, і результати все ще були однаковими. Я ще раз перевірю це, хоча коли я знову в офісі після закінчення вихідних.