2016年雙十一期間,阿里的交易額再次刷新歷史記錄,其中支付寶的支付峰值達到12萬筆 / 秒。拋開業務數字,阿里在技術上也是做足了功課,除了使用RocketMQ消息中間件承受萬億級消息容量之外,還啟用了上千個高I/O型的本地盤存儲實例。
阿里云告訴InfoQ這一舉動使得數據庫的性能提升近100%、平均響應時間節省了80%。那么讓阿里云取得如此效果背后的技術利器是什么呢?為此,InfoQ采訪了三位相關負責人。
阿里云在塊存儲的基礎上,以半虛擬化磁盤接口virtio-blk研發出了高IOPS并發、低IO延遲的本地盤存儲實例。
隨著硬件技術的發展,硬件自身性能越來越高,存儲軟件的瓶頸也就越發明顯。為了解決I/O性能上的痛點,阿里云開始基于NVMe 協議和英特爾開源項目SPDK研發高IO存儲實例。
NVMe SSD與傳統SATA SSD的區別
NVMe的全稱是Non-Volatile Memory express,顧名思義是為閃存類存儲介質全新設計的協議接口,最早由英特爾于2007年發起,當前已成為基于PCI-E SSD閃存所采用的主流接口協議。而SATA SSD所使用的AHCI(Advance Host Controller Interface)協議,是在80年代后期基于IDE/ATA所發展起來的,面向傳統機械硬盤所設計的存儲接口協議。隨著SSD本身性能的不斷增強,面向機械硬盤設計的AHCI協議已經明顯成為制約SSD硬盤讀寫性能進一步提升的最大短板,而NVMe協議則成為了替代AHCI的完美選擇。相比于AHCI,NVMe的優勢主要體現在以下方面:
低延遲:
AHCI的每個命令都需要讀取4個不同的寄存器,而NVMe無需讀取寄存器就可以發出命令,延遲降低至AHCI的25%;
多隊列和更高的隊列深度:
支持多隊列讓CPU的性能得到更好的釋放,單核再也不是IOPS的瓶頸了。隊列深度更是從32提升到驚人的64K,能夠充分壓榨出SSD的IOPS性能。
SPDK:英特爾針對高性能存儲應用開發的開源項目NVMe接口標準的固態盤通常為SATA SSD性能的5-8倍,但由于Linux內核驅動實現與調度機制的限制,傳統的軟件定義存儲系統并不能完全釋放其性能。為了幫助軟件定義存儲開發商充分發揮NVMe接口SSD的超高性能,英特爾開發了SPDK(Storage Performance Development Kit),包含一套驅動程序,以及一整套端到端的存儲參考架構。SPDK的目標是能夠把硬件平臺的計算、網絡、存儲的最新性能進展充分發揮出來,其框架如下:
技術創新點
借助SPDK實現了用戶態高性能存儲架構,有效降低了虛擬機存儲的IO棧深度
通過優化NVMe硬件中斷的處理,減小因為NVMe硬件中斷處理帶來的額外IO延遲開銷
通過優化虛擬機驅動程序,降低虛擬機訪問NVMe硬件過程中的通信開銷
研發中都攻克了哪些難關?從項目初始立項到正式上線經歷1年2個月,主要使用C語言來開發。研發過程中主要的障礙是使用NVMe以及SPDK等新的存儲技術帶來的問題:
1 新協議的使用:
因為使用了SPDK,此前通過操作系統來管理的磁盤就需要應用程序自己來進行管理,因此不僅需要開發相關的功能,對阿里云整體的運維、管控都提出了新的要求和挑戰。
2 軟硬件性能同時提升:
具體而言,當NVMe設備處理單個IO請求的延遲降低到幾十微秒(us)后,硬件設備的中斷處理開銷以及虛擬機中斷的處理就成為了瓶頸。為了降低中斷處理的開銷,阿里云通過使用輪詢方式來消除NVMe硬件中斷的處理開銷,在使用輪詢方式后虛擬機發送IO請求時與物理主機通信的開銷也可以進一步降低。
項目的初心與愿景
該項目起源于拜訪客戶時,阿里云了解到部分行業客戶對于高IOPS并發和穩定低IO延遲有著較高的需求。出于提高單個服務器存儲IO性能的初心,阿里云啟動了本項目的研發。
項目的研發主要經歷了兩個大的版本,即集團內部數據庫的使用(文中開篇提到的雙十一)和本周五正式宣布的公有云對外售賣版本。據悉,目前對外售賣的版本,除采用NVMe SSD磁盤+SPDK存儲性能優化架構,還使用了基于Intel Xeon E5-2682 v4 (Broadwell) 處理器,主頻為2.5GHz,DDR4內存以及獨享型計算架構。
阿里云項目負責人強調:該高IO型本地盤存儲實例的目標客戶是具備較強開發和運維能力的企業客戶,自身的系統架構可以保證業務數據的一致性,并能克服單副本數據丟失對業務造成的影響。具體應用場景主要是對存儲IO性能要求較高,讀寫延時較為敏感,且業務自身具備高可用架構的場景,比如NoSQL、OLTP、分布式日志等,適合網絡游戲、互聯網電商、在線直播/娛樂類提供在線業務的行業用戶。
以下是推薦的使用場景:
(1) 用戶將Hadoop/Cassandra/MongoDB等NoSQL業務部署在高IO型本地盤存儲實例上,由于這些應用自身已經提供了數據冗余功能,本地盤單盤故障后用戶的數據并不會受到影響,同時用戶可以享受到更高的IO性能;
(2) 用戶在高IO型本地盤存儲實例上自建MySQL數據庫,建議采用高可用架構(主庫+從庫同步復制),為了保證用戶數據庫數據的安全,建議用戶通過mysql_dump等備份工具,在業務低峰期定時對MySQL上的數據進行備份,將數據備份到云盤上,并通過云盤快照等技術進行定期備份。
或將MySQL的redolog和binlog等日志文件放在本地盤中,將數據文件放在SSD云盤中,NVMe SSD的低延時性能可以大幅提升MySQL的性能,借助binlog等主從同步方式保證數據安全,同時滿足性能和可靠性兩方面的需求;
(3) 有大量并發訪問需求的用戶網站可以將memcached部署到高IO型本地盤存儲實例上,通過高IO型實例提供的高IOPS性能,為網站的靜態數據提供更高速的緩存;
(4) 用戶使用bcache/flashcache等工具使用高IO本地盤和云盤構建混合存儲,通過高速本地磁盤作為緩存對云盤進行加速。
項目的下一步工作將重點集中在繼續提高單實例的IOPS性能。
當前的高IO型本地盤存儲實例單實例規格為2塊1.45TB的高性能本地固態盤,后期將考慮提供更多的存儲容量,以及更高IOPS并發能力,來滿足更高的需求。
作者介紹
馬濤,花名伯瑜,阿里云系統和塊存儲負責人,國內知名Linux內核研發人員,在內核主線有超過300個提交,在文件系統等存儲領域為內核主線做出了卓越的貢獻,目前帶領團隊負責阿里巴巴Linux內核以及塊存儲相關的研發工作。
劉崢,花名文卿,阿里云系統和塊存儲技術專家,高IO型本地盤存儲實例底層研發負責人,專注于Linux內核及存儲領域的研發和性能優化等工作。
彭亞雄,花名崆聞,阿里云彈性計算產品專家,高IO型本地盤存儲實例產品負責人,專注于塊存儲領域的產品工作。