分佈式技術的發展,深入地改變了咱們編程的模式和思考軟件的模式。值 2019 歲末,PingCAP 聯合 InfoQ 共同策劃出品「分佈式系統前沿技術 」專題, 邀請衆多技術團隊共同參與,一塊兒探索這個古老領域的新生機。本文出自我司 CTO 黃東旭,爲「分佈式系統 in 2010s」 系列第三篇。
上篇咱們聊了軟件構建方式和演化,今天咱們來聊聊硬件吧!node
若是說雲的出現是一種商業模式的變化的話,驅動這個商業革命的推手就是最近十年硬件的快速更新。比起 CPU,存儲和網絡設備的進化速度更加迅速。最近五年,SSD 的價格 (包括 PCIe 接口) 的成本持續降低,批量採購的話已經幾乎達到和 HDD 接近的價格。數據庫
<center>近 5 年 SSD 成本曲線</center>編程
SSD 的普及,對於存儲軟件廠商的影響是深遠的。網絡
其一,是極大地緩解了 IO 瓶頸。對於數據庫廠商來講,能夠將更多的精力花在其餘事情,而不是優化存儲引擎上。最近兩年發生了一些更大的變化,NVMe 正在成爲主流,咱們很早就在 Intel Optane 進行實驗和投資,相似這樣的非易失內存的技術,正在模糊內存和存儲的界限,可是同時對開發者帶來挑戰也是存在的。舉一個簡單的例子,對於 Optane 這類的非易失內存,若是你但願可以徹底利用它的性能優點,最好使用相似 PMDK 這類基於 Page cache Bypass 的 SDK 針對你的程序進行開發,這類 SDK 的核心思想是將 NVM 設備真正地當作內存使用。若是僅僅將 Optane 掛載成本地磁盤使用,其實很大程度上的瓶頸不必定出如今硬件自己的 IO 上。數據結構
下面這張圖頗有意思,來自 Intel 對於 Optane 的測試,咱們能夠看見在中間那一列,Storage with Optane SSD,隨機讀取的硬件延遲已經接近操做系統和文件系統帶來的延遲,甚至 Linux VFS 自己會變成 CPU 瓶頸。其實背後的緣由也很簡單,過去因爲 VFS 自己在 CPU 上的開銷(好比鎖)相比過去的 IO 來講過小了,可是如今這些新硬件自己的 IO 延遲已經低到讓文件系統自己開銷的比例不容忽視了。多線程
<center>Intel 對於 Optane 的測試</center>架構
其二,這個變化影響了操做系統和文件系統自己。例如針對 Persistent Memory 設計新的文件系統,其中來自 UCSD 的 NVSL 實驗室 (名字很厲害, Non-Volatile Systems Laboratory) 的 NovaFS 就是一個很好的例子。簡單來講是大量使用了無鎖數據結構,減低 CPU 開銷,NovaFS 的代碼量很小很好讀,有興趣能夠看看。另外 Intel 對 Persistent Memory 編程模型有很好的一篇文章,感興趣的話能夠從這裏開始瞭解這些新變化。socket
說完了存儲設備,咱們聊聊網絡設備。我還記得我第一份工做的數據中內心甚至還有百兆的網卡,但如今,1GbE 已經都快淘汰光了,主流的數據中心基本上開始提供 10GbE 甚至 25GbE 的網絡。爲何會變成這樣?咱們作一個簡單的算術題就知道了。根據 Cisco 的文檔介紹, 一塊千兆網卡的吞吐大概是: [1,000,000,000 b/s / (84 B * 8 b/B)] == 1,488,096 f/s (maximum rate)。分佈式
那麼萬兆網卡的吞吐大概是它的十倍,也就是差很少每秒 1488 萬幀,處理一個包的時間在百納秒的級別,基本至關於一個 L2 Cache Miss 的時間。因此如何減少內核協議棧處理帶來的內核-用戶態頻繁內存拷貝的開銷,成爲一個很重要的課題,這就是爲何如今不少高性能網絡程序開始基於 DPDK 進行開發。性能
對於不瞭解 DPDK 的朋友,在這裏簡單科普一下:
<center>DPDK Flow Bifurcation</center>
從上圖能夠看到,數據包直接從網卡到了 DPDK,繞過了操做系統的內核驅動、協議棧和 Socket Library。DPDK 內部維護了一個叫作 UIO Framework 的用戶態驅動 (PMD),經過 ring queue 等技術實現內核到用戶態的 zero-copy 數據交換,避免了 Syscall 和內核切換帶來的 cache miss,並且在多核架構上經過多線程和綁核,極大提高了報文處理效率。若是你肯定你的網絡程序瓶頸在包處理效率上,不妨關注一下 DPDK。
另外 RDMA 對將來體系結構的影響也會很大,它會讓一個分佈式集羣向一個超級 NUMA 的架構演進(它的通訊延時/帶寬已經跟如今 NUMA 架構中鏈接不一樣 socket node 的 QPI 的延時/帶寬在一個量級),可是目前受限於成本和開發模型的變化,可能還須要等很長一段時間才能普及。
其實不論是 DPDK,SPDK,PMDK ,背後的主線都是 Bypass kernel,Linux 內核自己帶來的開銷已經很難適應現代硬件的發展,可是生態和兼容性依然是大的挑戰,我對於一言不合就搞個 Bypass Kernel SDK 的作法實際上是不太贊同的。大量的基礎軟件須要適配,甚至整個開發模型都要變化。
我認爲有關內核的問題,內核社區從長期來看必定會解決。一個值得關注的技術是 Linux 5.1 內核中引入的 io_uring 系列的新系統調用,io_uring 的原理簡單來講就是經過兩個內核/用戶態共享的 ring buffer 來實現 IO 事件的提交以及收割,避免了 syscall 及內核<->用戶態的內存拷貝,同時提供了 poll 的模式, 不用等待硬件中斷,而是不斷輪詢硬件,這極大下降了 IO 延遲,提高了總體吞吐。 我認爲 io_uring 的出現也表明了內核社區在各類 Bypass Kernel 技術涌現的當下,正在奮起直追。
本文是「分佈式系統前沿技術」專題文章,目前該專題在持續更新中,歡迎你們保持關注。