Building a Homelab VM Server (2020 Edition)

Michael Lynch

打造 Homelab 虛擬機伺服器(2020 年版)

原文由 Michael Lynch 發布,訂閱此部落格

過去五年來,我所有的軟體開發都是在虛擬機(VM)上進行的。每個專案都有各自專屬的虛擬機,讓我免於處理相依套件衝突和 TCP 連接埠衝突的麻煩。

三年前,我更進一步自己組了一台 homelab 伺服器來託管所有的虛擬機。這是一筆非常划算的投資,加快了許多開發工作,也提升了穩定性。

最近幾個月,我開始碰到這台 VM 伺服器的效能瓶頸。專案變得越來越吃資源,當初組裝時犯下的一些錯誤也開始帶來困擾。因此我決定在 2020 年打造一台全新的 homelab VM 伺服器。

我的新 VM 伺服器組裝零件照片

我的新 VM 伺服器組裝零件(至少是大部分)

不想看前言,直接看組裝清單吧!

如果你對這個專案的「為什麼」沒興趣,可以直接跳到組裝清單

為什麼要組一整台 VM 伺服器?

一開始,我是在 Windows 桌機上用 VirtualBox 跑虛擬機。一開始還算堪用,但重新開機很快就變成一大困擾。

夾在 Windows Update 的強制重開機、為了完成軟體安裝而主動重開,以及偶爾的系統當機之間,我每個月得把整套開發用的虛擬機重啟三到五次。

一台專用的 VM 伺服器幫我省去了大多數的重開機。VM 宿主機只跑最精簡的軟體,所以當機和強制重開的情況很少發生。

什麼是「homelab」?

Homelab 只是近幾年流行起來的口語說法。Homelab 伺服器跟其他伺服器沒什麼不同,差別只在於你是把它組在家裡,而不是在辦公室或資料中心。很多人把它當作低風險的練習環境,先熟悉各種工具,之後再應用到實際的商業場景中。

為什麼不用雲端運算?

雲端伺服器也能達到同樣的功能,還能省去(好玩的!)自己維護硬體的麻煩,但費用實在太高。以跟我的 homelab 伺服器相當的 VM 資源來說,AWS EC2 執行個體一年要花超過 6,000 美元

顯示 AWS EC2 執行個體一年要花 6,112.68 美元的截圖

如果用 AWS 取代我的 homelab 伺服器,一年要多花超過 6,000 美元

如果我需要時才開、不用就關,當然可以大幅降低雲端費用,但那會讓工作流程變得卡卡的。有了本地的 VM 伺服器,我可以讓 10 到 20 台虛擬機隨時保持可用狀態,而不用斤斤計較費用。

從過去的錯誤中學習

我 2017 年組的那台表現不錯,但在用了三年之後,我也發現了幾個迫切需要改進的關鍵問題。

1. 把儲存空間留在本地

我的 Synology NAS 有 10.9 TB 的儲存容量。想說都已經有這麼多網路儲存空間了,「何必在伺服器上裝超過開機所需的最低限度硬碟呢?」

顯示 10.9 TB 的截圖

在第一次組裝時,我依賴那 10.9 TB 的網路儲存空間。

結果證明這是個蠢主意。

第一,把虛擬機跑在網路儲存上,會讓整個系統緊緊依賴那台磁碟伺服器。Synology 每隔幾個月就會發布系統更新,而且每次更新都要重開機。虛擬機都跑在 Synology 的儲存空間上,每次要套用更新,我就得先把所有虛擬機全部關掉。這跟當初在 Windows 桌機上跑虛擬機時遇到的重開機問題一模一樣。

Synology 升級畫面的截圖

儲存伺服器上的作業系統需要頻繁升級。

第二,透過網路進行隨機磁碟存取非常慢。第一次組裝時,我主要做的是後端的 Python 和 Go 應用,幾乎沒有大量的磁碟 I/O。但後來我開始涉足前端網頁開發。現代的前端框架全都用 Node.js,每個專案的相依套件裡動輒就有 1 萬到 20 萬個零散的 JavaScript 檔案。Node.js 的建置過程涉及大量的隨機磁碟存取,對網路儲存來說是最糟的情況。

2. 選更好的虛擬機管理軟體

第一台伺服器時,我評估了兩種虛擬機管理方案:KimchiVMware ESXi。VMware 成熟得多、也精緻得多,但 Kimchi 那種努力不懈的草根精神和開源特質吸引了我。

Kimchi 的截圖

早期透過 Kimchi 網頁介面看到的虛擬機清單

幾乎就在我安裝完之後,Kimchi 的開發就停擺了。

Kimchi 儲存庫的提交紀錄圖表,顯示在我開始使用後不久提交就停止了

Kimchi 的程式碼提交紀錄,在我開始使用後不久就幾乎停了

時間一久,Kimchi 的缺點越來越明顯。我常常得對某台虛擬機的「複製」或「關機」按鈕點好幾次,它才肯有反應。還有一些令人抓狂的介面 bug,按鈕會在我點擊前一刻突然消失或位移。

3. 預先規劃遠端管理

我的舊 VM 伺服器照片

我的 VM 伺服器塞在辦公室的角落,平常很方便,但偶爾需要實體接觸時就很麻煩。

如果你看到這裡心想:「Kimchi 不過就是個軟體,為什麼 Michael 為了換個虛擬機管理工具就得重組一整台伺服器?」那是因為我當初沒料到遠端管理有多重要。

我的 VM 伺服器其實就是一台放在辦公室角落、沒接螢幕也沒接鍵盤的電腦。99% 的時間這樣都沒問題,我可以透過 SSH 或網頁介面連線。但剩下那 1% 的情況,像是伺服器無法開機、或是我想重灌宿主作業系統時,就非常痛苦。我得把伺服器拖到桌邊,拔掉桌機的鍵盤和螢幕,接上去修好問題,再把辦公室的一切恢復原狀。

下一次組裝,我想要一個開機就能擁有實體等級存取權限的虛擬主控台。我想到的是類似戴爾的 iDRAC惠普的 iLO那樣的方案。

戴爾 iDRAC 介面的截圖

戴爾 iDRAC 是我考慮過的遠端伺服器管理方案之一。

挑選零件

CPU

我的第一台 VM 伺服器用的是Ryzen 7 1700。八核心十六執行緒,在當時是最熱門的新款 CPU。但當我在/r/homelab(Reddit 上的 homelab 社群)上分享我的組裝成果時,大家卻嘲笑我是用消費級零件的菜鳥。厲害的玩家都用企業級設備。

Reddit 使用者 /u/pylori 問道:『兄弟,你真的有在玩 homelab 嗎?認真的嗎,你居然擔心企業級硬體會故障?那可是比新的消費級產品更耐用的東西耶?』

/r/homelab 對我的第一次組裝不怎麼欣賞

為了不再被 /r/homelab 嘲笑,我決定踏入企業級伺服器硬體的世界。甚至還更講究地選擇組一台雙實體 CPU 的系統。

為了用最划算的價格換到最佳效能,我把搜尋範圍限縮在四到八年前推出的二手 CPU。每個候選型號,我都會到 PassMark 上查詢跑分,再到 eBay 查看該型號二手品最近的成交價。

性價比看起來最好的似乎是Intel Xeon E5 v3 系列,尤其是 2600 型號。我最後選定了E5-2680 v3。它在 PassMark 上的平均分數是 15,618,在 eBay 上的二手價約 130 美元。

Intel Xeon E5-2680 v3 CPU 照片Xeon E5-2680 v3 在 cpubenchmark.net 上 15618 分的截圖

Intel Xeon E5-2680 v3 在cpubenchmark.net 上得分為 15,618

作為對照,我上一台的 Ryzen 7 跑分是 14,611。所以換成雙顆 E5-2680,處理效能就能比舊伺服器提升一倍以上。

主機板

SuperMicro MBD-X10DAL-I-O 主機板照片

雙 CPU 系統的缺點是主機板的選擇變得很有限。只有少數主機板支援雙 Intel 2011-v3 CPU。它們的價格從 300 到 850 美元不等,遠遠超出我原本預期要花在主機板上的預算。

我選了美超微 MBD-X10DAL-I-O,320 美元在同類主機板中算是便宜的,但仍然是我上一片主機板價格的五倍

記憶體

Crucial 記憶體照片

伺服器記憶體的選擇似乎沒什麼太多講究。消費級硬體有許多網站會發表不同記憶體的評測和跑分,但伺服器記憶體我幾乎找不到這類資訊。

我選了Crucial CT4K16G4RFD4213 64 GB(4 x 16 GB),純粹是因為信任這個品牌。我選 64 GB 是因為上一台是 32 GB,有些工作流程已經快把記憶體用滿,所以我想記憶體加倍應該能撐個幾年。

儲存裝置

Samsung 860 EVO 照片

我很喜歡 M.2 SSD,小巧、效能出色,而且可以直接插在主機板上,不需要任何線材。可惜 MBD-X10DAL 不支援 M.2 介面。

所以我還是用傳統的 SATA。我買了一顆1 TB 的 Samsung 860 EVO。我通常會給每台虛擬機分配 40 GB 空間,所以 1 TB 綽綽有餘。之後如果需要升級,隨時可以再加硬碟。

電源

Corsair CX550M 550W 80 Plus 銅牌照片

挑選電源供應器(PSU)沒什麼特別的,所以我又是挑信任的品牌,選了海盜船 CX550M 550W 80 Plus 銅牌

所有零件的瓦數加起來是 400W,所以 450W 其實就夠了。但 550W 版本只貴 10 美元,多 100W 的餘裕感覺很划算。

對我來說另一個重要的功能是半模組化線材。上一次組裝時,我犯了用非模組化線材的錯誤,代表所有電源線都會永久接在電源上。我的伺服器內部零件很少,多餘的電源線只會造成雜亂。用半模組化線材,我可以把用不到的線從電源上拔掉,讓內部保持整潔。

風扇

Hyper 212 CPU 風扇照片

雙 CPU 的組裝讓散熱成了意想不到的挑戰。MBD-X10DAL 在兩個 CPU 插槽之間沒留下太多空間,所以我仔細挑了夠薄、可以並排安裝的風扇。一對Cooler Master Hyper 212 剛好符合需求。

機殼

Fractal Meshify C 機殼照片

我的伺服器就安靜地放在辦公室角落,所以我不想要有透明側板或炫目燈效的機殼。

Fractal Design Meshify C 黑色版評價不錯,看起來是個簡單、安靜的機殼。

顯示卡

MSI GeForce GT 710 顯示卡照片

對於無頭伺服器來說,顯示卡其實不太重要。但為了在初次安裝和偶爾除錯時能看到畫面,還是得有一張,所以我選了便宜又方便的微星 GeForce GT 710

遠端管理

我研究了一下遠端管理方案,結果被價格嚇了一大跳。一開始我想用戴爾的 iDRAC,但遠端主控台需要300 美元的企業授權,而且還限用戴爾的零件。我也看了 KVM over IP 的方案,但那些更貴,要價 600 到 1,000 美元。

Raritan Dominion KVM over IP 購買頁面的截圖

市售的 KVM over IP 裝置要價在 500 到 1,000 美元之間。

為了實現遠端管理,我採取了一個不尋常的做法:用 Raspberry Pi 自己做了一台 KVM over IP 裝置。我把它叫做TinyPilot

TinyPilot 接上伺服器的照片透過 TinyPilot 安裝 Proxmox 的畫面截圖

使用TinyPilot在伺服器上安裝作業系統

TinyPilot 會擷取 HDMI 輸出,並從瀏覽器轉發鍵盤和滑鼠的輸入。它的效果就跟你實際接上鍵盤、滑鼠和螢幕一模一樣。軟體是開源的,我也有提供現成的成品供人購買。

我的 2020 年伺服器組裝清單

類別零件我付的價格
CPUIntel Xeon E5-2680 v3(x2,二手)$264.82
主機板SuperMicro MBD-X10DAL-I-O$319.99
硬碟Samsung 860 EVO (1TB)$149.99
記憶體Crucial CT4K16G4RFD4213 64GB (4 x 16GB)$285.99
電源Corsair CX550M 550W 80 Plus Bronze$79.99
顯示卡MSI GeForce GT 710$44.99
機殼Fractal Design Meshify C Black$84.99
CPU 風扇Cooler Master Hyper 212(x2)$72.98
遠端管理TinyPilot(KVM over IP)$65.00
總計$1,368.74
空機殼外側的照片空機殼內部的照片

Meshify C 是我用過最喜歡、最好整線的機殼。它內建的魔鬼氈束帶可以整理線材,還有橡膠隔板能把線藏在機殼的另一側。

已安裝 CPU 的主機板照片已安裝所有零件的主機板照片

安裝主機板、CPU、記憶體和風扇

我已完成的 homelab VM 伺服器組裝成果

組裝完成,放在它的新家

虛擬機管理:Proxmox

我用Proxmox VE 來管理虛擬機。

Proxmox 儀表板的截圖

Proxmox 上所有虛擬機的儀表板

在上一台被Kimchi 雷過之後,我其實不太想再嘗試免費方案。Proxmox 已經有 12 年的歷史,感覺是個夠穩的選擇。就介面而言,它比 Kimchi 好了一大截,但精緻度還是比不上 ESXi。

我最欣賞 Proxmox 的地方是它可以寫腳本自動化。我常做的一件事是從範本建立一台新虛擬機,然後用Ansible 安裝其他軟體。用 ESXi 時,我找不到不用每次手動在網頁介面上點擊按鈕就能完成這件事的方法。但用 Proxmox,它的 CLI 夠強大,讓我可以把整個流程寫成腳本,只要執行 ./create-vm whatgotdone-dev,腳本就會幫我建立一台全新的 What Got Done 開發用虛擬機。

我對 Proxmox 最大的抱怨是它不太直覺。我甚至是在找到Craft Computing 的安裝教學之後,才搞懂要怎麼安裝它。不過一旦摸熟了,用起來就很順手。

效能測試

在汰換舊的 VM 伺服器之前,我針對日常工作流程做了一些簡單的效能測試,來衡量效能提升了多少。

我舊伺服器上的大多數虛擬機都跑在網路儲存上,因為本地 SSD 只夠放幾台虛擬機。在下面的測試中,我比較了三種不同情境下的效能:

  • 2017 年伺服器(NAS):放在網路儲存上的典型虛擬機
  • 2017 年伺服器(SSD):少數放在本地儲存上的虛擬機
  • 2020 年伺服器:所有虛擬機都跑在本地 SSD 上,所以沒有 NAS 與 SSD 之分

提醒:這些並非嚴謹的測試。每個工作流程我只測了一次,也沒有對測試條件做任何標準化。

建立一台新虛擬機

第一項測試是建立一台新虛擬機。我有一個標準的 Ubuntu 18.04 虛擬機範本,幾乎所有虛擬機都是用它建立的。每次需要新虛擬機時,我會執行一個 shell 腳本,依序執行以下步驟:

  1. 從基礎範本複製虛擬機。
  2. 啟動虛擬機。
  3. 將主機名稱從 ubuntu 改為該虛擬機的名稱。
  4. 重新啟動虛擬機以套用新的主機名稱。
  5. 執行 apt update && apt upgrade 更新到最新軟體。
圖表顯示 2020 年伺服器在 NAS 和 SSD 上都勝過 2017 年伺服器

新伺服器讓這個流程的速度大幅提升。複製一台虛擬機的時間從舊伺服器的 15 分鐘縮短到新伺服器上的不到 4 分鐘。

如果跳過套件升級的步驟,速度提升就沒那麼驚人。新伺服器在 NAS 儲存上依然大幅領先,時間從 8 分鐘降到不到 2 分半。但若都是 SSD 對 SSD,新伺服器反而比舊的慢。複製虛擬機很可能是受限於磁碟,而我舊的 M.2 SSD 比新的 SATA SSD 更快。

啟動虛擬機

從按下虛擬機電源的那一刻起,要多久才會看到登入提示?

圖表顯示 2017 年伺服器在 NAS 上耗時 48.5 秒、SSD 上 32.4 秒,而 2020 年伺服器僅需 18.5 秒

舊虛擬機要 48 秒才能開機。舊系統上少數放在 SSD 的虛擬機表現好一點,32 秒就出現登入提示。新伺服器則把兩者都遠遠拋在後頭,只需 18 秒就能啟動一台虛擬機。

執行 What Got Done 的端對端測試

我的週誌應用程式 What Got Done 有一套端對端自動化測試,會完整演練它的功能。這是我最多元的工作流程之一——包含編譯 Go 後端、編譯 Vue 前端、建置一系列 Docker 容器,以及自動化操作 Chrome 來測試應用程式。這是在舊虛擬機上會把資源吃光的工作流程之一,所以我本來預期在這裡會有大幅的效能提升。

圖表顯示 2017 年 SSD 伺服器耗時 5.4 分鐘,2020 年伺服器則為 5.6 分鐘

令人意外的是,兩台伺服器之間並沒有顯著的效能差異。如果是冷啟動(需要下載所有 Docker 基礎映像檔),新伺服器反而比舊的慢 2%。當基礎 Docker 映像檔已經在本地時,新伺服器雖然勝過舊的,但也只快了 6%。看起來瓶頸主要在磁碟和瀏覽器互動上,所以新伺服器沒有帶來太多差異。

建置 Is It Keto

我另一個常做的工作流程是建置Is It Keto,這是我為生酮飲食者做的資源網站。我使用Gridsome(一個給Vue 用的靜態網站產生器)來產生網站。

圖表顯示 2017 年 SSD 伺服器耗時 3.7 分鐘,2020 年伺服器則為 4 分鐘

我原本預期這裡會有明顯的速度提升,所以當建置反而變慢時感到很意外。在舊伺服器上,這個建置過程看起來主要是受限於 CPU,但在新伺服器上把 CPU 資源加倍卻一點幫助也沒有。我接著猜可能是受限於磁碟,所以試著把檔案搬到 RAMdisk 上,但建置速度還是一樣。

我的推測是,這個工作流程雖然受限於 CPU,但平行化做得很差。舊伺服器的 CPU 核心數較少,但每個核心更快。如果建置過程只能用到五、六個執行緒,就無法發揮新伺服器 48 核心的優勢。

訓練新的 Zestful 模型

Zestful 是我用機器學習打造、專門解析食譜食材的 API。每隔幾個月,我就會用新資料重新訓練它。這是我最吃 CPU 的工作流程,所以我很想看看新系統的表現如何。

圖表顯示 2017 年 SSD 伺服器耗時 18.3 分鐘,2020 年伺服器僅需 8 分鐘

終於有個能讓我 48 核心大顯身手的案例了!新伺服器把舊的遠遠甩開,只用不到一半的時間就完成了模型訓練。可惜的是,這個流程我一年只會跑個幾次。

心得反思

用消費級硬體沒什麼好丟臉的

雖然 /r/homelab 可能永遠不會認同我,但下一次組裝,我打算回歸消費級硬體。

我認為伺服器零件最大的優勢在於它們與伺服器軟體的相容性更好。早在 2017 年,我得先關掉 CPU 的多執行緒才能安裝 ESXi,效能因此大幅下降。但那是 Linux 核心的限制,後來的更新已經修復了這個問題

伺服器硬體之所以價格更高,是因為它更可靠。對於面向使用者的服務來說,這個特性很重要,但在開發用的伺服器上就沒那麼關鍵。開發伺服器偶爾當機或出現位元翻轉,不至於毀了你一整天。

要把雙 CPU 的總成本考慮進去

這是我第一次組雙 CPU 的電腦。這是個有趣的經驗,但我覺得不太值得這麼費工。

根據我的測試結果,CPU 很少是工作流程中的瓶頸。最有力的證據是 Proxmox 上 CPU 使用率隨時間變化的圖表。過去幾個月裡,我的 CPU 負載從未超過 11%,可見我配置得過度超標了。

圖表顯示我的 CPU 使用率從未超過 11%

過去幾個月,我的 CPU 使用率最高也從未超過伺服器總容量的 11%。

雙 CPU 的需求大幅墊高了主機板的成本,也限制了我的選擇。只有極少數主機板支援雙 Intel 2011-v3 CPU,所以在其他主機板功能上,我幾乎沒什麼選擇。

遠端管理帶來彈性

在用 TinyPilot 管理伺服器之前,我沒意識到自己有多排斥變動。改任何 BIOS 或網路設定,都可能讓我接下來的幾個小時得在搬機器、重接週邊、除錯和修復中度過。知道這點之後,我根本不想去動那些設定。

有了虛擬主控台,我就有了犯錯的自由,也更願意去嘗試不同的作業系統。安裝和學習新系統永遠都需要花不少功夫,但知道自己不用再把機器搬來搬去,就讓我更願意嘗試。要不是打造了 TinyPilot,我可能會覺得 ESXi「夠用了」而繼續用下去,而不是冒險嘗試 Proxmox。

一年後

更新於 2021-12-05

有讀者問我回頭看這次組裝有沒有什麼想改變的地方,所以我想在用了這台伺服器一年多之後,來分享一下近況。

CPU —— 太多了

我在雙顆 E5-2680 v3 上絕對是配置過頭了。

圖表顯示我很少讓 CPU 使用率超過 50%

使用一年下來,我很少讓 CPU 使用率超過 50%,代表其實一顆 CPU 就夠了。

使用一年下來,我從未讓 CPU 使用率達到 100%,只有少數幾次超過 50% 容量,所以其實只用一顆 CPU 也完全夠用。

SSD —— 不夠用

我的 1 TB Samsung SSD 幾乎快滿了,所以我剛又買了一顆2 TB 的 Samsung 870 Evo,總共就有 3 TB 的 SSD 空間。機殼裡還有充足的空間可以再裝更多 SSD。

顯示磁碟已使用 85% 的截圖

我的伺服器只剩下 15% 的磁碟空間可用。

預設情況下,我給每台虛擬機分配 40 GB 磁碟空間,有時會不太夠用。當我在處理 Docker 相關工作時,容器映像檔很快就會把磁碟吃光。每隔幾週,我就會發現虛擬機的磁碟被塞滿了,得執行 docker system prune --all 來清掉,多加的磁碟空間可以讓我免於這些中斷。

記憶體 —— 稍微不太夠

64 GB 的記憶體大致上夠用,但有幾次我得關掉一些虛擬機來騰出更多記憶體。我不喜歡為了管理資源而中斷工作流程,所以我剛又訂了 64 GB 同款的記憶體。

圖表顯示記憶體使用量經常達到 64 GB 上限

我的記憶體使用量已經快達到 64 GB 的上限。

Proxmox —— 依然很棒

我還是很喜歡用 Proxmox 來管理虛擬機。我買了授權,雖然不確定有沒有用到什麼新功能,但很樂意支持這個專案。

讓人有點無奈的是,授權是依 CPU 數量計價,所以除了為買太多 CPU 感到不好意思之外,我還得為 Proxmox 付雙倍的錢。

零件清單(截至 2021-12-05)

類別零件我付的價格
CPUIntel Xeon E5-2680 v3(x2,二手)$264.82
主機板SuperMicro MBD-X10DAL-I-O$319.99
硬碟Samsung 860 EVO (1TB)$149.99
硬碟Samsung 870 EVO (2TB)$239.99*
記憶體Crucial CT4K16G4RFD4213 64GB (4 x 16GB)$285.99
記憶體Crucial CT4K16G4RFD4213 64GB (4 x 16GB)$164.11*
電源Corsair CX550M 550W 80 Plus Bronze$79.99
顯示卡MSI GeForce GT 710$44.99
機殼Fractal Design Meshify C Black$84.99
CPU 風扇Cooler Master Hyper 212(x2)$72.98
遠端管理TinyPilot(KVM over IP)$65.00
總計$1,772.84

* 在最初組裝的一年後購入。

本文章由 muse-spark-1.2-contributor 進行翻譯

留言