Browser Use: 在 EC2 上運行 Firecracker microVMs 以實現高性能雲端瀏覽器
Browser Use 重建了其雲端瀏覽器基礎設施,將每小時瀏覽器成本從 $0.06 降低至 $0.02,並將 VM 冷啟動時間縮短至 400ms 以下。該系統透過為每個瀏覽器工作階段提供專屬的 Firecracker microVM 來提供高隔離性,並將這些 VM 嵌套運行在一般的 Amazon EC2 實例中,以優化成本與擴展速度。
從 Unikernels 轉向 Firecracker
由於擴展限制,Browser Use 捨棄了 Unikraft unikernels。雖然 unikernels 提供了快速的啟動時間與低閒置成本,但它們缺乏強大的內建自動擴展功能,這在流量高峰期間需要人工介入,且先前在一次負載測試中曾導致了 45 分鐘的生產環境停機。
採用 Firecracker 是為了提供一個輕量級的虛擬化層,確保每個瀏覽器與主機及其他工作階段隔離,同時讓控制平面(control plane)能更有效地管理 VM 的建立與監控。
用於自動擴展的自定義控制平面
為了解决 Unikraft unikernels 的擴展問題,Browser Use 開發了一個自定義控制平面。該控制平面即時管理瀏覽器群集,並執行以下功能:
- Host Selection:將使用者分配至具有可用容量的 EC2 hosts。
- Dynamic Scaling:當流量上升時自動啟動新機器,並停止向標記為移除的 hosts 發送新工作階段。
- Real-time Monitoring:透過追蹤目前正在啟動的瀏覽器並識別不應接收新工作階段的 hosts,其運作速度比標準的 AWS CloudWatch 指標更快速。
在 EC2 上優化嵌套虛擬化
雖然 Firecracker 通常運行在裸機(.metal)實例上,但 Browser Use 使用一般的 EC2 實例。這種方法可以實現更快的 host 啟動時間(約 30 秒)並降低成本,儘管這也帶來了嵌套虛擬化(在 VM 內運行 VM)的挑戰。
為了減輕因頁面錯誤(page faults)跨越兩個 hypervisor 層而產生的延遲,團隊實施了幾項記憶體與 CPU 優化措施:
記憶體優化與減少頁面錯誤
最初的冷啟動需要 9.8 秒,其中頁面錯誤佔了 VM exits 的 72%。團隊透過以下方式將其降低至 3.1 秒:
- 增加頁面大小:從 4KB 頁面切換到 2MB 頁面,將每個頁面的頁面錯誤次數減少了 512 倍。
- 實施
userfaultfd:使用自定義的 LinuxuserfaultfdAPI 處理程序來預載 Chromium 最有可能首先存取的記憶體頁面。 - 移除舊版檢查:停用對不存在的 PS/2 keyboard 的 500ms 檢查。
- 優化 Ready-Signals:將 HTTP 輪詢替換為
vsock通訊通道,讓主機能在不到一毫秒內偵測到瀏覽器何時就緒緒。
CPU 調度與突發管理
Chromium 的啟動過程是 CPU 密集型的,而其運行階段則相對平靜。Browser Use 透過兩階段 CPU 策略來管理此點:
- Launch Phase:虛擬 CPU (vCPUs) 保持未綁定狀態,允許 Linux 將啟動突發流量分散到所有可用的 host cores。
- Operational Phase:一旦瀏覽器就緒,vCPUs 會被綁定到穩定的 cores,以防止干擾並允許在每個 host 上進行更密集的瀏覽器打包。
- Hyperthread Management:為了防止物理核心的爭用,每個瀏覽器都會被分配物理核心的兩個孿生執行緒(sibling threads)。
- Real-time Priority:vCPUs 被賦予即時優先權,以確保立即執行,這在 1,000 個瀏覽器的壓力測試中消除了工作階段遺失的問題。
透過 Headless Chromium Fork 實現隱身性
為了在不增加 GPU 或顯示伺服器開銷的情況下避免機器人偵測,Browser Use 使用完全的 headless 模式,並結合了自定義的 Chromium fork。
Low-level Patching:團隊並非使用 JavaScript 注入來隱藏自動化標記(例如
navigator.webdriver),而是在原始碼層級對 Chromium 進行修補,以防止這些標記被暴露。Lvl-level Fingerprinting:系統利用數萬個橫跨 macOS、Windows 與 Linux 的真實指紋,來模擬真實的使用者環境。
根據其內部基準測試,這種方法在 81% 的次數下能避免被封鎖,顯著高於純 headless Chromium (2%)。
性能結果與未來路線圖
在 10,000 個工作階段的壓力測試中,系統實現了 825ms 的 p50 瀏覽器建立延遲,以及 1.35s 的 p99,且可靠性達 100%。VM 冷啟動本身則在 400ms 以下。
下一個瓶頸:Chromium 啟動
目前最大的延遲來源是 VM 恢復後啟動 Chromium 所需的 545ms (p50)。團隊目前正在研究在 Chromium 啟動 之後 對 VM 進行快照(snapshotting),這將允許新工作階段在喚醒時即帶有運行中的瀏覽器,從而可能將 Chromium 的啟動時間完全從關鍵路徑中移除。