在之前的章節中我敘述了固態硬碟大部分的內部工作,我可以提供資料來幫助理解應該使用哪種訪問模式一起為何這種模式確實比其它的好。在這個部分,我解釋了寫入和讀取是如何完成的,以及併發的寫入和讀取會相互干擾。我同樣介紹了檔案系統級可以提升效能的一點優化方法。
7. 訪問模式
7.1 定義順序和隨機I/O操作
在接下來的部分,我打算從“順序”或“隨機”入手。如果I/O操作開始的邏輯塊地址(LBA)直接跟著前一個I/O操作的最後LBA,則稱值為順序訪問。如果不是這樣,那這個I/O操作稱為隨機訪問。這很一點重要,因為FTL執行動態對映,相鄰的邏輯空間地址可能被應用於不相鄰的物理空間地址上。
7.2 寫入
基準測試和生產商提供的資料表顯示出,隨機寫入比序列寫入要慢,但這並不總是對的,因為隨機寫入的速度實際上取決於工作負載的型別。如果寫入比較小,小是說小於簇(譯註:關於簇的翻譯請見上一篇文章)大小(就是說 <32MB),那麼是的,隨機寫入比順序寫入慢。然而,如果隨機寫入是按照簇大小對齊的,其效能將會和順序寫入一樣。
解釋如下。如第六節所說,SSD的內部並行機制通過並行和交錯,允許簇中的塊同時訪問。因此,無論是隨機或者序列寫入,都會同樣將資料寫入到多個通道和晶片上,從而執行簇大小的寫入可以確保全部的內部並行都用上了。簇上的寫入操作將在後邊的7.3節解釋。至於效能,如來自 [2]和 [8] 的圖8和圖9所示。當基準測試寫入快取和簇大小(大部分SSD是16或32MB)相同或者更大時,隨機寫入達到和順序寫入同樣高的吞吐量。
圖8:4塊SSD順序寫入負載和隨機寫入負載效率對照——根據Kim et al., 2012 [2] 重製
圖9:3塊SSD順序寫入負載和隨機寫入負載效率對照——根據Min et al., 2012 [8]重製
然而,如果是小寫入——小是指比NAND快閃記憶體頁小,就是說< 16 KB——主控需要做更多的工作以維護用來做塊對映的後設資料上。確實,一些SSD使用樹形的資料結構來實現邏輯塊地址和物理塊地址之間的對映[1],而大量小隨機寫入將轉換成RAM中對映的大量更新。因為這個對映表需要在快閃記憶體中維護[1, 5],這將導致快閃記憶體上的大量寫入。而順序工作負載只會導致少量後設資料的更新,因此快閃記憶體的寫入較少。
隨機寫入並不總是比順序寫入慢
如果寫入很小(就是說比簇大小要小),隨機寫入將比順序寫入慢。如果寫入是按簇大小對齊,隨機寫入將使用所有可用層級上的內部並行,並顯示出和隨機寫入相同的效能。
另外一個原因是,如果隨機寫入很小,其將在塊中引起大量的複製-擦除-寫入操作。另一方面,大於等於塊大小的順序寫入可以使用更快的交換合併優化操作。再者,小隨機寫入顯然會有隨機的無效資料。大量的塊將只有一頁是無效的,而非只有幾個塊全部無效,這樣會導致作廢的頁將遍佈物理空間而非集中在一起。這種現象被稱為內部碎片,並導致清除效率下降,垃圾回收程式通過請求大量的擦除操作才能建立空頁。
最後關於併發性,已有的研究已經顯示出,單執行緒寫入大資料和用很多並非執行緒寫入大量小資料是一樣快的。確實,大寫入可以確保SSD所有的內部並行都用上了。因此試著實現併發的多個寫入並不會提高吞吐量[1, 5]。然而,多並行寫入和單執行緒訪問相比將會有延遲[3, 26, 27]。
一個單一的大寫入比很多小的併發寫入要好
單一的大寫入請求和很多小併發寫入請求相比,表現出相同的吞吐量,但會導致延遲。單一的大寫入比並發寫入在響應時間上表現的更好。因此,只要可能,最好使用大寫入,
當寫入小並且沒有經過組織或快取,多執行緒比較好
很多併發的小寫入請求將比單一的小寫入請求提供更好的吞吐量。因此如果I/O比較小並不能整合到一起,最好是使用多執行緒。
7.3 Reads 讀取
讀取比寫入要快。無論是順序讀取還是隨機讀取,都是這樣。FTL是邏輯塊到物理塊地址的動態對映,並且將寫入分佈到各個通道上。這個方法有時候被稱為“基於寫入順序的”對映[3]。如果資料是以和原本寫入的順序完全不相關,完全隨機讀取的,那就無法保證連續的讀取分佈在不同的通道。甚至有可能連續的隨機讀取訪問的是同一個通道中的不同塊,因此無法從內部並行中獲取任何優勢。Acunu寫了一篇博文講了這個情況,至少在他們測試的硬碟上是這樣,讀取效能和讀取訪問模式與資料原始寫入方式有多相似直接掛鉤[47]。
為了提升讀取效能,將相關資料寫在一起
讀取效能由寫入模式決定。當大塊資料一次性寫入時,其將被分散到不同的NAND快閃記憶體晶片上。因此你應該將相關的資料寫在相同的頁、塊、或者簇上,這樣稍後你可以利用內部並行的優勢,用一個I/O訪問較快的讀取。
下面的圖10表示出一個有兩個通道4塊晶片,每塊晶片只有一個面的SSD。注意這技術上是不成立的,因為SSD每塊晶片都有兩個以上的面,但為了保持圖片簡潔,我決定只讓每塊晶片只有一面。大寫字母代表大小和NAND快閃記憶體塊相同的資料。圖10上邊的操作是順序寫入4個塊:[A B C D],在這個例子裡剛好是一個簇的大小。寫操作通過並行和交錯被分配到四個面上使其更快。即便4個塊在邏輯塊地址上是連續的,但他們儲存在四個不同的面中。
基於寫入順序的FTL,面上所有的塊被選作寫入操作的可能是近乎於相同的,因此簇不必由各自面上相同物理塊地址(PBN)的塊組成。在圖10的例子中,第一個簇由四個不同面上的塊組成,各自面上的PBN分別是1, 23, 11, 和51。
圖10下邊有兩個讀取操作,[A B E F] 和 [A B G H]。對於[A B E F]來說,A和E在同一個面上,這使其必須只從一個通道的兩個面上讀取。對於[A B G H]來說,A、B、G、和H儲存在四個不同的面上,因此[A B G H]能夠同時從兩個通道的四個面上讀取。從更多的面和通道上讀取可以從內部並行上獲得更多的優勢,從而有更好的讀取效能。
圖10: 利用SSD的內部並行
內部並行的一個直接結果是,使用多執行緒同時讀取資料不是提升效能所必須的。實際上,如果這些並不知道內部對映的執行緒訪問這些地址,將無法利用內部並行的優勢,其可能導致訪問相同的通道。同時,併發讀取執行緒可能影響SSD預讀能力(預讀快取)[3]。
一個單一的大讀取比很多小的併發讀取要好
併發隨機讀取不能完全使用預讀機制。並且,多個邏輯塊地址可能被對映到相同的晶片上,不能利用內部並行的優勢。再者,一個大的讀取操作會訪問連續的地址,因此能夠使用預讀快取(如果有的話)。因此,進行大讀取請求更加可取。
SSD生產商通常不說頁、塊和簇的大小。但可以通過執行簡單的工作負載來進行反向工程獲取大部分SSD的基礎特徵[2, 3]。這些資訊可以用在優化讀寫操作的快取大小上,同時可以在格式化硬碟的時候使得分割槽與SSD內部特徵對齊,如8.4節中所說。
7.4 併發讀寫
小的讀和寫交錯會導致效能下降[1, 3]。其主要原因是對於同一個內部資源來說讀寫是相互競爭的,而這種混合阻止了諸如預讀取機制的完全利用。
分離讀寫請求
混合了小讀取和小寫入的工作負載將會阻止內部快取和預讀取機制的正常工作,並導致吞吐量下降。最好是能夠避免同時的讀寫,並以一個一個的較大的資料塊來進行,最好是簇的大小。例如,如果必須更新1000個檔案,你可以遍歷這些檔案,對每個檔案進行讀和寫然後移動到下一個檔案,但這將會很慢。如果一次讀取全部1000個檔案然後一次寫入1000個檔案會更好。
8. 系統優化
8.1 分割槽對齊
如3.1節中解釋的那樣,寫入是頁對齊的。大小是頁大小,並且和頁大小是對齊的寫入請求,會被直接寫入到一個NAND快閃記憶體物理頁中。大小是頁大小,但不對齊的寫入請求將會被寫入到兩個個NAND快閃記憶體物理頁中,並導致兩個讀-改-寫操作[53]。因此,確保用來寫入的SSD分割槽是和硬碟採用的物理NAND快閃記憶體頁的大小對齊是很重要的。很多教程和指引都講了格式化的時候如何將分割槽對齊SSD的引數[54, 55]。稍微Google一下就能知道某型號的SSD的NAND快閃記憶體頁、快閃記憶體塊和簇的大小。就算是沒法拿到這些資訊,通過一些反向工程也可以揭示出這些引數[2, 3]。
有人指出分割槽對齊可以顯著地提高效能[43]。還有人指出,在對某塊硬碟的測試中,繞過檔案系統對硬碟直接進行寫入會提高效能,不過提高很小[44]。
分割槽對齊
為了確保邏輯寫入真的是和物理儲存是對齊的,必須將分割槽和硬碟的NAND快閃記憶體頁大小對齊。
8.2 檔案系統引數
如5.1節所說,並不是所有的檔案系統都支援TRIM命令[16]。Linux 2.6.33及以上,ext4和XFS支援TRIM,但仍需要使用discard引數來啟用。此外,還有一些其它的微調,如果沒有什麼東西需要的話,可以通過移除relatime引數並新增noatime, nodiratime [40, 55, 56, 57] 將後設資料的更新關掉。
啟用TRIM命令
確認你的核心和檔案系統支援TRIM命令。當某個塊被刪除的時候,TRIM命令會通知SSD主控。垃圾回收程式可以在閒的時候後臺擦除這些塊,為面對大寫入工作負載準備硬碟。
8.3 作業系統I/O排程器
Linux上的預設I/O排程器是CFQ排程器(Completely Fair Queuing 完全公平佇列)。CFQ被設計用來通過將物理上接近的I/O請求組合到一起從而最小化機械硬碟尋道時間的。這種請求重新排序對於SSD是 不必要的,因為它們沒有機械部分。幾個指引和討論文章主張將I/O排程器從CFQ換為NOOP或Deadline將會減少SSD的延遲[56, 58]。然而子Linux 3.1版之後,CFQ為固態硬碟提供了一些優化[59]。基準測試同樣顯示出排程器的效能取決於應用在SSD上的工作負載(即應用),和硬碟自身[40, 60, 61, 62]。
我個人從中學到的是,除非工作負載十分特殊並且特定應用的基準測試顯示出某個排程器確實比另一個好,CFQ是一個比較安全的選擇。
8.4 交換分割槽
因為相當數量的I/O請求是由向硬碟上進行頁交換導致的,SSD上的交換分割槽會增加損耗並顯著降低壽命。在Linux核心,vm.swappiness引數控制想硬碟交換頁的頻率。其可用值是0到100,0表示核心需要儘可能的避免交換。以Ubuntu來說,預設swappiness是60。當使用SSD的時候,儘可能降低這個值(就是說設為0)會避免不必要的向硬碟的寫入並增加其壽命[56, 63]。一些教程建議設定為1,而在實踐中實際上和0一樣的[57, 58]。
另外的做法的使用記憶體作為交換分割槽,或者完全避免使用交換分割槽。
8.5 臨時檔案
所有臨時檔案和日誌檔案沒有必要,否則只是浪費SSD的生命週期。一些可以儲存在RAM中的檔案可以使用tmpfs檔案系統[56, 57, 58]。
References
[1] Understanding Intrinsic Characteristics and System Implications of Flash Memory based Solid State Drives, Chen et al., 2009
[2] Parameter-Aware I/O Management for Solid State Disks (SSDs), Kim et al., 2012
[3] Essential roles of exploiting internal parallelism of flash memory based solid state drives in high-speed data processing, Chen et al, 2011
[4] Exploring and Exploiting the Multilevel Parallelism Inside SSDs for Improved Performance and Endurance, Hu et al., 2013
[5] Design Tradeoffs for SSD Performance, Agrawal et al., 2008
[6] Design Patterns for Tunable and Efficient SSD-based Indexes, Anand et al., 2012
[7] BPLRU: A Buffer Management Scheme for Improving Random Writes in Flash Storage, Kim et al., 2008
[8] SFS: Random Write Considered Harmful in Solid State Drives, Min et al., 2012
[9] A Survey of Flash Translation Layer, Chung et al., 2009
[10] A Reconfigurable FTL (Flash Translation Layer) Architecture for NAND Flash-Based Applications, Park et al., 2008
[11] Reliably Erasing Data From Flash-Based Solid State Drives, Wei et al., 2011
[12] http://en.wikipedia.org/wiki/Solid-state_drive
[13] http://en.wikipedia.org/wiki/Write_amplification
[14] http://en.wikipedia.org/wiki/Flash_memory
[15] http://en.wikipedia.org/wiki/Serial_ATA
[16] http://en.wikipedia.org/wiki/Trim_(computing)
[17] http://en.wikipedia.org/wiki/IOPS
[18] http://en.wikipedia.org/wiki/Hard_disk_drive
[19] http://en.wikipedia.org/wiki/Hard_disk_drive_performance_characteristics
[20] http://centon.com/flash-products/chiptype
[21] http://www.thessdreview.com/our-reviews/samsung-64gb-mlc-ssd/
[22] http://www.anandtech.com/show/7594/samsung-ssd-840-evo-msata-120gb-250gb-500gb-1tb-review
[23] http://www.anandtech.com/show/6337/samsung-ssd-840-250gb-review/2
[24] http://www.storagereview.com/ssd_vs_hdd
[25] http://www.storagereview.com/wd_black_4tb_desktop_hard_drive_review_wd4003fzex
[26] http://www.storagereview.com/samsung_ssd_840_pro_review
[27] http://www.storagereview.com/micron_p420m_enterprise_pcie_ssd_review
[28] http://www.storagereview.com/intel_x25-m_ssd_review
[29] http://www.storagereview.com/seagate_momentus_xt_750gb_review
[30] http://www.storagereview.com/corsair_vengeance_ddr3_ram_disk_review
[31] http://arstechnica.com/information-technology/2012/06/inside-the-ssd-revolution-how-solid-state-disks-really-work/
[32] http://www.anandtech.com/show/2738
[33] http://www.anandtech.com/show/2829
[34] http://www.anandtech.com/show/6489
[35] http://lwn.net/Articles/353411/
[36] http://us.hardware.info/reviews/4178/10/hardwareinfo-tests-lifespan-of-samsung-ssd-840-250gb-tlc-ssd-updated-with-final-conclusion-final-update-20-6-2013
[37] http://www.anandtech.com/show/6489/playing-with-op
[38] http://www.ssdperformanceblog.com/2011/06/intel-320-ssd-random-write-performance/
[39] http://en.wikipedia.org/wiki/Native_Command_Queuing
[40] http://superuser.com/questions/228657/which-linux-filesystem-works-best-with-ssd/
[41] http://blog.superuser.com/2011/05/10/maximizing-the-lifetime-of-your-ssd/
[42] http://serverfault.com/questions/356534/ssd-erase-block-size-lvm-pv-on-raw-device-alignment
[43] http://rethinkdb.com/blog/page-alignment-on-ssds/
[44] http://rethinkdb.com/blog/more-on-alignment-ext2-and-partitioning-on-ssds/
[45] http://rickardnobel.se/storage-performance-iops-latency-throughput/
[46] http://www.brentozar.com/archive/2013/09/iops-are-a-scam/
[47] http://www.acunu.com/2/post/2011/08/why-theory-fails-for-ssds.html
[48] http://security.stackexchange.com/questions/12503/can-wiped-ssd-data-be-recovered
[49] http://security.stackexchange.com/questions/5662/is-it-enough-to-only-wipe-a-flash-drive-once
[50] http://searchsolidstatestorage.techtarget.com/feature/The-truth-about-SSD-performance-benchmarks
[51]http://www.theregister.co.uk/2012/12/03/macronix_thermal_annealing_extends_life_of_flash_memory/
[52] http://www.eecs.berkeley.edu/~rcs/research/interactive_latency.html
[53] http://blog.nuclex-games.com/2009/12/aligning-an-ssd-on-linux/
[54] http://www.linux-mag.com/id/8397/
[55] http://tytso.livejournal.com/2009/02/20/
[56] https://wiki.debian.org/SSDOptimization
[57] http://wiki.gentoo.org/wiki/SSD
[58] https://wiki.archlinux.org/index.php/Solid_State_Drives
[59] https://www.kernel.org/doc/Documentation/block/cfq-iosched.txt
[60] http://www.danielscottlawrence.com/blog/should_i_change_my_disk_scheduler_to_use_NOOP.html
[61] http://www.phoronix.com/scan.php?page=article&item=linux_iosched_2012
[62] http://www.velobit.com/storage-performance-blog/bid/126135/Effects-Of-Linux-IO-Scheduler-On-SSD-Performance
[63] http://www.axpad.com/blog/301
[64] http://en.wikipedia.org/wiki/List_of_solid-state_drive_manufacturers
[65] http://en.wikipedia.org/wiki/List_of_flash_memory_controller_manufacturers
[66] http://blog.zorinaq.com/?e=29
[67] http://www.gamersnexus.net/guides/956-how-ssds-are-made
[68] http://www.gamersnexus.net/guides/1148-how-ram-and-ssds-are-made-smt-lines
[69]http://www.tweaktown.com/articles/4655/kingston_factory_tour_making_of_an_ssd_from_start_to_finish/index.html
[70] http://www.youtube.com/watch?v=DvA9koAMXR8
[71] http://www.youtube.com/watch?v=3s7KG6QwUeQ
[72] Understanding the Robustness of SSDs under Power Fault, Zheng et al., 2013 — [discussion on HN]
[73] http://lkcl.net/reports/ssd_analysis.html — [discussion on HN]