伍時揚,王功乾
(烽火通信科技股份有限公司, 武漢 430074)
隨著寬帶和流媒體技術的快速發展,網絡視頻點播和視頻直播等應用越來越普及。據工信部發布的信息,至2020年2月網絡電視(Internet Protocol Television, IPTV)總用戶數已達2.97億戶。伴隨著用戶規模的快速增長和視頻碼率的提升,流媒體服務節點的建設和運營成本非常可觀,迫切需要優化服務器配置,加大應用軟件適配力度,提升流媒體服務器的并發推流能力。
對于覆蓋地域較廣的流媒體系統,通常采用內容庫與區域或邊緣服務節點的多層架構[1]。內容庫提供全量媒體內容存儲及服務節點的回源服務,側重于存儲容量和數據安全性。邊緣服務節點緩存熱點內容,直接面向海量終端用戶提供流媒體服務。服務節點需盡量靠近用戶以提高響應速度,降低主干網絡流量,因而服務節點分布地域廣,節點數量眾多,其關鍵技術指標是并發推流能力。
基于X86通用服務器硬件的流媒體服務器,影響其性能的因素包括中央處理器(Central Processing Unit, CPU)、內存容量、硬盤輸入/輸出(Input/Output, I/O)性能和網卡帶寬等,除了升級硬件配置來提升性能外,分析性能瓶頸、優化軟件設計是提升性能的另一途徑。本文基于當前主流X86通用服務器對流媒體軟件進行性能測試,發現硬盤組的負載不均衡,整體負載率不高,并發推流能力受限于硬盤組的整體吞吐能力。目前業界采用的文件分級緩存、獨立磁盤冗余陣列(Raid)等技術可提升流媒體服務器存儲設備的訪問速度,但隨著用戶數量和視頻數量的增長,文件緩存的命中率會越來越低,在大并發流量下硬盤組仍然存在負載不均衡的問題。
Linux文件系統的默認I/O操作方式是緩存I/O,操作系統通過直接存儲器存取(Direct Memory Access, DMA)把硬盤中的數據讀取到文件系統的頁緩存中,然后再從內核空間的頁緩存把數據拷貝到應用程序用戶空間的數據存儲區。當應用程序讀取數據時,如果頁緩存已經存儲了這部分數據,則立即返回給應用程序,而不需要從硬盤中讀取,從而減少讀盤次數,提高硬盤I/O性能。由于流媒體文件體量較大,而且通常按順序播放,需要讀取的數據一般都不在頁緩存中,經頁緩存進行數據二次拷貝,反而增加了CPU和內存的開銷。流媒體應用程序有自己的數據緩存機制,放棄使用內核的頁緩存區,直接在應用程序的地址空間和硬盤之間傳輸數據,可以帶來更高的硬盤I/O性能。Linux的直接I/O和塊級訪問方式,正適合于讀取流媒體文件這種應用場景。
Linux支持同步和異步兩種I/O訪問機制。采用同步I/O方式時,應用進程發出數據傳輸請求之后,通過等待或者輪詢的方式,檢查I/O數據是否準備就緒。當數據準備就緒后,同步I/O需要應用進程進行內核態到用戶態的數據拷貝,應用進程在這個過程中會發生阻塞。采用異步I/O方式時,應用進程發出數據傳輸請求之后,進程不會被阻塞,也無需等待I/O操作完成,進程可以在數據傳輸時繼續執行其他任務,在這次I/O操作完成后,應用進程將會接收到事件通知。相對于同步I/O讀取文件的方式,異步I/O方式可以提高應用程序的效率。同步I/O通常與異步I/O結合使用。根據流媒體文件的讀取特性,流媒體應用程序采用同步I/O與異步I/O相結合的方式可以顯著提高流媒體文件的讀取效率。圖1所示為文件系統優化方案。

圖1 文件系統優化方案
流媒體數據在進行錄制、存儲、分發和定位播放時,通常以一段數據為單位進行組織,稱之為媒體分片,一個分片對應節目流某個時間段的全部數據。把媒體文件按一定的規則切分為分片,不同的分片存儲在不同的硬盤組中,再把每個分片按磁盤塊大小,分成多個存儲塊,依次存儲到硬盤組內各個硬盤中。在讀取媒體文件時,可以從多個硬盤組讀取不同的分片,單個分片可以從多個硬盤中并發讀取,從而突破了單個硬盤的I/O瓶頸,加快了媒體文件的讀取速度。當大量并發用戶觀看同一個視頻時,因不同用戶觀看的時間點有差異,請求讀取的分片不同,因而可以把讀取請求均衡分布到不同的硬盤中,從而提高存儲系統整體吞吐能力,避免單個或一批內容極熱導致硬盤過熱的問題。圖2所示為流媒體文件分片存儲的一種方法,包括以下步驟:

圖2 分片存儲
(1) 將流媒體文件按大致相同的播放時長切成分片,每個分片以關鍵幀開始,以便每個分片可以被獨立播放;
(2) 根據存儲空間使用率,為每個分片選擇合適的硬盤分組;
(3) 將媒體分片切成存儲塊,依次存儲到硬盤分組下的磁盤塊中,記錄硬盤號和磁盤塊號,生成分片存儲位置索引信息。
不同格式的媒體文件生成分片的方式不同。FMP4把媒體文件分割為許多可以單獨解碼的單元,每個單元以即時解碼刷新(Instantaneous Decoding Refresh,IDR)關鍵幀開始。在分片存儲時,以一定的時長來切分媒體分片,每個分片應包含完整的FMP4單元。而基于超文本傳輸協議(HyperText Transfer Protocol, HTTP)的流媒體網絡傳輸協議(HTTP Live Streaming,HLS)格式包含m3u8索引文件和許多傳輸流(Transport Stream,TS)小文件,由于每個TS小文件的時長很短(通常大約10 s),對于一部兩小時的電影,TS小文件的數量可以達到720個。如果把每個TS小文件都作為一個文件來存儲,會導致硬盤上的小文件過多,降低硬盤讀寫效率。將多個TS小文件合并為一個分片,并生成相應的索引信息,可以實現HLS格式流媒體的分片存儲。
流媒體服務器通常配置了小容量固態硬盤(Solid State Drive,SSD)和大容量硬盤驅動器(Hard Disk Drive,HDD),傳統的分級緩存策略[2]采用SSD作為緩存層,HDD作為后端存儲池,緩存層覆蓋在存儲池上,客戶端訪問數據時,先讀寫緩存層,如果數據只在存儲池中,則把數據先讀取到緩存層。但當媒體內容熱度極高,訪問同一內容的并發用戶非常多時,即使采用了分級緩存和分片存儲技術,硬盤的負載壓力仍然過大,無法滿足大流量并發的需求,而基于內容熱度的動態副本策略[3]可以解決這一難題。動態副本策略能使副本數量隨著內容訪問熱度的變化而動態調整,副本數不至于太多而浪費存儲空間,也不會太少而影響多用戶訪問的響應速度。
當用戶向服務節點請求媒體內容并觸發節點進行本地存儲時,創建首份內容主副本。首份主副本存儲在HDD硬盤分組中。根據集群內所有HDD分組的磁盤空間利用率和I/O負載率,選擇合適的HDD硬盤分組,把媒體內容從遠程內容庫拷貝至本地。首份主副本創建成功后,將根據動態副本創建策略復制其他副本。圖3所示為創建動態副本的一種方法,包括以下步驟:

圖3 動態副本創建
(1) 把HDD和SSD硬盤分別進行分組,形成若干個HDD硬盤分組和若干個SSD分組,每份內容副本存儲于不同的分組中。
(2) 定期采樣并計算內容的并發流量和該內容所有副本支持推流能力的比值,當超過創建新副本的閥值時,把該內容作為創建新副本的候選內容;當多個內容超過創建新副本的閥值時,優先對最高熱度內容進行復制。
(3) 根據集群內流媒體服務器的負載率、硬盤分組的I/O負載率和存儲負載率,選擇負載率較小的硬盤分組。在負載率相近的情況下,當本機只有HDD分組存儲了副本時,優先選擇本機的SSD分組來創建新的副本,無副本流媒體服務器的HDD分組作為次選。
(4) 創建新副本時,根據服務器CPU負載、硬盤分組的負載和網絡流量負載,限制內容拷貝的速率和并發數。
副本數目由于并發訪問量的減少而變得相對較多,隨著訪問量下降而動態刪除多余副本,可以提高存儲資源的利用率。定期采樣并計算內容訪問的并發流量和內容當前所有副本支持的推流能力的比值,當達到副本刪除閥值時,把該內容作為副本刪除的候選內容,在系統負荷較低時觸發副本刪除任務。
對視頻點播系統來說,流媒體文件被緩存到流媒體服務器之后便不再編輯修改,因而無需采取特別的措施,就可以保持多副本的一致性。
當用戶請求媒體文件時,如果有多份副本,則以服務器負載率和硬盤分組I/O負載率作為選擇依據,從負載率較低的硬盤分組讀取。在同等負載率下,優先選擇SSD分組。多副本選擇策略的目標是多副本所在的所有SSD和HDD分組I/O負載率基本均衡。
采用本文所述方法對優化前和優化后的流媒體軟件進行了性能對比測試,服務器配置為CPU: Xeon 4 114×2,雙倍速率同步動態隨機存儲器:12×16 GB,串行數據盤:24×6 TB HDD和12×960 GB SSD。在保證播放成功率>99.9%的情況下測試流媒體服務器支持的最大并發用戶數,測試模型覆蓋了用戶數量與視頻數量之比為N∶1、N∶N和N∶M 3種場景,測試結果如表1所示。在相同硬件配置的情況下,優化前的流媒體軟件單臺服務器最大支持15 Gbit/s推流能力,優化后的流媒體軟件單臺服務器最大支持32 Gbit/s,推流能力提升超過了1倍。

表1 流媒體服務器性能測試結果
同步I/O與異步I/O相結合提高文件讀取速度,分片存儲技術均衡硬盤群組的負載,基于內容熱度的動態副本技術支撐熱點內容大并發流量,綜合利用這些軟件技術可以大幅提升流媒體服務器的性能,從而降低網絡電視系統邊緣服務節點的建設和運營成本。