เรากำลังมองหาการใช้ BtrFS ในอาร์เรย์ของดิสก์ SSD และฉันถูกขอให้ตรวจสอบว่า BtrFS นั้นจริงแล้วทำการดำเนินการ TRIM เมื่อทำการลบไฟล์ จนถึงตอนนี้ฉันไม่สามารถตรวจสอบได้ว่าคำสั่ง TRIM ถูกส่งไปยังดิสก์
ฉันรู้ว่า BtrFS นั้นยังไม่พร้อมสำหรับการผลิต แต่เราชอบขอบเลือดที่ไหลออกดังนั้นฉันจึงทำการทดสอบ เซิร์ฟเวอร์คือเซิร์ฟเวอร์ Ubuntu 11.04 ที่วางจำหน่าย 64 บิต (mkfs.btrfs รุ่น 0.19) ฉันได้ติดตั้งเคอร์เนล Linux 3.0.0 เนื่องจากBtrFS changelogระบุว่า 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'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:
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
ไฟล์ rmming
sync
หลังจากลบไฟล์และผลลัพธ์ยังคงเหมือนเดิม ฉันจะตรวจสอบอีกครั้งว่าเมื่อฉันกลับมาที่ออฟฟิศหลังจากวันหยุดสุดสัปดาห์สิ้นสุดลง