天天看點

固态硬碟SSD優化--fstrim指令

作者:寒笛過霜天

Linux平台下SSD的TRIM指令的最佳使用方式(不差別對待NVMe)

SSD寫資料會出現什麼問題

SSD讀寫的機關不是位, 而是一個塊。如果要改變這個塊中的一位, 首先要将整個塊擦寫成1, 然後再寫入更新的資料。

為了解決擦寫塊的低效, SSD的政策是将需要改寫的塊, 讀取出來, 進行資料修改, 然後寫入到新的, 已經擦除完的塊中。

新的SSD, 沒用的塊很多, 無需擦寫, 直接寫入, 性能很高。随着使用量增加, 當寫入時無可用塊時, 則隻能先擦寫再寫入。此時SSD性能很差。

理論上, SSD内部定期将垃圾塊進行回收擦寫, 但是SSD無法确認哪些資料是需要回收的。

解決問題的思路

針對SSD使用時間越長可用塊變少以緻于性能變差, 可以讓SSD"知道"哪些塊可以回收, 進而提前擦寫垃圾塊, 以提升性能。

那麼怎麼做呢? 解釋這個問題需要先了解檔案系統是如何"删除檔案"的。

檔案系統隻是将檔案頭作一個已删除的标記, 表明檔案被删除了, 即沒有真正删除檔案, 隻是辨別删除。(Linux下真正删除的時機可能是寫滿、ramdisk、斷電等時刻, 此處不作深究)

SSD 具有一種稱為 TRIM 的功能。從本質上講, 這是一種用于回收裝置上未使用的塊的方法, 該塊可能先前已被寫入, 但不再包含有效資料, 是以可以傳回到通用存儲池以供重用。

TRIM就是這種"告知"SSD:"這些檔案(塊)已經删除了, 你可以提前擦寫以提高性能!"

經過衆多資料的洗禮, 我發現TRIM仿佛并非有想像中那麼好, 因為開啟TRIM功能後, 每次删除檔案是真正的删除, SSD就可能去回收那些垃圾塊, 會降低SSD的性能!

解決之法是定時TRIM, 而Systemd管理的Linux系統中都有一個指令 fstrim, 就是作TRIM操作, 可以用于普通SSD與NVMe

一次清理垃圾塊的操作:(釋放了這麼多, 難怪滿了)

sudo fstrim --fstab --verbose

Systemd管理的系統有一個專用的fstrim服務與定時器, 開啟定時器方法:

#檢視fstrim定時器狀态

sudo systemctl status fstrim.timer

#開啟fstrim定時器自啟

sudo systemctl enable --now fstrim.timer

#列出timer定時器清單

sudo systemctl list-timers --all

> # sudo systemctl status fstrim.timer

● fstrim.timer - Discard unused blocks once a week

Loaded: loaded (/lib/systemd/system/fstrim.timer; enabled; vendor preset: enabled)

Active: active (waiting) since Fri 2022-02-11 06:48:30 CST; 1 months 14 days ago

Trigger: Mon 2022-04-04 00:00:00 CST; 6 days left

Triggers: ● fstrim.service

Docs: man:fstrim

Feb 11 06:48:30 ghnode systemd[1]: Started Discard unused blocks once a week.

觸發時間: 周一 2022-04-04 00:00:00 CST; 還剩6天

Trigger: Mon 2022-04-04 00:00:00 CST; 6 days left

fstrim指令 -- 回收已挂載的檔案系統未使用的塊

fstrim 用于回收(又稱為"trim")一個已挂載的檔案系統上所有未使用的塊; 這對于固态硬碟(SSD)和精簡配置(thinly-provisioned)的儲存設備比較有意義。

預設情況下, fstrim 将會回收檔案系統上所有未使用的塊。但是可以通過選項限定回收的範圍和大小。

回收所有已挂載檔案系統上的未使用空間(包含所有支援"trim"的裝置):

> # fstrim -a

設定檔案系統上搜尋空閑塊的起點, 也就是僅搜尋該點之後的空間:

> # fstrim -o 512

設定搜尋長度, 也就是從起點開始, 在多大範圍内搜尋空閑塊:

> # fstrim -l 512

啰嗦模式, 輸出回收過程中的詳細資訊:

> # fstrim -v

fstrim 能自動判斷硬碟是否支援回收操作, 如: 機械硬碟和其他外挂盤

sudo /sbin/fstrim -v /miner

fstrim: /miner: the discard operation is not supported

參考資料:

https://www.cnblogs.com/hellxz/p/13367925.html

常見的問題:

ghnode kernel: [7751636.907288] nvme nvme1: I/O 493 QID 8 timeout, completion polled

你這個有可能是寫入操作較多, 觸發了trim操作。

看下你的/etc/fstab中那個分區的挂載參數, 如果沒有discard, 就加上去。或者你時不時手動運作fstrim一下。

/dev/sda1 / ext4 noatime,discard,defaults

sudo /sbin/fstrim -v /

discard

若 SSD 支援 TRIM 指令, 可以在 /etc/fstab 中啟用 discard 參數。建議将 discard 挂載參數作為首選。

該參數不是必需的, 可以自定義周期性運作 fstrim 指令來取代該參數, 使用該指令前要确認 SSD 支援 TRIM, 否則可能造成資料丢失。

當 SSD 有足夠的空餘空間或(未配置設定的)可用空間時不需要該參數。

1) uname -a Linux核心自2.6.33開始支援TRIM。

2) hdparm -I /dev/sda | grep TRIM 顯示 * Data Set Management TRIM supported 說明 SSD 支援trim

3) /etc/fstab 修改 /dev/sda1 / ext4 defaults 為 /dev/sda1 / ext4 discard,defaults 然後執行 mount 檢視是否含有 discard

繼續閱讀