ATA Trim
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
- Shaohua Li udostępnił zestaw patch-y, który ma umożliwić obsługę discard (ATA TRIM): (patch 0/7 v2) MD linear/0/1/10/5 TRIM support
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:
- W czerwcu i lipcu 2011 odbyła się dyskusja o możliwym wspraciu discard dla Linux Software RAID. Vide Linux Software RAID Roadmap.
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
- SSD discard (trim) support (openSUSE Support Database)
- Ubuntu 10.04 LTS zawiera jądro 2.6.32 i nie otrzyma backported Online Discard Support: Trim support missing from Linux kernel (bugs.launchpad.net)
- Does Ubuntu have support for the TRIM command for use with SSD? (askubuntu.com)
- wiper.sh and TRIM on an SSD (ubuntuforums.org)
- How to enable TRIM? (askubuntu.com)
- HOWTO: Configure Ext4 to Enable TRIM Support for SSDs on Ubuntu and Other Distributions (lightrush's Web Nest, 17.10.2010)
- Performance evaluation of Linux Discard Support (Presentation from Lukas Czerner (Red Hat), 12.02.2011)
- Enabling and Testing SSD TRIM Support Under Linux (techgage.com, 06.05.2011)
- TRIM (wiki.ubuntuusers.de)
Odnośniki
- ↑ 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.
- ↑ http://blogs.msdn.com/b/e7/archive/2009/05/05/support-and-q-a-for-solid-state-drives-and.aspx
- ↑ http://www.heise.de/open/artikel/ATA-Trim-DRBD-Block-Layer-Virtualisierung-und-Tracing-936993.html
- ↑ http://www.heise.de/ct/hotline/Kein-Trim-Befehl-im-SSD-RAID-991529.html
- ↑ SSD TRIM und Adaptec RAID Controller (Adaptec Support Knowledgebase ASK Answer ID 16999)
- ↑ Intel® Rapid Storage Technology: RAID features by chipset/controller hub (intel.com)
- ↑ Intel plant ATA-Trim-Unterstützung im RAID-Treiber (heise.de, 22.11.2011)
- ↑ swap: discard while swapping only if SWAP_FLAG_DISCARD
- ↑ discard change to swapon(2) and swapon(8) (Hugh Dickins, util-linux-ng mailing list, 24.10.2010)
- ↑ Re: discard change to swapon(2) and swapon(8) (Hugh Dickins, util-linux-ng mailing list, 09.11..2010)
- ↑ Chapter 22. Solid-State Disk Deployment Guidelines Red Hat Enterprise Linux 6, Storage Administration Guide (docs.redhat.com)
- ↑ script for TRIM on RAID1 full-disk arrays with live ext4 filesystems (Linux RAID Mailing List)
- ↑ hdparm: Detail: 3007001 - TRIM on RAID1 full-disk arrays with live ext4 filesystems (SourceForge.net)
- ↑ Kernel realtime discard support
- ↑ 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.
- ↑ http://en.wikipedia.org/wiki/TRIM#Operating_system_and_SSD_support
- ↑ http://www.heise.de/newsticker/meldung/SSD-Hersteller-optimieren-Firmware-fuer-Windows-7-2-Update-842820.html
- ↑ http://sourceforge.net/projects/hdparm/files/
- ↑ 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.
- ↑ http://lwn.net/Articles/383933/
- ↑ http://www.heise.de/open/artikel/Kernel-Log-Was-2-6-37-bringt-2-Dateisysteme-1144739.html
- ↑ http://fstrim.sourceforge.net/
- ↑ fstrim: add new command
- ↑ http://de.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange#ASCII-Tabelle
- ↑ http://www.kernel.org/doc/Documentation/filesystems/ext4.txt