章 9. ZFS

9.1. 使用 ZFS 最少需要多少記憶體?
9.2. ZIL 是什麼而又何時會被使用?
9.3. 我需要用固態硬碟 (SSD) 來存 ZIL 嗎?
9.4. L2ARC 是什麼?
9.5. 建議啟用去冗餘 (deduplication) 嗎?
9.6. 在我建立的 ZFS pool 中無法刪除和新增檔案,應該怎麼修復?
9.7. ZFS 支援固態硬碟 (SSD) 的 TRIM 功能嗎?

9.1.

使用 ZFS 最少需要多少記憶體?

至少需要 4GB 的記憶體才能跑得順,但不同的工作負載可能會造成相當大的差異。

9.2.

ZIL 是什麼而又何時會被使用?

The ZIL (ZFS 動向日誌) 是一個紀錄日誌,用以實現系統當機時 POSIX 寫入保證的語義,多個正常 ZFS 寫入動作會被分成多個交易處理群組,並在交易處理群組被填滿時寫入磁碟 (Transaction Group Commit)。然而像 fsync(2) 這樣的系統呼叫,會要求該系統呼叫在返回前,能承諾已將資料寫入磁碟,ZIL 就是用來紀錄確認為已執行寫入的資料,但其實尚未存在於磁碟上,即尚未完成交易處理,交易處理群組具有時間戳記,在系統當機後,找到 ZIL 最後一個有效的時間戳記,即將遺失的資料再舍併至磁碟上。

9.3.

我需要用固態硬碟 (SSD) 來存 ZIL 嗎?

ZFS 預設將 ZIL 儲存在包含所有資料的 zpool 中,如果應用程式的寫入負載很重,將 ZIL 儲存在同步速度非常快的獨立設備中,藉由循序寫入效能的提高可以改善整個系統的效能,對於其他類型的工作負載, 固態硬碟就不會有太大的助益。

9.4.

L2ARC 是什麼?

The L2ARC (Second Level Adaptive Replacement Cache) 是存於快速儲存設備 SSD 上的讀取快取,此快取在重新開機後會消失,請注意記憶體是第一層的快取,只有在記憶體不足的情況下才需要 L2ARC。

L2ARC 需要 ARC 的空間來為其製作索引,因此,有一種反常的情況,如果有一種工作集 (working set) 可以完美地剛好放入 ARC,一旦系統使用 L2ARC,該工作集的運作將不再完美,因為 ARC 需要用一部分空間來保存 L2ARC 的索引,以至於必須將工作集的一部分存入比記憶體慢的 L2ARC。

9.5.

建議啟用去冗餘 (deduplication) 嗎?

一般而言,不建議這麼做。

去冗餘需要相當多的記憶體,而且會讓讀寫磁碟所需的時間變長,除非磁碟上儲存了非常多重複的資料,例如:虛擬機的映像檔或者是使用者的備份資料,否則開啟去冗餘可能弊大於利。另一個需要考量的狀況是:啟用去冗餘功能之後再將其關閉,無法將磁碟上去冗餘的狀態立即逆轉,必須等到下次修改了之前被去冗餘的資料,變更的區塊才會再被複製一份。

去冗餘也可能會導致某些非預期的情況,特別是刪除檔案時可能會慢很多。

9.6.

在我建立的 ZFS pool 中無法刪除和新增檔案,應該怎麼修復?

這很有可能是該 pool 的空間使用率已達 100% 滿了,因 ZFS 需要儲存空間以將紀錄交易處理的輔助資料 (metadata) 寫入,為了讓該 pool 回復至可用狀態,必須用檔案切除的方法 (truncate 命令) 刪除不重要的檔案:

% truncate -s 0 unimportant-file

因為檔案切除不需要建立交易處理紀錄,並能釋放出可使用的磁碟區塊。

注意:

如果系統曾進行過額外的 ZFS dataset 調校,例如:去冗餘,釋放出來的空間也許不會立即可得。

9.7.

ZFS 支援固態硬碟 (SSD) 的 TRIM 功能嗎?

自 FreeBSD 10-CURRENT 修定 r240868 開始,就支援 ZFS TRIM。ZFS TRIM 的支援分別已在 r252162 和 r251419 的修訂,加進所有 FreeBSD-STABLE 分支。

ZFS TRIM 預設就已開啟,也可以將其關閉,只要加入一行設定到 /etc/sysctl.conf:

vfs.zfs.trim.enabled=0

注意:

ZFS TRIM 也可能某些設定中會無效,例如:在採用 GELI 裝置上的 ZFS 檔案系統。

本文及其他文件,可由此下載: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/

若有 FreeBSD 方面疑問,請先閱讀 FreeBSD 相關文件,如不能解決的話,再洽詢 <questions@FreeBSD.org>。

關於本文件的問題,請洽詢 <doc@FreeBSD.org>。