ATA Trim

Z Thomas-Krenn-Wiki
Przejdź do nawigacji Przejdź do wyszukiwania

Polecenie ATA Trim przekazuje systemowi operacyjnemu, który obszar dysku SSD nie jest wykorzystywany i może być postrzegany jako pusty. Jeżeli całkowita pojemność dysku SSD jest wykorzystywana to ATA Trim zwiększa wydajność i żywotność dysku. Jeżeli ATA Trim nie jest możliwy (jak podczas korzystania z kontrolera RAID) to Over-Provisioning przynosi podobne korzyści - jednakże o nieco zmniejszonej pojemności użytkowej (np. 90%).[1]

Wymagania

Aby ATA Trim mogło funkcjonować musi być obsługiwane przez następujące komponenty:

  • przez sam dysk SSD
  • system operacyjny (np. Windows 7[2], jądro Linuksa od wersji 2.6.33[3])
  • przez system plików

ATA Trim z kontrolerem RAID

W połowie sierpnia 2010 nie są nam znane żadne kontrolery RAID, które wspierają ATA TRIM dla dysków SSD w wolumenie RAID.[4][5] Firmware/Driver RAID firmy Intel wspiera od Rapid Storage Technology 9.6 polecenie TRIM wyłącznie dla dysków (w trybie AHCI i trybie RAID), które nie są częścią wolumenu RAID.[6] W przyszłości Intel chce wspierać ATA Trim w macierzach RAID 0.[7]

ATA Trim w Linux Swap Devices

Swap Devices w Linuksie wspierają Discard:[8][9][10]

  • jądro Linuksa wspiera Discard for Trim for Swap Devices od jądra 2.6.29
  • ponieważ niektóre dyski SSD podczas natychmiastowego discard wykazują spadek wydajności to od wersji jądra 2.6.36 jest discard opcjonalny (-d opcja swapon)
  • przy pierwszym uruchomieniu swapon-a cały obszar swap jest nadal poddawany trim, nie zależnie od opcji -d

ATA Trim z Linux Device Mapper

Od jądra 2.6.36 następujące cele wspierają discard:

  • dm-delay
  • dm-linear
  • dm-mpath
  • dm-stripe (raid0)

Od jądra 2.6.38 dodatkowo:

  • dm-mirror (raid1)

ATA Trim z Linux LVM

(Informacje wkrótce)

ATA Trim z Linux Software RAID

Stan listopad 2012

  • ATA Trim w Linux Software RAID jest możliwy od jądra Linuksa 3.7.

Stan sierpień 2012

Status lipiec 2011

  • Linux Software RAID (md) ma zintegrowaną obsługę discard i przez to nie wspiera TRIM. Wykorzystanie dm-mirror Device Mapper do mirroring-u danych z obsługą discard jest wprawdzie możliwe od RHEL 6.1. Jednak Red Hat odradza korzystanie z Linux Software RAID poziomu RAID 1, 4, 5 i 6, gdyż podczas inicjalizacji aplikacji zarządzania RAID (RAID Managment Utilitie) takich jak mdadm wszystkie bloki pamięci masowej są zapisywane w celu zapewnienia poprawnego funkcjonowania sum kontrolnych. A w przypadku kompletnego zapisu dysków SSD, spada jego wydajność i żywotność.[11] Rozwiązaniem byłby tu szeroko zakrojony SSD Over-Provisioning z hdparm.
  • Chris Caputo napisał skrypt (raid1ext4trim.sh-1.4), który umożliwia manualny ATA Trim w Software RAID 1 z systemem plików Ext4.[12][13] Urządzenia typu Slaves macierzy RAID muszą przy tym być kompletnymi dyskami SSD (np. /dev/sda) a nie partycjami (np. /dev/sda1). Skrypt jest dostępny pod hdparm i jest przechowywyany w podkatalogu hdparm-9.37/wiper/contrib/ pakietu źródłowego.

Możliwy przyszły rozwój:

Przykład raid1ext4trim.sh-1.4

Następujący przykład pokazuje raid1ext4trim.sh-1.4 zastosowanym na RAID 1 z metadanymi w wersji 1.0:

[root@localhost ~]# /root/raid1ext4trim.sh-1.4 /dev/md0 /mnt
raid1ext4trim.sh-1.4: TRIM utility for live RAID1 ext4 SATA SSDs, version 1.4, by Chris Caputo, based on Mark Lord's wiper.sh.

Reserve defaulting to 10 megabytes.
Creating temporary file (107219596 KB '/mnt/raid1ext4trim.sh-1.4_TMPFILE.12054') ...
TRIMable constituents of md0: sda sdb
This will be a DRY-RUN only.  Use --commit to do it for real.
Simulating TRIM operations...
TRIM beginning on sda...
(dry-run) trimming 214439200 sectors from 3504 ranges
TRIM finished successfully on sda.
TRIM beginning on sdb...
(dry-run) trimming 214439200 sectors from 3504 ranges
TRIM finished successfully on sdb.
Removing temporary file '/mnt/raid1ext4trim.sh-1.4_TMPFILE.12054'...
Done.
[root@localhost ~]# /root/raid1ext4trim.sh-1.4 --commit /dev/md0 /mnt
raid1ext4trim.sh-1.4: TRIM utility for live RAID1 ext4 SATA SSDs, version 1.4, by Chris Caputo, based on Mark Lord's wiper.sh.

Reserve defaulting to 10 megabytes.
Creating temporary file (107219596 KB '/mnt/raid1ext4trim.sh-1.4_TMPFILE.12137') ...
TRIMable constituents of md0: sda sdb
Beginning TRIM operations...
TRIM beginning on sda...

/dev/sda:
trimming 31080445 sectors from 512 ranges
succeeded

/dev/sda:
trimming 31375361 sectors from 512 ranges
succeeded

/dev/sda:
trimming 31358977 sectors from 512 ranges
succeeded

/dev/sda:
trimming 31440896 sectors from 512 ranges
succeeded

/dev/sda:
trimming 31440896 sectors from 512 ranges
succeeded

/dev/sda:
trimming 31309822 sectors from 512 ranges
succeeded

/dev/sda:
trimming 26432803 sectors from 432 ranges
succeeded
TRIM finished successfully on sda.
TRIM beginning on sdb...

/dev/sdb:
trimming 31080445 sectors from 512 ranges
succeeded
trimming 31375361 sectors from 512 ranges
succeeded
trimming 31358977 sectors from 512 ranges
succeeded
trimming 31440896 sectors from 512 ranges
succeeded
trimming 31440896 sectors from 512 ranges
succeeded
trimming 31309822 sectors from 512 ranges
succeeded
trimming 26432803 sectors from 432 ranges
succeeded
TRIM finished successfully on sdb.
Removing temporary file '/mnt/raid1ext4trim.sh-1.4_TMPFILE.12137'...
Done.
[root@localhost ~]#

Skrypt zastosowany w RAID 1 z metadanymi w wersji 1.2 nie funkcjonuje, gdyż zakłada on, że dane zawsze rozpoczynają się na początku urządzenia:

[root@localhost ~]# /root/raid1ext4trim.sh-1.4 --verbose /dev/md0 /mnt
raid1ext4trim.sh-1.4: TRIM utility for live RAID1 ext4 SATA SSDs, version 1.4, by Chris Caputo, based on Mark Lord's wiper.sh.

Reserve defaulting to 10 megabytes.
Creating temporary file (105760448 KB '/mnt/raid1ext4trim.sh-1.4_TMPFILE.11462') ...
Direct I/O of last extent of tmpfile on sda doesn't match that of md0.  Excluding.
Direct I/O of last extent of tmpfile on sdb doesn't match that of md0.  Excluding.
No constituent of md0 array has a matching checksum.  Aborting.
Removing temporary file '/mnt/raid1ext4trim.sh-1.4_TMPFILE.11462'...
Aborted.
[root@localhost ~]#

Online lub Batched

ATA Trim może usuwać odpowiednie dane z dysku natychmiast podczas trwania usuwania plików (w Linuksie określane jako Online Discard[14][15]) albo cyklicznie udostępniać niewykorzystywane bloki przez programy pomocne (pod Linuksem z FITRIM ioctl określane jako Batched Discard), jak pokazuje poniższa tabela:

System operacyjny/ System plików Automatyczny ATA TRIM
(Dane są natychmiast usuwane)
Manualny ATA TRIM
(Dane są usuwane przez aplikacje)
Windows Vista
Windows XP
Windows Server 2008
Windows Server 2003
- tak, poprzez aplikacje producenta takie
jak Intel Solid State Drive Toolbox
Windows 7
Windows Server 2008 R2
tak[16][17] tak, poprzez aplikacje producenta takie
jak Intel Solid State Drive Toolbox
Linux / Ext4 tak, Online Discard od jądra 2.6.33
(wymaga opcji Ext4 discard)
tak, przez wiper.sh[18] (wykorzystuje hdparm)[19] lub
Batched Discard od jądra 2.6.37 przez fstrim[20][21][22] (zawarte w util-linux 2.19 i nowszej)[23]
Linux / Btrfs tak, Online Discard od jądra Linuksa 2.6.32
(Libata Subsystem wspiera Discard od jądra 2.6.33)
(wymaga opcji Btrfs discard)
tak, Batched Discard od jądra 2.6.39

Przykład: ATA Trim w Ubuntu 10.10

Aby móc korzystać z ATA Trim sam dysk SSD musi wspierać ATA TRIM, jak w poniższym przykładzie ( * pokazuje, że opcja jest dostępna):

root@ubuntu-10-10:~# hdparm -I /dev/sda | grep -i trim
           *        Data Set Management TRIM supported
           *        Deterministic read ZEROs after TRIM
root@ubuntu-10-10:~#

Standardowa konfiguracja bez ATA Trim

W tym teście zapisujemy w pliku litery ABCDEFGHIJKLMNOPQRSTUVWXYZ. Podczas odczytu sektorów z hdparm kod ASCII[24] jest widoczny w formacie heksadecymalny.

Uwaga: w niektórych dyskach SSD (np. Dyski SSD Intel serii 320) jest po poleceniu echo konieczny jeszcze sync, aby hdparm --fibmap podał granice LBA.

root@ubuntu-10-10:~# echo "ABCDEFGHIJKLMNOPQRSTUVWXYZ" > /root/testfile1.txt
root@ubuntu-10-10:~# hdparm --fibmap /root/testfile1.txt

/root/testfile1.txt:
 filesystem blocksize 4096, begins at LBA 61052928; assuming 512 byte sectors.
 byte_offset  begin_LBA    end_LBA    sectors
           0   66989472   66989479          8
root@ubuntu-10-10:~# hdparm --read-sector 66989472 /dev/sda

/dev/sda:
reading sector 66989472: succeeded
4241 4443 4645 4847 4a49 4c4b 4e4d 504f
5251 5453 5655 5857 5a59 000a 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
[...]
root@ubuntu-10-10:~# rm /root/testfile1.txt
root@ubuntu-10-10:~# sync
root@ubuntu-10-10:~# hdparm --read-sector 66989472 /dev/sda

/dev/sda:
reading sector 66989472: succeeded
4241 4443 4645 4847 4a49 4c4b 4e4d 504f
5251 5453 5655 5857 5a59 000a 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
[...]
root@ubuntu-10-10:~#

Konfiguracja z ATA Trim i Online Discard

Z aktywną opcją ext4 Mount discard system plików ext4 wysyła komendę discard/TRIM do dysku. Opcja musi wtedy zostać jeszcze manualnie aktywowana w /etc/fstab, gdyż discard w standardowej konfiguracji jest wyłączony:[25]

discard: Controls whether ext4 should issue discard/TRIM commands to the underlying block device when blocks are freed. This is useful for SSD devices and sparse/thinly-provisioned LUNs, but it is off by default until sufficient testing has been done.

Opcja discard może zostać po prostu dodana jako opcja w /etc/fstab:

[...]
# / was on /dev/sda3 during installation
UUID=1b7be627-fcb5-43b4-a9fb-72c112041c53 /               ext4    errors=remount-ro,discard 0       1
[...]

Po restarcie opcja jest aktywna dla /-partycji:

root@ubuntu-10-10:~# mount
/dev/sda3 on / type ext4 (rw,errors=remount-ro,discard,commit=600)
[...]
root@ubuntu-10-10:~#

Podczas usuwania plików dane na dysku SSD są faktycznie kasowane:

root@ubuntu-10-10:~# echo "ABCDEFGHIJKLMNOPQRSTUVWXYZ" > /root/testfile2.txt
root@ubuntu-10-10:~# sync
root@ubuntu-10-10:~# hdparm --fibmap /root/testfile2.txt

/root/testfile2.txt:
 filesystem blocksize 4096, begins at LBA 61052928; assuming 512 byte sectors.
 byte_offset  begin_LBA    end_LBA    sectors
           0   73902760   73902767          8
root@ubuntu-10-10:~# hdparm --read-sector 73902760 /dev/sda

/dev/sda:
reading sector 73902760: succeeded
4241 4443 4645 4847 4a49 4c4b 4e4d 504f
5251 5453 5655 5857 5a59 000a 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
[...]
root@ubuntu-10-10:~# rm /root/testfile2.txt
root@ubuntu-10-10:~# sync
root@ubuntu-10-10:~# hdparm --read-sector 73902760 /dev/sda

/dev/sda:
reading sector 73902760: succeeded
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
[...]
root@ubuntu-10-10:~#

Dalsze informacje o ATA Trim w Linuksie

Odnośniki

  1. Re: Software RAID and TRIM (Linux Raid Mailing List) As long as your SSDs have some over-provisioning (or you only partition something like 90% of the drive), and it's got good garbage collection, then TRIM will have minimal effect.
  2. http://blogs.msdn.com/b/e7/archive/2009/05/05/support-and-q-a-for-solid-state-drives-and.aspx
  3. http://www.heise.de/open/artikel/ATA-Trim-DRBD-Block-Layer-Virtualisierung-und-Tracing-936993.html
  4. http://www.heise.de/ct/hotline/Kein-Trim-Befehl-im-SSD-RAID-991529.html
  5. SSD TRIM und Adaptec RAID Controller (Adaptec Support Knowledgebase ASK Answer ID 16999)
  6. Intel® Rapid Storage Technology: RAID features by chipset/controller hub (intel.com)
  7. Intel plant ATA-Trim-Unterstützung im RAID-Treiber (heise.de, 22.11.2011)
  8. swap: discard while swapping only if SWAP_FLAG_DISCARD
  9. discard change to swapon(2) and swapon(8) (Hugh Dickins, util-linux-ng mailing list, 24.10.2010)
  10. Re: discard change to swapon(2) and swapon(8) (Hugh Dickins, util-linux-ng mailing list, 09.11..2010)
  11. Chapter 22. Solid-State Disk Deployment Guidelines Red Hat Enterprise Linux 6, Storage Administration Guide (docs.redhat.com)
  12. script for TRIM on RAID1 full-disk arrays with live ext4 filesystems (Linux RAID Mailing List)
  13. hdparm: Detail: 3007001 - TRIM on RAID1 full-disk arrays with live ext4 filesystems (SourceForge.net)
  14. Kernel realtime discard support
  15. Patchwork (2/6) libata: Report supported TRIM payload size The bigger problem for now is that the block layer does not export a way to pass in a vectorized list of ranges to discard.
  16. http://en.wikipedia.org/wiki/TRIM#Operating_system_and_SSD_support
  17. http://www.heise.de/newsticker/meldung/SSD-Hersteller-optimieren-Firmware-fuer-Windows-7-2-Update-842820.html
  18. http://sourceforge.net/projects/hdparm/files/
  19. Re: (PATCH 2/6) libata: Report supported TRIM payload size (linux-scsi mailing list, Greg Freemyer, 19.08.2010) The fundamental problem with hdparm is that because it bypasses most of the kernel i/o stack, it is not compatible with DM/LVM, but I think its a great prototype of what the kernel could do eventually.
  20. http://lwn.net/Articles/383933/
  21. http://www.heise.de/open/artikel/Kernel-Log-Was-2-6-37-bringt-2-Dateisysteme-1144739.html
  22. http://fstrim.sourceforge.net/
  23. fstrim: add new command
  24. http://de.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange#ASCII-Tabelle
  25. http://www.kernel.org/doc/Documentation/filesystems/ext4.txt

Powiązane artykuły

Dyski SSD M.2 i mSATA w serwerach Thomas-Krenn
Secure Erase na dysku SSD
SSD overprovisioning z hdparm