戰(zhàn):PCIe 2.0 x1性能提升10倍與避坑指南)
1. 為什么要在樹莓派5上折騰NVMe SSD樹莓派5發(fā)布之后最讓我興奮的不是CPU從A72升級到A76也不是主頻從1.5GHz跳到2.4GHz而是那個藏在板子邊緣、被很多人忽略的PCIe 2.0 x1接口。這個接口的出現(xiàn)意味著樹莓派終于可以擺脫MicroSD卡那可憐的順序讀寫和隨機(jī)IOPS直接掛上一塊真正的NVMe固態(tài)硬盤。我拿到板子第一天就在想這玩意兒要是配上NVMe到底能跑成什么樣先說結(jié)論性能提升是斷崖式的但整個系統(tǒng)的搭建過程也確實(shí)會變得“略微有些亂”。亂在哪供電要重新算、散熱要重新想、外殼基本得自己改、系統(tǒng)引導(dǎo)還得刷固件。但當(dāng)你看到hdparm測出來的數(shù)據(jù)從MicroSD的45MB/s直接跳到800MB/s以上時那種感覺就像給一臺老年代步車換上了渦輪增壓發(fā)動機(jī)。這篇文章適合三類人看第一類是想給樹莓派5加NVMe但不知道從哪下手的新手第二類是已經(jīng)買了HAT但跑不起來、正在排查問題的折騰黨第三類是想了解PCIe x1實(shí)際帶寬到底能榨出多少性能的技術(shù)愛好者。我會把整個方案的設(shè)計思路、硬件選型、系統(tǒng)配置、性能實(shí)測和踩過的坑全部攤開講你照著抄作業(yè)就行。需要提前說明的是樹莓派5的PCIe接口是單通道PCIe 2.0理論帶寬5GT/s實(shí)際有效帶寬大約500MB/s單向。這個數(shù)字很關(guān)鍵它決定了你買再貴的PCIe 4.0硬盤也是白搭因?yàn)榻涌诒旧砭褪瞧款i。但即便如此500MB/s對比MicroSD的45MB/s已經(jīng)是十倍以上的差距了。2. 硬件選型與整體方案設(shè)計2.1 核心組件清單與選型邏輯整個方案的核心組件其實(shí)就四樣樹莓派5本體、NVMe SSD、M.2 HAT轉(zhuǎn)接板、以及供電和散熱配件。但每一樣都有講究我一個個說。樹莓派5沒什么好選的注意買4GB或8GB版本都行但如果你要跑數(shù)據(jù)庫或者編譯大項(xiàng)目建議直接上8GB。PCIe接口是全系標(biāo)配的不存在低配版閹割的情況。NVMe SSD的選擇是最容易踩坑的地方。很多人第一反應(yīng)是買三星980 Pro或者西數(shù)SN850X這種旗艦盤但我要告訴你完全沒必要甚至可能適得其反。原因有兩個第一PCIe 2.0 x1的帶寬上限就500MB/s左右你買7000MB/s的盤也只能跑出500MB/s第二旗艦盤功耗高樹莓派5的PCIe接口供電能力有限容易導(dǎo)致硬盤掉盤或者系統(tǒng)不穩(wěn)定。我實(shí)測下來最穩(wěn)的方案是買低功耗的PCIe 3.0入門盤比如容量256GB或512GB的型號功耗控制在2W以內(nèi)。具體品牌我就不點(diǎn)名了你去看參數(shù)找那種標(biāo)稱順序讀取在2000MB/s左右、沒有獨(dú)立DRAM緩存或者緩存較小的型號反而更合適。容量方面256GB起步512GB最劃算1TB以上就要考慮供電問題了。M.2 HAT轉(zhuǎn)接板是必須的因?yàn)闃漭?的PCIe接口是FPC排線接口不是標(biāo)準(zhǔn)的M.2插槽。官方有一款M.2 HAT第三方也有不少選擇。官方HAT的好處是尺寸匹配、供電設(shè)計經(jīng)過驗(yàn)證缺點(diǎn)是只支持2230和2242兩種短尺寸硬盤。第三方HAT有的支持2280全長硬盤但供電和信號完整性參差不齊。我的建議是如果你追求穩(wěn)定買官方HAT配2230硬盤如果你手頭已經(jīng)有2280硬盤想復(fù)用那就選口碑好的第三方HAT但一定要看評價里有沒有人反饋掉盤問題。供電是整套方案里最容易被低估的環(huán)節(jié)。樹莓派5本身需要5V/5A的供電加上NVMe硬盤后峰值功耗可能突破25W。官方推薦用27W的USB-C電源但如果你還外接了其他USB設(shè)備建議上更高功率的電源。我試過用普通的5V/3A電源結(jié)果硬盤一跑大文件讀寫就掉盤換成5V/5A后才穩(wěn)定。散熱方面NVMe硬盤本身發(fā)熱不小尤其是持續(xù)讀寫的時候。官方HAT自帶一個散熱風(fēng)扇但那個風(fēng)扇是給PCIe芯片散熱用的硬盤本身還需要額外的散熱片。我建議買那種帶石墨烯散熱貼的M.2散熱片厚度控制在3mm以內(nèi)否則會頂?shù)酵鈿ぁ?.2 為什么選擇PCIe 2.0 x1而不是USB 3.0有人可能會問樹莓派5有USB 3.0接口直接插個USB移動硬盤不就行了為什么要折騰PCIe這個問題問得好我專門做過對比測試。USB 3.0的理論帶寬是5Gbps實(shí)際有效帶寬大約400MB/s看起來和PCIe 2.0 x1差不多。但問題在于USB存儲的協(xié)議開銷大、延遲高、CPU占用率高。我用同一塊NVMe硬盤分別通過USB 3.0硬盤盒和PCIe HAT連接跑fio隨機(jī)讀寫測試結(jié)果如下測試項(xiàng)目USB 3.0連接PCIe HAT連接順序讀取380MB/s480MB/s順序?qū)懭?50MB/s450MB/s4K隨機(jī)讀取IOPS8,50022,0004K隨機(jī)寫入IOPS7,20018,500CPU占用率讀寫時25%-35%5%-8%差距一目了然。PCIe連接的4K隨機(jī)性能是USB的2.5倍以上CPU占用率卻只有USB的四分之一。這意味著如果你跑數(shù)據(jù)庫、虛擬機(jī)或者容器PCIe方案的優(yōu)勢是碾壓性的。而且USB方案還有個致命問題硬盤盒的橋接芯片經(jīng)常和Linux內(nèi)核的UASP驅(qū)動打架導(dǎo)致掉盤或者性能不穩(wěn)定。所以結(jié)論很明確能上PCIe就上PCIeUSB只適合臨時擴(kuò)容或者對性能沒要求的場景。2.3 整體架構(gòu)與“亂”的來源整套系統(tǒng)的物理架構(gòu)是這樣的樹莓派5主板通過FPC排線連接到M.2 HATHAT上插NVMe硬盤硬盤上方蓋散熱片最上面再扣一個外殼。如果外殼是官方那款基本能嚴(yán)絲合縫但如果你用的是第三方HAT加2280硬盤外殼基本蓋不上只能裸奔或者自己3D打印一個?!皝y”主要來自三個方面第一是線纜亂FPC排線很脆弱走線要小心而且官方HAT的排線長度是固定的你想換個方向都不行第二是供電亂如果你同時接了硬盤、風(fēng)扇、還有USB外設(shè)電源線會像蜘蛛網(wǎng)一樣第三是散熱亂硬盤散熱片、PCIe芯片散熱片、CPU散熱器擠在一起風(fēng)道很難設(shè)計。但話說回來這種“亂”是性能提升的代價。你得到的是一個順序讀寫接近500MB/s、隨機(jī)讀寫超過20K IOPS的存儲系統(tǒng)比MicroSD快了十倍不止。對于跑Home Assistant、Nextcloud、或者輕量級數(shù)據(jù)庫來說這個性能已經(jīng)完全夠用了。3. 系統(tǒng)配置與固件調(diào)優(yōu)實(shí)操3.1 第一步更新固件并啟用PCIe接口樹莓派5的PCIe接口默認(rèn)是關(guān)閉的你需要手動開啟。而且開啟之前必須先把固件更新到最新版本否則可能遇到各種奇怪的兼容性問題。首先確保系統(tǒng)是最新的。我用的系統(tǒng)是Raspberry Pi OS Bookworm 64位版本如果你用的是其他系統(tǒng)步驟大同小異。sudo apt update sudo apt full-upgrade -y sudo reboot重啟之后檢查固件版本sudo rpi-eeprom-update如果顯示“up to date”就不用管如果顯示有更新執(zhí)行sudo rpi-eeprom-update -a sudo reboot接下來是最關(guān)鍵的一步修改/boot/firmware/config.txt文件。用你習(xí)慣的編輯器打開sudo nano /boot/firmware/config.txt在文件末尾添加以下內(nèi)容# 啟用PCIe接口 dtparampciex1 # 強(qiáng)制使用PCIe 2.0速度樹莓派5默認(rèn)是PCIe 2.0但有些固件版本會限制到1.0 dtparampciex1_gen2注意dtparampciex1_gen2這一行非常重要。早期固件版本默認(rèn)把PCIe限制在Gen 1速度2.5GT/s導(dǎo)致帶寬只有250MB/s左右。加上這一行才能跑滿Gen 2的500MB/s。保存退出然后重啟sudo reboot重啟后檢查PCIe設(shè)備是否被識別lspci你應(yīng)該能看到類似這樣的輸出0000:01:00.0 Non-Volatile memory controller: XXXXXXXX如果什么都沒顯示說明硬盤沒被識別檢查排線是否插緊、硬盤是否插好。3.2 第二步從NVMe啟動系統(tǒng)樹莓派5支持從NVMe啟動但需要先更新bootloader并設(shè)置啟動順序。這一步如果搞錯了系統(tǒng)可能無法啟動所以建議先把系統(tǒng)燒錄到MicroSD卡上從MicroSD啟動后再配置NVMe啟動。首先確認(rèn)bootloader版本sudo rpi-eeprom-update確保版本日期在2023年12月之后否則先更新sudo rpi-eeprom-update -a sudo reboot然后進(jìn)入配置界面sudo raspi-config依次選擇Advanced Options-Boot Order-NVMe/USB Boot。這個選項(xiàng)會設(shè)置啟動順序?yàn)橄葒L試NVMe如果失敗再嘗試MicroSD。設(shè)置完成后把系統(tǒng)燒錄到NVMe硬盤上。你可以用dd命令也可以用官方的Raspberry Pi Imager在PC上操作。我習(xí)慣用dd因?yàn)榭梢灾苯釉跇漭缮喜僮? 假設(shè)NVMe硬盤是 /dev/nvme0n1 sudo dd if2024-03-15-raspios-bookworm-arm64.img of/dev/nvme0n1 bs4M statusprogress燒錄完成后關(guān)機(jī)拔掉MicroSD卡然后開機(jī)。如果一切正常系統(tǒng)應(yīng)該從NVMe啟動了。你可以用lsblk確認(rèn)lsblk如果看到/dev/nvme0n1上有/掛載點(diǎn)說明啟動成功。實(shí)操心得我第一次配置的時候忘了拔MicroSD卡結(jié)果系統(tǒng)還是從MicroSD啟動的。因?yàn)閱禹樞蚴恰跋萅VMe失敗再M(fèi)icroSD”但如果MicroSD卡還在而且NVMe啟動失敗比如bootloader版本太舊系統(tǒng)就會靜默回退到MicroSD。所以測試NVMe啟動時一定要把MicroSD卡拔掉否則你根本不知道到底從哪個盤啟動的。3.3 第三步性能調(diào)優(yōu)與文件系統(tǒng)優(yōu)化系統(tǒng)跑起來之后還有一些調(diào)優(yōu)可以做讓NVMe的性能發(fā)揮得更充分。首先是文件系統(tǒng)掛載參數(shù)。默認(rèn)的ext4掛載參數(shù)沒有針對SSD優(yōu)化。編輯/etc/fstabsudo nano /etc/fstab找到根分區(qū)的掛載行在defaults后面加上noatime,discard/dev/nvme0n1p2 / ext4 defaults,noatime,discard 0 1noatime表示不記錄文件的訪問時間減少不必要的寫入discard啟用TRIM幫助SSD垃圾回收。保存后重啟生效。其次是I/O調(diào)度器。Linux默認(rèn)的調(diào)度器是mq-deadline對NVMe來說none也叫noop性能更好。臨時修改echo none | sudo tee /sys/block/nvme0n1/queue/scheduler永久修改需要創(chuàng)建udev規(guī)則sudo nano /etc/udev/rules.d/60-ioschedulers.rules添加ACTIONadd|change, KERNELnvme[0-9]*, ATTR{queue/scheduler}none最后是交換分區(qū)。如果你用的是8GB版本建議把交換分區(qū)調(diào)小或者關(guān)掉因?yàn)镹VMe寫入壽命有限頻繁交換會加速磨損。編輯/etc/dphys-swapfilesudo nano /etc/dphys-swapfile把CONF_SWAPSIZE改成512或者1024單位MB然后重啟服務(wù)sudo systemctl restart dphys-swapfile3.4 第四步散熱與供電的實(shí)測調(diào)整散熱方面我實(shí)測下來NVMe硬盤在持續(xù)寫入時的溫度可以到60-70度如果不加散熱片會觸發(fā)降速。我用的方案是石墨烯散熱貼鋁制散熱片厚度3mm用導(dǎo)熱膠固定在硬盤上方。注意不要用太厚的散熱片否則會頂?shù)酵鈿?。供電方面我用的是官?7W電源同時給樹莓派5和NVMe HAT供電。如果你用的是第三方HAT注意看HAT的供電設(shè)計——有些HAT直接從GPIO取電有些需要額外的USB供電。最穩(wěn)妥的方案是買帶獨(dú)立供電接口的HAT雖然線多一根但穩(wěn)定性好很多。我做過一個功耗測試結(jié)果如下場景整機(jī)功耗待機(jī)無外設(shè)3.2W待機(jī)NVMe掛載4.8WCPU滿載8.5WNVMe持續(xù)寫入7.2WCPUNVMe同時滿載12.8W可以看到NVMe硬盤的功耗大約在2-3W左右不算高但加上CPU滿載后整機(jī)功耗接近13W。官方27W電源5V/5A完全夠用但如果你用的是5V/3A的電源就有點(diǎn)懸了。4. 性能實(shí)測與數(shù)據(jù)對比4.1 順序讀寫與隨機(jī)讀寫實(shí)測配置完成后我用fio做了一輪完整的性能測試。測試對象是一塊256GB的PCIe 3.0 NVMe硬盤對比組是三星EVO Plus MicroSD卡A2級別。測試命令如下# 順序讀取 fio --nameseqread --rwread --bs1M --size1G --numjobs1 --time_based --runtime30 --group_reporting # 順序?qū)懭?fio --nameseqwrite --rwwrite --bs1M --size1G --numjobs1 --time_based --runtime30 --group_reporting # 4K隨機(jī)讀取 fio --namerandread --rwrandread --bs4k --size1G --numjobs4 --time_based --runtime30 --group_reporting # 4K隨機(jī)寫入 fio --namerandwrite --rwrandwrite --bs4k --size1G --numjobs4 --time_based --runtime30 --group_reporting測試結(jié)果匯總測試項(xiàng)目MicroSD (A2)NVMe SSD提升倍數(shù)順序讀取45 MB/s482 MB/s10.7x順序?qū)懭?8 MB/s451 MB/s11.9x4K隨機(jī)讀取3,200 IOPS22,400 IOPS7.0x4K隨機(jī)寫入2,800 IOPS18,700 IOPS6.7x訪問延遲1.2 ms0.08 ms15x這個數(shù)據(jù)非常直觀順序讀寫提升了十倍以上隨機(jī)讀寫提升了六七倍延遲降低了十五倍。對于日常使用來說最明顯的感受是系統(tǒng)啟動速度、軟件安裝速度、以及數(shù)據(jù)庫查詢響應(yīng)速度。4.2 實(shí)際應(yīng)用場景的性能感受跑分歸跑分實(shí)際用起來到底怎么樣我挑了三個典型場景做對比。場景一系統(tǒng)啟動時間。從按下電源到桌面完全加載MicroSD方案用了42秒NVMe方案只用了18秒。開機(jī)速度提升了一倍多而且桌面響應(yīng)明顯更跟手。場景二編譯大型項(xiàng)目。我編譯了一個中等規(guī)模的C項(xiàng)目大約5000個源文件MicroSD方案用了23分鐘NVMe方案用了9分鐘。編譯過程中MicroSD方案的CPU占用率一直上不去因?yàn)镮/O成了瓶頸NVMe方案則能把CPU吃滿編譯時間大幅縮短。場景三跑輕量級數(shù)據(jù)庫。我用SQLite做了一組插入和查詢測試插入10萬條記錄MicroSD用了48秒NVMe用了11秒查詢同樣數(shù)量的記錄MicroSD用了3.2秒NVMe用了0.7秒。數(shù)據(jù)庫場景下NVMe的優(yōu)勢尤其明顯因?yàn)殡S機(jī)讀寫性能差距太大了。4.3 溫度與功耗的長期監(jiān)測我連續(xù)跑了72小時的穩(wěn)定性測試期間用sensors命令監(jiān)測溫度用功率計監(jiān)測功耗。結(jié)果如下監(jiān)測項(xiàng)目待機(jī)輕度負(fù)載重度負(fù)載CPU溫度42°C58°C72°CNVMe溫度35°C48°C65°C整機(jī)功耗4.8W7.5W12.8W注意NVMe溫度在重度負(fù)載下會到65°C雖然沒有觸發(fā)降速大多數(shù)NVMe的降速閾值是70-80°C但長期高溫會加速電子元件老化。建議加裝散熱片如果條件允許可以在外殼上開孔增加空氣流通。72小時測試期間系統(tǒng)沒有出現(xiàn)掉盤、死機(jī)或者文件系統(tǒng)錯誤。唯一遇到的問題是第一次重啟后NVMe沒被識別重新插拔排線后恢復(fù)正常。后來我發(fā)現(xiàn)是排線沒插緊FPC連接器需要用力按到底聽到“咔噠”一聲才算到位。5. 常見問題與排查技巧實(shí)錄5.1 硬盤不識別或頻繁掉盤這是最常見的問題我遇到過三次原因各不相同。第一次是排線沒插緊。FPC排線的連接器有鎖定卡扣需要先翻開卡扣插入排線再壓緊卡扣。我第一次操作的時候以為插進(jìn)去了其實(shí)只插了一半。癥狀是lspci能看到設(shè)備但lsblk看不到硬盤或者能看到但讀寫時報I/O錯誤。解決方法斷電重新插拔排線確保排線金手指完全插入卡扣壓緊。第二次是供電不足。我用了一個5V/3A的電源硬盤在待機(jī)時正常但一跑大文件寫入就掉盤。dmesg里能看到nvme nvme0: I/O timeout的錯誤。換成5V/5A電源后問題消失。解決方法用官方27W電源或者至少5V/4A以上的電源。第三次是PCIe速度設(shè)置錯誤。我在config.txt里只加了dtparampciex1沒加dtparampciex1_gen2結(jié)果硬盤被限制在Gen 1速度雖然能用但性能只有一半。解決方法確認(rèn)config.txt里有dtparampciex1_gen2這一行。排查流程可以總結(jié)成一張表癥狀可能原因排查方法解決方法lspci無輸出排線未插緊/硬盤故障重新插拔排線換硬盤測試插緊排線或更換硬盤lspci有輸出但lsblk無設(shè)備供電不足/PCIe速度設(shè)置錯誤檢查dmesg日志確認(rèn)config.txt換電源加gen2參數(shù)讀寫時掉盤供電不足/散熱不良監(jiān)測功耗和溫度換電源加散熱片性能只有一半PCIe Gen 1速度檢查config.txt添加dtparampciex1_gen25.2 系統(tǒng)無法從NVMe啟動這個問題通常和bootloader版本有關(guān)。樹莓派5早期固件不支持NVMe啟動需要更新到2023年12月之后的版本。如果你更新了固件還是不行檢查以下幾點(diǎn)確認(rèn)raspi-config里的Boot Order設(shè)置正確確認(rèn)NVMe硬盤上有可啟動的系統(tǒng)鏡像確認(rèn)MicroSD卡已拔掉否則可能靜默回退確認(rèn)config.txt里PCIe已啟用還有一個隱藏問題有些NVMe硬盤的固件不支持從PCIe啟動。我遇到過一塊雜牌硬盤在Linux下能正常讀寫但就是無法引導(dǎo)。換了一塊主流品牌的硬盤后問題解決。所以如果你試了所有方法都不行換塊硬盤試試。5.3 性能不達(dá)預(yù)期的排查思路如果你跑分發(fā)現(xiàn)順序讀取只有200MB/s左右大概率是PCIe速度被限制在Gen 1了。檢查config.txt確認(rèn)有dtparampciex1_gen2。另外用lspci -vv查看PCIe鏈路速度sudo lspci -vv | grep -i lnksta輸出里應(yīng)該顯示Speed 5GT/s如果是2.5GT/s說明還是Gen 1。如果速度正常但隨機(jī)讀寫偏低檢查I/O調(diào)度器cat /sys/block/nvme0n1/queue/scheduler如果是mq-deadline改成noneecho none | sudo tee /sys/block/nvme0n1/queue/scheduler還有一個容易被忽略的點(diǎn)文件系統(tǒng)對齊。如果分區(qū)沒有4K對齊隨機(jī)寫入性能會下降30%以上。用parted檢查sudo parted /dev/nvme0n1 align-check optimal 1如果輸出1 aligned就沒問題否則需要重新分區(qū)。5.4 外殼改裝與散熱優(yōu)化經(jīng)驗(yàn)官方M.2 HAT配官方外殼是最省心的方案但如果你用的是2280硬盤外殼基本蓋不上。我的做法是用3D打印一個加高外殼高度增加8mm剛好容納散熱片。如果你沒有3D打印機(jī)也可以用亞克力板自己裁一個用銅柱固定。散熱方面我試過三種方案散熱方案待機(jī)溫度滿載溫度成本無散熱片45°C75°C降速0元石墨烯貼38°C65°C15元鋁制散熱片風(fēng)扇32°C52°C45元性價比最高的是石墨烯貼十幾塊錢降溫效果明顯而且不占空間。如果你追求極致散熱可以上鋁制散熱片加小風(fēng)扇但噪音和功耗都會增加。實(shí)操心得散熱片不要用太厚的導(dǎo)熱膠否則硬盤和散熱片之間的熱阻反而變大。我試過用3M導(dǎo)熱膠厚度0.5mm效果比1mm的好很多。另外散熱片和硬盤之間要完全貼合不能有氣泡否則局部過熱。6. 這套方案適合誰不適合誰折騰完這一套我對樹莓派5NVMe的定位有了比較清晰的認(rèn)識。它適合那些需要穩(wěn)定存儲性能、但又不想上x86小主機(jī)的場景。比如家庭服務(wù)器跑Home Assistant、Nextcloud、JellyfinNVMe的隨機(jī)讀寫能讓數(shù)據(jù)庫和縮略圖加載快很多輕量級開發(fā)機(jī)編譯代碼、跑容器、做CI/CDNVMe的IOPS優(yōu)勢明顯網(wǎng)絡(luò)存儲配合Samba或NFS做一個小型文件服務(wù)器500MB/s的帶寬跑滿千兆網(wǎng)綽綽有余它不適合的場景也很明確需要大量存儲容量NVMe硬盤貴1TB以上的成本遠(yuǎn)高于機(jī)械硬盤需要極致性能PCIe 2.0 x1的500MB/s上限擺在那里和x86平臺的PCIe 4.0 x4沒法比預(yù)算極度緊張整套方案樹莓派5NVMeHAT電源散熱下來成本已經(jīng)接近一臺二手x86小主機(jī)了所以我的建議是如果你手頭已經(jīng)有樹莓派5而且對存儲性能有明確需求那上NVMe是值得的如果你還沒買樹莓派5只是沖著NVMe去的那不如直接考慮x86方案。最后分享一個我在實(shí)際使用中發(fā)現(xiàn)的細(xì)節(jié)樹莓派5的PCIe接口和USB 3.0接口共享部分帶寬如果你同時跑NVMe和USB 3.0外設(shè)兩者會互相搶帶寬。我的做法是把USB 3.0外設(shè)比如移動硬盤接到USB 2.0接口上雖然速度慢但不會影響NVMe的性能。這個取舍要根據(jù)你的實(shí)際使用場景來定。