最近看到一篇寫樹莓派缺點的文章,感覺挺不錯,就來翻譯下(原文鏈接)
[翻譯] 樹莓派的各種問題
February 2, 2019 | by nachoparker
樹莓派價格低廉、應用豐富、擴展性強、社區活躍,所以廣受歡迎。到處都是愛好者的作品和褒獎的聲音,大多數人就沒去關注它的弱點。直到某一天這些缺陷讓他們卡關了,然后這些信息才出現在了論壇上。
我在這總結一些我遇到過的問題,大概其他人也有一樣的感覺,不過大部分人不去在意罷了。在一部分應用里,我不推薦樹莓派,尤其是 NAS 的服務,像是 NextCloudPi 和 Open Media Vault 這樣的。我會在后面給出原因。希望這些內容能節省我的時間,省的我來回在論壇里說。
我當初買了好多樹莓派,也用了好多年了。樹莓派第一版在 2012 年發布,成了愛好者 SBC 市場的里程碑。當時市場上已經有一些很不錯的板卡,像 Beagleboard 、Odroid ,不過這些板卡又難上手,又貴的要命,只有最硬核的愛好者才能玩,其他人都算是花錢買裝飾品了。
然后樹莓派出現了,而且價格壓得足夠低。樹莓派在性能上不是最強的,但是它的價格實在太誘人,之后就爆紅了。各種博客、論壇上都是愛好者的樹莓派相關作品、各種各樣的庫……樹莓派是第一塊這么流行的板卡,它的社區直到今天也是紅紅火火,大概這就是它戰勝其他板卡的原因。
不過呢,這都 2019 年了,以現在的視角來看就又不一樣了。現在的市場上出現了質量更好,價格也一樣便宜的其他板卡,我會在下面介紹下。
性能
樹莓派的價格能壓得這么低是因為它砍了一些功能,結果就是,比起其他同類板卡,它在某些方面表現欠佳。我在這說說樹莓派網絡和 USB 功能上的缺陷。
樹莓派用一塊 SMSC LAN9514 芯片 連接到 SoC ,只用了單個 USB 通道同時作為 USB 轉網絡接口和 USB hub 。也就是說網絡和 USB 共用同一個通道,而典型的 NAS 應用需要同時進行網絡上傳和 USB 存儲,所以這類應用的性能就受到很大的限制,更別說再加個 RAID 了。
所以說,就算樹莓派去年開始支持千兆網,實際的網絡傳輸性能也達不到千兆網的水平,純網絡傳輸速度最大達到 40MB/s 左右,而從 USB 接口轉接以后就降到了最大 20MB/s 。現在市場上已經有了支持真 · 千兆網和 USB3 的板卡,而且也不貴。
實際上樹莓派的 Wi-Fi 並不經過 SMSC ,而是通過 SDIO 連接到 BCM4343 芯片,所以理論上用 Wi-Fi 可以突破網絡的性能瓶頸。可是無線芯片性能都不怎么樣,而且還會跟其他接口設備競爭附近的無線信道,所以換用 Wi-Fi 也不夠好。
所以,我不推薦用樹莓派做 NAS 應用,不管是 Open Media Vault 還是 Nextcloud 。
樹莓派的核心不開源
如果你在關注軟件自由的討論,那在 Linux 板卡上,首當其沖的問題就是不開源的部分。我不在這描述細節,不過令人在意的是板卡的這些部分控制着所有東西,卻是個黑箱。軟件社區在解決這事上也做了巨大的貢獻,比如 Android Replicant 嘗試給出所有黑箱的替代方案,不過這是個痛苦、無聊又緩慢的過程。
在樹莓派上,用戶也面臨類似的問題。CPU 和 GPU 集成到了一塊 BCM2837B0 芯片 上,CPU 是 1400 MHz 的 64 位四核 ARM A53 架構(Pi3B配置),GPU 是400MHz 的雙核 32 位 VideoCore IV 架構。這是常見的移動設備 SoC 配置,把所有東西集成到單芯片,兼顧了低成本和低功耗。在競品里面,NXP iMX 和 Allwinner 也是類似的方案。
所以在最新的樹莓派主芯片上,有 6 個核心,但是其中只有 4 個是 ARM 核心。Linux 系統在 ARM CPU 上跑,這事大家都懂,但是令人詫異的是在樹莓派上,Linux 只是個弟弟,GPU 上有個叫 ThreadX 的實時操作系統,它才是老大哥。這個 ThreadX 系統是閉源的,控制了芯片上的系統,跟開源的 Linux 核心屁事沒有。
當樹莓派開始啟動的時候,CPU 會完全斷開連接(確切地說是保持復位狀態(reset state)),實際上是靠 GPU 啟動系統。可以去看下系統 /boot
目錄,就會發現 GPU 用的一些二進制文件,用來啟動 CPU 和 GPU 上的 ThreadX OS (bootcode.bin 和 start.elf) 。這里有更多詳細的啟動過程說明。
實際上是 GPU 掛載了 SD 卡,讀取這些二進制文件和 config.txt 文本文件 里的配置信息,這個文本文件是用戶設置的顯示配置和 GPU 超頻設置。這些東西都不關 Linux 的事。
在 GPU 控制 CPU 引導了 Linux 內核后,它也不會乖乖退居二線做一個圖形處理核心(graphics-processing-unit),GPU 還是老大哥。你曾經想過,當樹莓派外接 HDMI 顯示器的時候,是啥顯示了樹莓派的 logo 嗎?或者當降頻限流(throttling)的時候,是啥顯示了 閃電和溫度(lightning or temperature symbols) 標識?沒錯,還是 GPU 上的 ThreadX 系統。這些東西也不關 Linux 的事。
GPU 具體都干了些啥就沒人知道了,但是可以確定有些事情是它干的,這里面最令人關心的就是 ThreadX 系統的低電壓處理機制。低壓算是常見的問題了,在下一節里有詳細介紹。ThreadX 系統在檢測到低壓時控制 CPU 降頻,防止指令失效和 CPU 跑飛,結果就是大家的 CPU 最高主頻從 1400 MHz 降到了 600MHz 。在供電電壓低於 4.65V ,或者芯片溫度過高的時候,降頻限流就會啟動。而 Linux 和 Linux 系統自己的頻率調節器(frequency governor)還傻傻的被蒙在鼓里,以為自己一直在最高主頻下運行。
這些東西還僅僅是我們能看見的部分,因為 ThreadX 是閉源系統,所以沒人知道它背地里還干了些啥別的事,甚至令人懷疑它是不是能干些干涉隱私的事情。
板卡上閉源的部分至少包含一個專利,最早也得到 2025 年才會解除專利保護,開放源碼,但是也沒人知道那之后會不會再加入類似的東西了。已經有人在搞 VideoCore IV 反向工程 和 VideoCore IV 開源固件了,但是很不幸,這些項目都夭折了 。搞這些東西跟 Android blobs 一樣,都是些地獄難度的事。
供電問題
供電問題倒不是樹莓派自己的問題,大部分情況都是用戶的鍋。
初代樹莓派電流只有 80 mA,但是每次升級換代,性能都蹭蹭的漲,隨之而來的麻煩就是同樣上漲的用電需求 。最要命的是,很多用戶連接的 USB 設備也是電老虎,除非有單獨的 USB 外部供電。
microUSB 接口當初設計為提供 1.8A 電流 ,盡管這個標准已經很舊了,而且市面上也可以找到電流更大的適配器,還是有好多人在用舊的 1A 手機電源適配器,或者上網買個白菜價的破爛適配器接在樹莓派上。樹莓派是個計算機,需要高質量、穩定的 5V 恆壓電源,電流要能達到 2.5A 。不只是適配器質量要好,電源線和接口也不能差(否則就會有壓降),所以,拜托各位,用根好點的線材,類似 20AWG 這樣的,或者買官方的電源適配器。總之結論就是,沒有 USB 適配器能正常工作,就算標稱 2.5A 5V 的也不行。
結合上一節的內容來看,我們就能發現問題了。大多數用戶的樹莓派都在低壓狀態下運行,而 GPU 則靠着調節 CPU 的頻率掩蓋了這個問題,所以他們的樹莓派實際最高主頻降到了 600MHz ,這個性能已經差到和之前 ARMv6 的樹莓派一樣了。
在一些極端場合,GPU 的這些動作甚至都不夠用了,系統會莫名其妙掛掉或者直接死機,數據傳輸突然中斷,甚至損傷 SD 卡。這種事情經常發生在晶體管供電不足(under load)的情況下。然后,用戶就會跑到論壇上抱怨:我電源一點問題都沒有,我之前運行了這個那個都沒問題。 實際當然是有問題的,但是他們通常是不會相信的。
這就是日本人說的 ポカヨケ(Poka Yoke,防呆) ,換句話說,設計者在設計系統時要通過設計手段防止用戶搬起石頭砸自己的腳。所以重申一遍,官方電源適配器性價比非常高,我強烈推薦。
我很討厭板卡自己悄悄降頻,沒法人為干預。我寧願系統掛掉,然后我就知道它有問題了,然后換掉 PSU ,不像現在有那么多蠢貨在網上到處發泄他們的不滿。如果不考慮防呆的問題的話,我實在是想不出來為什么樹莓派的開發者要這么干。
供電問題的檢驗
很久很久之后,Linux 內核 終於 輸出了如下的日志記錄。查看系統日志
kern :crit : [ 1701.464833 2.116656] Under-voltage detected! (0x00050005)
kern :info : [ 1707.668180 6.203347] Voltage normalised (0x00000000
,這就說明供電不足。還好,至少 Linux 日志現在顯示了這個信息,但是如果還想繼續探究細節的話,就必須直接去敲 GPU 的門了。
使用 vcgencmd 指令 可以和 ThreadX 固件通信,獲取系統信息,或者更改設置。
# vcgencmd get_config int
arm_freq=1000
core_freq=500
sdram_freq=600
over_voltage=6
disable_overscan=1
force_pwm_open=1
可以使用 vcgencmd measure_clock arm
和 vcgencmd measure_volts
指令讀取實際的頻率和電壓值。下面是一個 監視腳本(moritoring script) 的輸出(by tkaiser)
# With a crappy PSU and/or Micro USB cable output looks like this
# on a RPi 3:
# 在樹莓派 3 上
# 如果用一個破爛電源 和/或 一根破爛 USB 電源線,輸出會像下面這樣:
#
# 44.0'C 600 MHz 1010000000000000000 1.2V
# 44.5'C 600 MHz 1010000000000000000 1.2V
# 44.0'C 600 MHz 1010000000000000101 1.2V
# 44.0'C 600 MHz 1010000000000000101 1.2V
# 44.0'C 600 MHz 1010000000000000101 1.2V
# 44.5'C 600 MHz 1010000000000000000 1.2V
# 45.1'C 600 MHz 1010000000000000101 1.2V
#
# With an ok-ish cable it looks like this (when running cpuburn-a53):
# 換用好的電源線以后(運行cpuburn-a53):
#
# 48.3'C 1200 MHz 0000000000000000000 1.3312V
# 48.3'C 1200 MHz 0000000000000000000 1.3312V
# 48.3'C 1200 MHz 0000000000000000000 1.3312V
# 48.3'C 1200 MHz 0000000000000000000 1.3312V
# 50.5'C 1200 MHz 0000000000000000000 1.3312V
# 56.4'C 600 MHz 0000000000000000000 1.2V
# 54.8'C 600 MHz 1010000000000000101 1.2V
# 55.3'C 600 MHz 1010000000000000101 1.2V
# 55.8'C 600 MHz 1010000000000000101 1.3312V
# 53.7'C 600 MHz 1010000000000000101 1.2V
# 51.5'C 600 MHz 1010000000000000101 1.2V
# 51.0'C 600 MHz 1010000000000000101 1.2V
#
# And only by bypassing the crappy connector you can enjoy RPi 3
# performing as it should (please note, there's a heatsink on my RPi
# -- without throttling would start and then reported clockspeed
# numbers start to get funny):
# 只有拋棄破爛電源和電源線,才能享受樹莓派 3 的真正性能
# (注意,我的樹莓派上裝了散熱器————不會因為過熱而降頻,數據開始變得有意思了):
#
# 75.2'C 1200 MHz 1010000000000000000 1.3250V
# 75.8'C 1200 MHz 1010000000000000000 1.3250V
# 75.8'C 1200 MHz 1010000000000000000 1.3250V
# 76.3'C 1200 MHz 1010000000000000000 1.3250V
# 76.3'C 1200 MHz 1010000000000000000 1.3250V
# 73.6'C 1200 MHz 1010000000000000000 1.3250V
# 72.0'C 1200 MHz 1010000000000000000 1.3250V
# 70.4'C 1200 MHz 1010000000000000000 1.3250V
#
# Now with a pillow on top for some throttling:
# 現在在上面捂個枕頭,開始降頻了:
#
# 82.2'C 1200/ 947 MHz 1110000000000000010 1.3250V
# 82.7'C 1200/ 933 MHz 1110000000000000010 1.3250V
# 82.7'C 1200/ 931 MHz 1110000000000000010 1.3250V
# 82.7'C 1200/ 918 MHz 1110000000000000010 1.3250V
# 82.2'C 1200/ 935 MHz 1110000000000000010 1.3250V
# 79.9'C 1200/1163 MHz 1110000000000000000 1.3250V
# 75.8'C 1200 MHz 1110000000000000000 1.3250V
#
# And here on RPi 2 with crappy USB cable and some load
# 在樹莓派 2 上用破爛 USB 電源線,再加上一些負載
#
# 50.8'C 900 MHz 1010000000000000000 1.3125V
# 49.8'C 900 MHz 1010000000000000000 1.3125V
# 49.8'C 900/ 600 MHz 1010000000000000101 1.2V
# 49.8'C 900/ 600 MHz 1010000000000000101 1.2V
# 48.7'C 900/ 600 MHz 1010000000000000101 1.2V
# 49.2'C 900/ 600 MHz 1010000000000000101 1.2V
# 48.7'C 900 MHz 1010000000000000000 1.3125V
# 46.5'C 900 MHz 1010000000000000000 1.3125V
#
# The funny thing is that while the kernel thinks it's running
# with 900 MHz (performance governor) in reality the 'firmware'
# throttles down to 600 MHz but no one knows :)
# 有趣的事情是,當內核認為自己運行在 900 MHz 的時候(Linux 的性能調節器)
# 實際已經被"固件"降到了 600 MHz,但是沒人知道這事 :)
結論
我承認在 SBCs 的歷史上,樹莓派有非常重要的地位,但是時代變了,現在它的質量、性能和開源程度都落后了,市面上有很多不貴的替代品,他們的開發者在這些問題上做得更好。
盡管如此,我還是在用樹莓派做創建私人雲服務的教學。鑒於樹莓派如此流行,只要它還能做這個事情,支持它對我來說就還是有意義的。
作者: nachoparker
Humbly sharing things that I find useful github dockerhub View all posts by nachoparker
(評論我就不翻譯了,太長了,感興趣的觀眾可以直接查閱原網站。)