AI News HubLIVE
站內改寫2 分鐘閱讀

使用 kTLS 和 splice(2) 實現沙箱的零拷貝 TLS 入口

Tensorlake 重建了沙箱的網絡入口架構,將數據路徑從 L7 反向代理遷移到 L4 字節轉發,利用內核 TLS(kTLS)和 splice(2) 實現零拷貝,大幅提升吞吐量並降低 CPU 開銷。架構變化包括分離數據路徑和控制平面、使用 kTLS 在內核中完成加解密、通過字節流監測實現自適應超時。性能測試顯示,單連接吞吐量從 1.12 GB/s 提升至 2.50 GB/s,每 GB 的 CPU 消耗從 0.90 CPU 秒降至 0.49 CPU 秒。

來源Hacker News AI作者: diptanu

Tensorlake 的沙箱產品為 AI 代理提供了高性能運行環境,代理需要頻繁與沙箱通信以執行上傳、下載和進程管理等操作。然而,原有的入口架構依賴於兩層 L7 反向代理,導致複雜的超時配置、高 CPU 開銷以及連接中斷問題。為此,團隊重新設計了入口網絡,將數據路徑從 L7 代理遷移到 L4 字節轉發,並引入內核 TLS(kTLS)和 splice(2) 系統調用,實現了近乎零開銷的數據傳輸。

在舊架構中,用户流量首先通過邊緣網關進行 TLS 終止和認證,然後以 mTLS 方式轉發到第二層 L7 代理,後者再將請求轉發給沙箱內的應用。這一過程涉及兩次用户態拷貝和完整的 HTTP 解析,性能受限且維護複雜。新架構將數據路徑抽象為一個獨立的 L4 轉發守護進程,與沙箱編排器分離,從而避免編排器升級時中斷實時連接。

新的數據路徑完全在 L4 層工作:邊緣網關終止 TLS 後,通過 mTLS 連接到主機上的 L4 轉發器,併發送一個短幀,包含沙箱 ID 和目標地址。轉發器據此建立到沙箱應用的連接,然後使用 splice(2) 將兩個連接在內核中直接拼接。關鍵在於,轉發器在用户態完成 TLS 1.3 握手後,通過 setsockopt(TLS_TX) 和 setsockopt(TLS_RX) 將密鑰安裝到 socket 中,讓內核接管記錄層。這樣,從網關套接字讀取的數據已經是解密後的明文,可以零拷貝地 spliced 到沙箱套接字;反之亦然。這一過程完全避免了用户態緩衝。

由於移除了 L7 層,自適應超時機制改為基於字節流監測。splice() 返回的字節數被用於計量流量,轉發器定期向編排器報告,從而重置沙箱的空閒計時器。連接關閉也更加透明,半關閉和重置信號都能直接傳遞。

性能測試顯示,新路徑的單連接吞吐量從 1.12 GB/s 提升到 2.50 GB/s,每 GB 的 CPU 消耗從 0.90 CPU 秒降低到 0.49 CPU 秒。有趣的是,大部分性能提升來自移除 L7 解析和緩衝,而 kTLS 本身貢獻了約 20% 的吞吐量提升。需要注意的是,這些測試是在單台主機上進行的,多連接場景下聚合吞吐量可達 8.67 GB/s(69 Gbps)。團隊計劃未來進一步優化 splice 循環的序列化問題,並探索繞過 kTLS 直接在內核拼接的路徑。