OIL + VCache如何改善Facebook视频延迟 并减少存储和计算开销?
OIL將存儲空間抽象化,并與分布式緩存系統VCache配合,降低了Facebook視頻延遲的同時,并減少了存儲與計算開銷。感謝趙化強、李東明完成本文技術審校。
文 / Roberto J Peon, Rishit Shroff
譯 / John
技術審校 / 趙化強、李東明
原文?:?https://code.fb.com/video-engineering/oil-vcache/
多年以來,開發者在編程時所秉持的基本思路是“open()ed”一個文件并“write()n”,隨后在本地文件系統“read()”。但在分布式系統中,這些操作涉及分布在不同網絡多個位置的主機上的多個進程。這些主機中的每一個 (或網絡本身 )都可能獨立且意外地出現宕機。存儲系統應該如何應對此類故障,防患于未然?我們創建了一種輸出輸入語言——OIL,其原理是對異構存儲系統中的文件進行統一的命名空間管理和抽象化。我們相信OIL代表了對通用存儲抽象化的新理解。OIL + VCache將這種抽象化過程與我們的分布式虛擬內存系統VCache相結合,可以顯著的提升效率和性能。
?
大型公司通常使用許多不同的存儲系統,并希望以此能夠輕松訪問和共享文件。但隨著時間的推移,企業需要定期將數據遷移到不同的存儲系統中。OIL使企業能夠“配置”異構存儲系統,而不用重新編碼,這大大減少數據遷移的成本。與此同時,OIL還擴展了POSIX API以更好地察覺不同分布式系統之間的細微差別。通過提供易于使用的抽象化過程捕獲這些所需的關鍵數據,OIL可以為編寫應用程序的開發者以及維護存儲系統的運維人員提供更多便利。
開發OIL
?
想象一下,你的一個應用正在寫入數據到三臺主機中,只有一臺主機寫入成功。那么I / O系統應該向用戶返回“成功”——還是應該等待三臺主機都“成功”、“失敗”或“超時”才返回?這個問題的正確答案取決于應用場景的特殊性及其所需權衡的指標。例如,與家人進行視頻會議時,其需要權衡的指標與執行在線購物交易有很大不同。特別是視頻會議應用程序可能會通過舍棄部分一致性和數據丟失以換取低抖動和低延遲,而購物應用程序則恰恰相反。
通過組合的方式,每個應用可以共享存儲系統,并且可以進行各自的優化。為實現此目的,會存儲并理解一張有向無環圖(DAG),此無環圖可以表示任意文件的I/O流程。開發人員可根據每個文件甚至每個I/O的不同屬性編寫不同的DAG,并隨著時間的推移與需求的變化更改這些屬性,繼而根據文件的使用情況(無論是經常訪問還是很少訪問數據)無需更改其名稱即可匹配存儲屬性。這樣使得OIL虛擬文件系統與文件能夠一起移動并使它們保持原有的名稱,而不是將文件從一個存儲系統移動到另一個存儲系統,繼而使其名稱出現變化。
?
除了通過DAG配置I/O外,OIL還對熟悉的read()API進行了優化。對于大多數系統,當所請求的數據超出當前文件結尾的字節時將產生越界錯誤。但是OIL的read()調用會阻塞,直到讀取到至少一個字節或發生超時 - 即使請求的字節超出最大寫入偏移量,也就是能夠讀取還未寫入的字節。(由于不再需要對新數據進行輪詢,因此其含義非常深刻。讀取文件中的一系列偏移量本質上等價于訂閱該范圍的偏移量。)通過去掉低效的輪詢方案,我們現在可以創建高效的通信系統。
?
雖然這種功能很強大,但經過一些實際的部署,我們意識到需要另一項調整。為了確保在已經寫入完成的文件上的I / O不會產生出乎意料的延遲,OIL允許文件成為永久保持不變狀態,這意味著文件的比特值永遠不會改變(盡管存儲的位置可能仍會改變)。它還確保OIL可以“read()”讀取超過文件結尾時,立即返回越界錯誤。
?
OIL+VCache
?
盡管OIL授權開發人員能夠跨異構存儲系統編寫I / O,但我們意識到我們需要的不僅僅是OIL抽象化。正如虛擬內存改進了現代操作系統一樣,分布式虛擬內存可以為分布式系統的I / O提供實質性的改進。
為了獲得這些性能優勢,我們創建了一個名為VCache的分布式虛擬內存系統。分布式內存的概念并不新鮮,但VCache與其他系統之間的差別在于集成了OIL。OIL訪問VCache,VCache通過OIL訪問其他存儲。由于緩存(通常是多層)是實現最佳優化的重要部分,因此使用VCache(或多層VCache)組合存儲可為開發者帶來可觀的益處。VCache存在于多個用戶定義的位置并在每個位置提供了在空間、速度和可靠性之間權衡的機會。VCache支持各種寫入模式,包括直寫(write-through)、繞寫(write-around)和不同類型的回寫(write-back)。這些模式允許應用程序開發人員有效地借助緩沖,有效調用那些依賴存儲于虛擬內存系統的數據。
?
OIL + VCache如何工作?
OIL的DAG由存儲模塊和競爭節點組成。存儲模塊(例如本地文件系統或高速緩存)表示DAG中的各個節點。每個節點可以具有其特定實現某向功能的獨立配置。除了向客戶端傳遞數據或從客戶端調用數據之外,DAG節點還可以向OIL框架傳遞其工作狀態為滿意(satisfied)或耗盡(exhausted)。除此之外,DAG節點可以將批量數據和地址空間變換附加到節點。轉換包含前向糾錯、壓縮、加密和數據分塊。節點之間的連線描述了傳輸數據時使用的屬性,例如要設置的服務質量級別或使用的協議。
?
競爭節點是內置虛擬節點,可以包含任意數量的子節點。它允許配置最大并發、num-until-satisfied、num-until-exhausted和交錯啟動延遲。此節點允許描述if-then-else-chain、for-loop或parallel-for-loop之中的任何組合的控制流。當num-until-satisfied子節點聲明“satisfied”狀態時,競爭節點本身對其父節點聲明“空閑”。當num-until-exhausted子句被執行并聲明“耗盡”狀態時,競爭節點本身會向其父級聲明“耗盡”。由于節點可以在聲明“耗盡”之前可選地聲明“空閑”,明確發出信號并通知應用可以繼續運行,以將用于特定I / O的所有工作完成的信令有效區分。
?
異步或委托寫入的一個棘手問題是緩存的故障域與執行寫入操作的主機的故障域不同。使用OIL + VCache,開發者可以擁有本地緩存,這些緩存與寫入主機具有相同的運行結果,同時還使用遠程主機實現長期持久性和負載共享。使用這樣的層次結構,開發者可以選擇減少IOPS和存儲系統開銷,并且仍然放棄相對較少的期望屬性,例如運行結果共享和對字節的最低延遲訪問。
?
但是,當要寫入的數據總和超過本地主機內存時,這種本地緩存將失敗。由于VCache使用OIL作為后備存儲,并且由于VCache可用于OIL,因此一個VCache實例可以使用另一個VCache實例作為其后備存儲。這意味著開發者可以擁有主機本地內存與遠程內存的所有優勢。將這些與競爭節點放在一起,開發者可以控制復制、quorum以及共享或分離存儲與處理的運行結果。下面是一些例子,體現了這種抽象化的力量:
?
交錯啟動允許應用程序在延遲時間和總系統工作時間之間進行權衡。
?
因為我們在討論文件系統,所以元數據也應當成為我們討論的話題之一。元數據通常由所有權、ACL、TTL等組成。OIL需要引用數據-DAG,用于描述如何、何時與何處進行I/O,因此通常也會在元數據中結束。元數據與分布式系統中的數據有許多相同的問題; 因此,“DAG抽象化可重用”是有一定意義的,這也是我們致力于實現的。
?
OIL允許定義兩種DAG - 一個用于元數據,一個用于數據。這些DAG的執行框架和結構是相同的。唯一真正的區別是元數據DAG中的模塊給出了一項key->原子值接口而非數據-DAG的key->字節流接口,并且元數據-DAG在數據-DAG之前執行。這種分離純粹是為了方便,因為開發者可以在單個DAG中表達這一點。通常使用元數據-DAG來描述互斥、鎖和其他序列化。描述如何以任意順序讀取和寫入任意字節是在data-DAG中完成的。這些DAG顯著不同之處在于數據DAG可以在文件的生命周期內發生變化,
?
自投入生產以來,OIL + VCache已為實時視頻流系統帶來了顯著的功能增強,并提高了可靠性,不僅降低了視頻傳輸的延遲,還有效降低了存儲和其他需求的計算開銷。OIL在多個存儲系統中的靈活性為開發人員提供了更豐富的可組合性選項,允許他們添加不超出硬件算力的功能。我們希望OIL + VCache能夠激發整個行業的抽象化與API的進一步創新。
?
我們要感謝所有參與OIL + VCache項目的人。
LiveVideoStack? 招募
LiveVideoStack正在招募編輯/記者/運營,與全球頂尖多媒體技術專家和LiveVideoStack年輕的伙伴一起,推動多媒體技術生態發展。同時,也歡迎你利用業余時間、遠程參與內容生產。了解崗位信息請在BOSS直聘上搜索“LiveVideoStack”,或通過微信“Tony_Bao_”與主編包研交流。
LiveVideoStackCon 2019北京 音視頻技術大會 初版日程現已上線,掃描圖中二維碼或點擊【閱讀原文】了解大會最新日程。
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的OIL + VCache如何改善Facebook视频延迟 并减少存储和计算开销?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【大会】嵌入式玩直播,IoT做前处理
- 下一篇: 【大会】QoE也能驱动业务创新