"Garbage collection in SSDs" (Thu gom "rác" trong ổ SSD) là bài viết đóng góp của tác giả Kent Smith - giám đốc tiếp thị sản phẩm cấp cao thuộc bộ phận linh kiện flash của LSI Corporation. Bài viết có tầm quan trọng dành cho bất cứ ai mạo hiểm bước vào thế giới ổ SSD ngày nay.
Thu gom "rác" (garbage collection - GC):
GC là một tiến trình cơ bản với tất cả ổ đĩa thể rắn (solid state drive - SSD), nhưng nó có thể được thực thi theo các cách khác nhau, có thể tác động đến hiệu suất và độ bền tổng thể của ổ SSD. Trong bài viết này, chúng ta sẽ tìm hiểu tiến trình GC hoạt động như thế nào, cách nó thực thi, nó liên quan gì đến lệnh TRIM và dung lượng dự phòng (overprovisioning - OP).
Không giống như ổ đĩa cứng (HDD), bộ nhớ flash NAND không thể ghi đè lên dữ liệu hiện có, đầu tiên chúng phải tẩy xóa dữ liệu cũ trước khi ghi dữ liệu mới vào cùng một vị trí. Với ổ SSD, GC là tên tiến trình di dời các dữ liệu hiện có đến các vị trí mới và cho phép tẩy xóa dữ liệu không hợp lệ. Bộ nhớ flash được chia thành nhiều khối, mỗi khối chia thành nhiều trang. Dữ liệu có thể được ghi trực tiếp vào một trang trống, nhưng khi xóa thì phải tẩy xóa theo khối. Vì vậy, để lấy lại không gian đã lưu bởi các dữ liệu không hợp lệ, đầu tiên tất cả các dữ liệu hợp lệ từ một khối phải được sao chép, sau đó ghi vào các trang trống của một khối mới. Chỉ khi đó dữ liệu không hợp lệ trong khối ban đầu mới được tẩy xóa, để sẵn sàng cho dữ liệu hợp lệ mới được ghi.
Tiến trình này được minh họa trong Hình 1 (bên dưới). Cột thứ nhất hiển thị các trang ABCD được ghi vào khối X. Sau đó dữ liệu thay đổi, do đó các trang A'B'C'D' được ghi và các trang ABCD ban đầu được đánh dấu không hợp lệ (hiển thị trong cột hai). Đồng thời, dữ liệu mới được ghi vào các trang EFGH. Cột hai cho thấy những thay đổi và bây giờ khối X đã đầy, nhưng đang chứa không gian dữ liệu không hợp lệ (ABCD). Khối X chỉ được thu hồi khi toàn bộ khối được tẩy xóa.
Muốn đạt được điều này, dữ liệu hợp lệ trong khối X phải được chuyển đến một khối mới để khối ban đầu có thể được tẩy xoá, sử dụng cho lần sau. Cột ba cho thấy dữ liệu từ các trang ABCD cũng như EFGH được ghi vào một khối mới (Y), vì vậy không gian từ khối X có thể được thu hồi bằng cách tẩy xóa nó. Các hoạt động ghi từ bước này không xuất phát từ máy chủ và là nguồn gốc của khuếch đại ghi (write amplification - WA) tăng lên trong ổ SSD, nghĩa là bộ nhớ flash trong ổ SSD đang được ghi nhiều hơn so với các lệnh ghi ban đầu đến từ máy chủ. Do bộ nhớ flash có số chu kỳ tẩy xóa và ghi hạn chế nên hoạt động này phải được giảm thiểu tối đa nếu có thể, nhưng nó vẫn là phần cần thiết trong hoạt động của SSD.
Hình 1. Tiến trình thu gom rác trên ổ SSD.
Lưu ý rằng mức độ hao mòn (wear leveling) thường xảy ra trong tiến trình GC, khi dữ liệu được ghi vào một loạt các khối mới để dàn trải trên khắp bộ nhớ của SSD. Bộ nhớ flash có số lần ghi hạn chế, nhưng vẫn phải duy trì trong suốt "cuộc đời" của ổ đĩa, nếu dữ liệu luôn được ghi vào cùng một khối, "tuổi thọ" chu kỳ ghi của khối đó sẽ sớm bị "cạn kiệt" so với tất cả các khối khác. Điều này dẫn đến khối đó phải "về hưu" sớm, dần dần làm giảm dung lượng còn trống, cũng như dung lượng tối đa của ổ SSD. Cách lý tưởng nhất, tất cả các khối của ổ đĩa cần phải bị hao mòn ở mức như nhau trong suốt cuộc đời của ổ đĩa.
Nhận biết của hệ điều hành (HĐH) khác với nhận biết của ổ SSD:
Trong hệ thống sử dụng ổ cứng, HĐH chỉ đơn giản yêu cầu dữ liệu mới được ghi vào cùng vị trí của dữ liệu cũ, đang là dữ liệu không hợp lệ, để lưu trữ và HDD sẽ trực tiếp ghi đè lên dữ liệu cũ này. Tuy nhiên, trong hệ thống sử dụng SSD, đầu tiên trang phải được tẩy xoá trước khi nó có thể được ghi vào cùng vị trí trước đây đang chứa dữ liệu, SSD không thể trực tiếp ghi đè lên dữ liệu hiện có như đã nói ở trên.
HĐH hiểu rõ các tập tin, cấu trúc tập tin, và những vị trí logic nơi chúng được lưu trữ, nhưng lại không hiểu cấu trúc lưu trữ vật lý của các thiết bị lưu trữ. Trong bất kỳ hệ thống lưu trữ nào, thiết bị lưu trữ không biết cấu trúc tập tin, nó chỉ đơn giản biết rằng có bao nhiêu byte dữ liệu được ghi vào trong các sector xác định. Hệ thống lưu trữ, dù SSD hay HDD, đáp trả lại dữ liệu từ các vị trí vật lý khi HĐH yêu cầu dữ liệu từ các vị trí logic tương ứng.
Khi HĐH xóa tập tin, nó chỉ đơn giản đánh dấu không gian được dùng cho dữ liệu đó là trống trong bảng dữ liệu logic. Với ổ HDD, HĐH không cần phải báo gì cho nó biết về hoạt động xóa này vì nó chỉ cần ghi dữ liệu mới vào cùng vị trí vật lý đó trong tương lai. Trong trường hợp ổ SSD, nó chỉ nhận biết được rằng các dữ liệu đã bị xóa (không hợp lệ) khi HĐH cố gắng ghi vào vị trí đó một lần nữa. Lúc đó SSD đánh dấu dữ liệu cũ là không hợp lệ và ghi dữ liệu mới vào một vị trí vật lý mới, đồng thời thi hành tiến trình GC, nhưng điều này khác nhau giữa các kiến trúc SSD và các điều kiện khác.
Lệnh TRIM:
Trong các HĐH mới như Windows 7, Windows Server 2008 R2, Linux 2.6.33, FreeBSD 8.2, Open Solaris, Mac OS X Lion, lệnh TRIM cho phép HĐH thông báo cho ổ SSD biết rằng những dữ liệu cũ không còn hợp lệ và HĐH sẽ xóa các địa chỉ khối logic từ bảng logic. Ưu điểm của lệnh TRIM là nó cho phép tiến trình GC của SSD bỏ qua những dữ liệu không hợp lệ thay vì phải di chuyển chúng, nhờ đó tiết kiệm thời gian không phải ghi lại các dữ liệu này. Điều này làm giảm số chu kỳ tẩy xóa trên bộ nhớ flash, cho phép hiệu suất cao hơn trong quá trình ghi. SSD không nhất thiết phải xóa ngay hay thu gom các vị trí này, chỉ cần đánh dấu chúng là không còn hợp lệ.
Sự khác nhau giữa GC không sử dụng và có sử dụng lệnh TRIM được minh họa trong Hình 2 và 3.
Hình 2 (bên dưới) miêu tả tiến trình GC không sử dụng lệnh TRIM. Trong cột 1, người dùng SSD ghi 4 tập tin mới ABCD vào ổ đĩa. HĐH "nhìn thấy" các tập tin này trong bảng logic của nó (OS Logical View), và ổ SSD có hai "cách nhìn" logic và vật lý (SSD Logical View và Physical View) của không gian hiện có. Trong cách nhìn vật lý bao gồm không gian OP, đây không phải là phần dung lượng của ổ đĩa được HĐH biết đến, nói cách khác HĐH không biết OP trong SSD.
Trong cột 2, người dùng xóa tập tin C, nhưng SSD không biết tập tin này đã bị xóa do lệnh TRIM không được sử dụng. Nếu thi hành GC vào thời điểm này, nó sẽ di chuyển dữ liệu không hợp lệ trong tập tin C bởi vì nó không biết dữ liệu này không còn hợp lệ. Trong cột 3, người dùng ghi một tập tin mới E, HĐH thông báo SSD sử dụng cùng không gian như đã được dùng từ tập tin cũ C, và SSD ghi tập tin mới này vào không gian trống, đồng thời đánh dấu không gian cũ từ tập tin C đã sẵn sàng để thi hành GC.
Hình 2. Tiến trình thu gom rác không sử dụng lệnh TRIM trên ổ SSD.
Hình 3 (bên dưới) cho thấy sự khác biệt do tiến trình GC có sử dụng lệnh TRIM. Trong trường hợp này, tiến trình như nhau khi người dùng ghi 4 tập tin ban đầu. Tuy nhiên, khi người dùng xóa tập tin C ở cột 2, không gian tập tin này ngay lập tức được đánh dấu là không hợp lệ để chuẩn bị cho GC bởi vì hệ điều hành sử dụng lệnh TRIM. Không gian ban đầu chứa tập tin C bây giờ trống trên SSD và sẵn sàng để sử dụng nhờ tiến trình OP động, có nghĩa là SSD có nhiều không gian trống hơn trong khi GC, giúp cải thiện hiệu suất tổng thể của SSD.
Trong cột 3, khi người dùng ghi tập tin E, tổng dung lượng trống trên SSD bây giờ cũng giống như trường hợp ổ đĩa không sử dụng lệnh TRIM. Sự khác biệt ổ chỗ SSD có hỗ trợ TRIM biết những dữ liệu nào không hợp lệ và coi nó là không gian trống trong khi GC, giúp ngăn chặn việc di chuyển dữ liệu không hợp lệ sang khối khác.
Hình 3. Tiến trình thu gom rác có sử dụng lệnh TRIM trên ổ SSD.
Vậy lệnh TRIM mang lại 3 lợi ích chính:
Khuếch đại ghi thấp hơn. Dữ liệu được ghi lại ít hơn và không gian trống nhiều hơn trong khi GC.
Thông lượng cao hơn nhờ tránh tình trạng bị nghẽn cổ chai. Bởi vì trong thời gian đang thi hành GC, ổ đĩa phải tạm ngưng truyền dữ liệu từ máy chủ để di chuyển dữ liệu. Với lệnh TRIM, nhờ biết được những dữ liệu không hợp lệ, SSD khỏi phải di chuyển chúng trong quá trình GC. Tóm lại, có ít dữ liệu hơn phải di chuyển trong khi GC, ổ đĩa sẽ chạy nhanh hơn.
Cải thiện độ bền. Ổ đĩa ghi vào bộ nhớ flash ít hơn bằng cách không ghi lại những dữ liệu không hợp lệ.
Lưu ý: Ngày nay, lệnh TRIM không hoạt động trên hầu hết môi trường RAID do trình điều khiển (driver) RAID hiện tại chưa hỗ trợ. Khi các nhà sản xuất RAID có thể thực hiện thay đổi trong trình điều khiển của họ, hy vọng rằng dần dần TRIM sẽ hoạt động và mang lại lợi ích cho hầu hết môi trường RAID, cũng như môi trường không RAID.
[Để tìm hiểu về RAID, vui lòng đọc bài viết Giải thích các cấp độ RAID].
Công nghệ DuraWrite và lệnh TRIM:
Công nghệ DuraWrite, được tìm thấy trong các Bộ xử lý Lưu trữ Flash (Flash Storage Processor - FSP) của LSI SandForce, mang lại những lợi ích tương tự như lệnh TRIM dù có hay không có sự hiện diện của TRIM. Và khi TRIM hiện diện, DuraWrite tạo ra nhiều không gian trống trên ổ SSD hơn nếu không có. Hình 4 (bên dưới) sẽ minh họa cho công nghệ này.
Hình 4: Bộ điều khiển SSD có DuraWrite so với không có DuraWrite và lệnh TRIM.
Trong ổ SSD thông thường không có công nghệ DuraWrite (hàng trên - Competitive SSDs No DuraWrite), không gian trống cho GC (Free Space for GC) và dữ liệu đang chờ xóa (Data Pending Delete) chia sẻ cùng một không gian (cột bên trái - OS w/o TRIM). Có ít không gian có sẵn cho GC, do đó ổ đĩa phải mất nhiều thời gian thi hành GC để sử dụng hiệu quả không gian có sẵn. Trong trường hợp ổ đĩa này có hỗ trợ TRIM (cột bên phải - OS with TRIM), dữ liệu đang chờ xóa trở thành không gian trống, và có nhiều không gian có sẵn hơn cho GC. Không gian có sẵn càng nhiều, ổ SSD ghi càng nhanh, vì vậy TRIM có ảnh hưởng lớn đến hiệu suất tổng thể của SSD.
Trong ổ SSD có công nghệ DuraWrite (hàng dưới - SandForce Driven SSDs w/ DuraWrite), ít dữ liệu được ghi vào bộ nhớ vật lý của ổ đĩa lúc ban đầu, do đó có nhiều không gian trống có sẵn hơn cho GC. Nói ngắn gọn, ghi ít dữ liệu giải phóng nhiều không gian GC hơn và cải thiện hiệu suất của SSD. Thực tế, số lượng không gian có sẵn trong môi trường không TRIM ít hơn số lượng không gian có sẵn trong môi trường có TRIM. Trong ổ SSD DuraWrite có lệnh TRIM (cột bên phải - OS with TRIM), có số lượng lớn không gian có sẵn cho GC. Tuy nhiên, có một lượng không gian trống đáng kể không cải thiện hiệu suất của SSD một cách tuyến tính, bởi vì có các điểm nghẽn cổ chai khác.
Có nhiều kỹ thuật được sử dụng trong ngành công nghiệp lưu trữ, chẳng hạn như chống trùng lặp dữ liệu (data deduplication), nén dữ liệu (data compression), và so lệch dữ liệu (data differencing). DuraWrite kết hợp các yếu tố này và các công nghệ tương tự để giảm số lần ghi vào bộ nhớ flash.
Do đó, một ổ SSD có DuraWrite trong hệ thống không hỗ trợ TRIM cũng giống như một ổ SSD thông thường có hỗ trợ TRIM. Chúng ta có thể áp dụng công nghệ này vào trong môi trường RAID (hầu hết chưa hỗ trợ TRIM), sử dụng SSD có DuraWrite và tận dụng những lợi ích như có lệnh TRIM mà không cần trình điều khiển RAID hỗ trợ TRIM.
Thi hành GC trong chế độ nào: nền (background) hay nổi (foreground)?
Đây là câu hỏi cuối cùng khi thi hành GC. Đang có sự tranh luận trong ngành công nghiệp lưu trữ giữa 2 chế độ GC nền (trong thời gian nghỉ) và GC nổi (tiêu chuẩn).
GC nền có vẻ là ý tưởng hay, khi máy chủ không có yêu cầu gì và SSD đang "nhàn rỗi", để nó có thể sẵn sàng đưa ra các khối đã được tối ưu khi HĐH cần ghi một tập tin mới hoặc thay đổi một tập tin.
Tuy nhiên, chế độ này gặp phải vấn đề sau đây. GC nền có khả năng di dời tất cả dữ liệu hợp lệ hiện hành trên SSD, trong khi thực tế một số dữ liệu đó có thể không hợp lệ, ví dụ như các tập tin tạm thời, sẽ sớm được xóa bởi HĐH. Nếu các khối chứa dữ liệu không hợp lệ được thu gom trong chế độ nền, SSD sẽ ghi lại rất nhiều dữ liệu không cần thiết trong một thời gian ngắn, trực tiếp gây hao mòn không cần thiết trên SSD và giảm độ bền.
GC nền được sử dụng chủ yếu với các ổ SSD có tốc độ ghi chậm, vì nó làm giảm lượng GC phải được thi hành khi chạy ở chế độ nổi, và do đó cho phép ổ đĩa chạy nhanh hơn một chút trong khi ghi. Chế độ này hoạt động cho đến khi lưu lượng dữ liệu đến từ máy chủ "đuổi kịp" không gian trống từ GC nền, lúc đó ổ đĩa bắt buộc phải thi hành GC theo thời gian thực (tức GC nổi).
Trái ngược với GC nền, GC nổi chỉ được thi hành khi ổ đĩa cần ngay không gian trống. Vì vậy GC nổi tránh phải thu gom những dữ liệu sẽ sớm không hợp lệ, giúp giảm hao mòn tổng thể trên SSD. Điều này đòi hỏi ổ đĩa phải có tốc độ ghi rất cao. FSP của LSI SandForce có một kiến trúc mà nó cho phép thi hành GC nổi nhanh nhất có thể.
Sự khác biệt giữa GC nền và GC nổi ít được thấy rõ trong các ổ đĩa người dùng, nơi có khuynh hướng thời gian nhàn rỗi nhiều và độ bền không quá quan trọng, nhưng nó được thấy rõ hơn trong các ổ đĩa doanh nghiệp, nơi hoạt động ghi diễn ra liên tục và chu kỳ làm việc (duty cycle) dài hơn.
FSP của LSI SandForce sử dụng kỹ thuật GC tối ưu, vì thế chúng có thể thi hành GC nổi (theo thời gian thực) tốt hơn so với các bộ điều khiển SSD khác. Với công nghệ DuraWrite, nếu SSD ghi ít dữ liệu tổng thể hơn thì sẽ có ít dữ liệu hơn phải ghi lại trong khi GC, lúc đó thậm chí SSD hoạt động còn tốt hơn.
Như chúng ta đã thấy, GC là một chức năng cần thiết của tất cả ổ đĩa SSD. Quyết định sử dụng GC nền hay GC nổi, cũng như việc sử dụng lệnh TRIM đều tác động đến hiệu suất, khuếch đại ghi, và độ bền của SSD. Những yếu tố này cần được xem xét kỹ lưỡng khi thiết kế hoặc chọn mua ổ SSD cho hệ thống máy tính.