內核層網絡棧優化項目Fastsocket背后的故事
作者 劉宇/楊賽
2014 年 10 月 18 日,當時就職于新浪操作系統團隊的林曉峰在 Github 上開源了名為 Fastsocket 的項目,并在之后一天的中國 Linux 內核開發者大會上對該項目的原理和應用效果進行了介紹(演講 slides 在此)。根據 Github 官網的介紹,Fastsocket 是:
- 高度可擴展的 socket
- 是 Linux 內核層面的底層網絡實現
- 在多核機器上可實現極佳性能,24 核以內的性能增長呈線性,遠超過默認內核在 12 核以上的機器就會出現性能下降的情況
- 非常容易使用和維護,應用代碼無需變更
- 針對 kernel-2.6.32-431.17.1.el6/CentOS-6.5 的實現
- 已經在新浪的生產環境部署
- 由新浪的操作系統團隊發起
- 清華大學操作系統實驗室、Intel、哲思自由軟件社區(Zeuux)對該項目均有支持
- 開源協議為 GPLv2 </ul>
開源之后的兩周之內,該項目迅速收獲了 1800 多個 star 和 200 多個 fork,可以說成為了開源社區又一新的熱點項目。近日,InfoQ 編輯對 Fastsocket 的主要維護人員林曉峰、新浪操作系統團隊的負責人李曉棟進行了郵件采訪,了解有關 Fastsocket 項目的更多背景。
InfoQ:簡單介紹一下 fastsocket 的開發背景吧。這個項目主要是你在新浪這邊跟清華大學的操作系統實驗室一起合作。一開始是在什么時候發起的?發起的動機是什么?與清華大學的操作系統實驗室、Intel 和哲思自由軟件社區的合作模式是怎樣的?
李曉棟:要說明清楚這點,需要從我們在新浪內部發起的 FastOS 計劃談起。
從技術上講,FastOS 計劃要做的是對 Linux 內核“協議棧、文件系統、IO”等不同子系統進行定向性的優化,以滿足高性能網站的實際需要。Fastsocket 是 FastOS 計劃中的第一個子項目,今后我們還會推出 FastTCP、FastIO……
從管理理念上講,FastOS 期望打造的是一個有公司保障、但沒有公司邊界、開放式的生態系統,可參與該計劃的不僅有新浪,而且還包括:各類硬件提供商、高校實驗室、國內外自由軟件組 織、IT 媒體、互聯網技術同行以及對我們計劃感興趣的任何開發者。所有正式加入我們 FastOS 合作計劃的組織和個人,不僅可從共享通道中獲得各合作方提供的軟硬件及宣傳資源,更為重要的是: 在對其它合作方利益無損的前提下,可以各取所需,實現合作成果的最大化分享。前面提到 FastOS 計劃是有公司保障的,一是指該計劃中所有的子項目都是在新浪生產環境中被正式使用的,所有公開的測試數據都是真實的,有可信度方面的保障;二是指 FastOS 計劃的日常運作管理由新浪操作系統團隊做長期保障,有一套明確的治理細節和管理流程,同時我們會充分考慮并切實避免合作方之間的利益沖突。 在這里,我們也誠邀請大家加入進來。
林曉峰:Fastsocket 項目與 2013 年初正式立項,該項目最初要解決的問題就是要提升七層交換服務的 Haproxy 的單機性能。提升單機性能根本原因在于降低成本,包括硬件相關成本和集群運維成本。經過 Haproxy 系統詳盡分析后,我們發現大部分 CPU 資源消耗在 kernel 里,并且在多核平臺下,kernel 在網絡協議棧處理過程中存在著大量同步開銷。據此,我們將開發 kernel 并行網絡協議棧作為核心目標,來滿足未來多核平臺下萬兆高性能的網絡需求。隨著 Fastsocket 展現出強勁的性能優勢,以及在新浪生產環境落地,我們希望可以將項目成果整理過學術論文,并有信心沖擊國際頂級系統和網絡方面的技術會議。借助合作伙伴 Intel 的牽線,我們聯系到了清華操作系統中心的陳渝教授,我們一拍即合的開始 Fastsocket 項目的深入合作,并且完成了 Fastsocket 論文,并已經向相關會議投稿,目前在等待結果。
InfoQ:如你之前的分享所說,多核機器在沒有優化之前,CPU 資源大多消耗在鎖上面了。多線程的性能提升一般有哪些手段,各自的原理是什么?
林曉峰:我并不是多線程編程專家,不過可以給一些有關多核平臺性能優化的通用建議。設計程序框架的時候,要盡可能的避免多線程訪問需要同步的共 享資源,互斥上鎖是多核平臺性能第一殺手,每個線程只訪問自己的數據是多核平臺最高效,用戶程序和系統內核里都一樣。另外,線程數量不宜太多,并最好和核 心綁定,線程調度也是有開銷的,保持線程在一個核心上運行可以讓 CPU cache 更高效。
InfoQ:簡單介紹一下 Fastsocket 提升性能的技術原理?做了哪些技術上的實現或優化?
林曉峰:Fastsocket 提升性能,主要在于提高了 kernel 網絡協議棧的效率,所以網絡I/O密集的應用可以收到很好的性能提升效果。Fastsocket 對網絡協議棧內部優化,在 github 上的主線有總計 7 個優化特性。這些優化可以分為兩個維度。
第一個維度是多核擴展性的優化,也就是讓 kernel 網絡協議棧在多核平臺發揮多核的并行處理優勢。這個維度又可以分為兩個方向:一是,將網絡協議棧處理的關鍵數據結構做 CPU 核心間的隔離,使得每個核心有完全本地的訪問數據,從而消除了執行路徑上核心間的同步開銷。二是,使得任意的某個 TCP 連接的全部處理,都在一個核心上完成,這樣可以最大化的提高 CPU cache 利用率。
第二個維度是單核性能的提升,也就是不考慮多核同步的情況下,如何提升網絡協議棧在單個核心上的絕對性能。這個維度也可以分為兩個方向:一是, 將 kernel 中的通用服務為網絡I/O做專用定制,來提升網絡協議棧的性能。二是,做網絡協議棧的跨層優化,改變傳統協議棧 TCP/IP 協議棧的嚴格分層處理,將傳輸的關鍵信息垂直貫穿網絡協議棧,來做全局的優化。
InfoQ:Nginx 在 CPU 均衡上已很不錯了,factsocket 對于吞吐量的增加是如何實現的?后續是否考慮做成 nginx modules?針對 HAProxy 的實現與 Nginx 一樣嗎?有什么差異?
林曉峰:Fastsocket 是內核層面的優化,對用戶程序是透明的,并不需要開發 Nginx 模塊來支持。Fastsocket 對應用程序來說通用的,提升的是內核網絡協議棧的效率。
InfoQ:吞吐量的提升通用于4、7 層代理嗎?
林曉峰:Fastsocket 對于網絡性能的提升,適用于使用 socket API 來進行網絡I/O的應用程序,所以我們將它命名為 Fastsocket。如果 4 層代理是指 LVS,那是 Fastsocket 是不適用的,因為 LVS 功能是借助 kernel 里 Netfilter 框架實現的。
InfoQ:像 Fastsocket 這類以性能優化為主打的開源項目,品質保障、技術方案選擇、成本管控非常重要,你能介紹一下這方面的經驗嗎?
李曉棟:在做性能優化的過程中,很多時候我們往往會陷入到僅關注性能指標的誤區,而忽視了程序交付給運維人員后的部署成本、運維成本。比方說: 是否跟現有的上層軟件、運維手段兼容?有無自動化的部署腳本?應急回滾是否方便?是否提供了良好的統計和追蹤機制?等等等等。這些都需要在方案設計環節充 分考慮,否則很有可能出現“運維成本” 大于“性能提升所節省的硬件成本”,最終導致無法在生產環境中很好地使用起來。也就是說,我們需要在性能和可運維之間找到一個最佳平衡點。其實在 Fastsocket 之前我們還有一版內部代號為“Hydra”的預覽版,性能比現在的 Fastsocket 要更好,但需要修改 haproxy、nginx 等上層軟件的代碼,運維成本過高,因此被我們果斷放棄了。關于品質保障,我覺得最好的辦法就是,在設計測試用例時,要把生產環境中可能出現的各類正常、非 正常操作和情景盡量都考慮進去,最好能讓比較資深的運維人員參與到測試用例設計中。當然,測試過程中,細心必不可少,要能敏銳捕捉異常情況。
InfoQ:Fastsocket 開源之后立刻在 Github 上得到了上千個 star,看來很多人也有這方面的需求。目前主要得到的反饋有哪些?
林曉峰:Fastsocket 在 Github 上正式開源到現在剛兩周多,到寫稿時已經接近兩千 star,這是出乎我們意料的。
我們收到的反饋主要分為兩方面。一是,具體是如何實現的,對其性能的大幅性能的技術點很有興趣。二是,比較關注 Fastsocket 是否有移植到 3.X kernel 版本和合并到 kernel 主線的計劃。在 Haproxy 的 mailing list 上也看到關于 Fastsocket 的討論,很高興的看到 Haproxy 作者對我們項目也很感興趣,并表示可以考慮對 Fastsocket 進行直接支持。
InfoQ:有其他公司的人來參與支持這個嗎?未來以開源模式更新,對于項目的 commit、review 機制有什么計劃?
林曉峰:據我個人所知,已經幾家大型互聯網公司對 Fastsocket 有試用的興趣。目前項目的 commit 主要采用 Github 的 pull request 機制,由我來 review 代碼。未來希望可以吸納更多活躍的開發者作為 committer,用社區方式去維護 Fastsocket 項目。
InfoQ:Fastsocket 后續對新版本的內核、新版本的 CentOS 的支持,計劃用怎樣的方式去長期維持?
李曉棟:Fastsocket 對不同版本內核和 CentOS 發行版的持續支持,采用兩種方式:一是由新浪根據生產環境需要和操作系統使用策略,適時升級,這種方式相對比較穩健和持續,但更新周期相對要長一些。第二 種方式是依托社區的支持,目前已有熱心貢獻者愿意幫助我們將 fastsocket 移植到 CentOS7 下,在這里我們也表示深深感謝。
受訪者簡介
林曉峰,前新浪網高級系統開發工程師,關注網絡,關注高性能,關注 Linux 內核。
李曉棟,新浪網研發中心高級技術經理,有十年的互聯網工作經驗,是“新浪軟件負載均衡系統” 和“ 新浪操作系統管理與優化”方面的重要開拓者,也是 FastOS 計劃和管理理念的提出者。
<span id="shareA4" class="fl">
</span>