우리는 SSD 디스크 어레이에서 BtrFS를 사용하려고하고 있으며 파일을 삭제할 때 BtrFS가 실제로 TRIM 작업을 수행하는지 확인하라는 요청을 받았습니다. 지금까지 TRIM 명령이 디스크로 전송되었는지 확인할 수 없었습니다.
BtrFS는 생산 준비가 된 것으로 간주되지 않지만 우리는 최첨단을 좋아하므로 테스트하고 있습니다. 서버는 Ubuntu 11.04 서버 64 비트 릴리스 (mkfs.btrfs 버전 0.19)입니다. BtrFS 변경 로그 에 Ubuntu 11.04 (2.6.38)와 함께 제공된 커널에서 대량 TRIM을 사용할 수 없다는 내용 이 표시되어 Linux 3.0.0 커널을 설치했습니다 .
내 테스트 방법론은 다음과 같습니다 ( BtrFS와 함께 작동하도록 수정 된 http://andyduffell.com/techblog/?p=852 ) :
- 시작하기 전에 디스크를 수동으로 트리밍하십시오.
for i in {0..10} ; do let A="$i * 65536" ; hdparm --trim-sector-ranges $A:65535 --please-destroy-my-drive /dev/sda ; done
- 드라이브가 트림되었는지 확인하십시오.
./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되었는지 확인하십시오.
./sectors.pl | tee sectors-$(date +%s)
- TRIM'd 블록 확인 :
diff
가장 최근의 두sectors-*
파일
이 시점에서 사전 삭제 및 사후 삭제 확인에는 여전히 사용중인 동일한 디스크 블록이 표시됩니다. 대신 사용 블록 수가 줄어드는 것을 볼 수 있습니다. 테스트 파일이 삭제 된 후 1 시간을 기다리면 (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
파일을 제거한 후 실행을 시도했지만 결과는 여전히 동일 하다고 말하고 싶습니다 . 주말이 끝나고 사무실로 돌아 왔을 때 다시 확인하겠습니다.