1 引言
隨著網絡技術的發展,主干網與寬帶網接入技術的日臻成熟,網絡視頻的傳輸成為 Internet應用的一個亮點。為了提高視頻數據在網上的傳輸效率,并實現視頻的實時播放,流媒體技術的研究與應用得到了很大發展。其中,流媒體服務器技術在流媒體的應用中發揮了關鍵的作用。
傳統的網絡傳輸數據的方法是文件下載:用戶需要準備大量的磁盤空間,并花大量的時間等待下載結束。但是,當數據變成海量的視頻數據時,在數據處理量大,數據吞吐量高,視頻播放實時性,客戶連接請求數目大,連接時間長等一些情況下,傳統的服務器技術已經無法高效的滿足要求。面對這樣的技術要求,本文從 CPU調度,資源控制內存分配,I/O總線管理這三個方面出發,綜合的給出了一種高效的服務器設計方法,從而有效的提高了視頻流式傳輸時的效率。該方法也具有很強的可擴展性,當服務器的CPU數目增加時,服務器的性能將能得到成倍的增長。
2 流媒體服務器的設計
2.1 流媒體服務器的功能
流媒體在播放前不是完全下載整個文件,而是把開始部分內容存入內存,數據流是隨時傳送隨時播放。
流媒體服務器提供的流式傳輸方式有兩種:順序流式傳輸和實時流式傳輸兩種方式。順序流式傳輸是順序下載,在下載文件的同時用戶可觀看在線媒體。實時流式傳輸與順序流式傳輸不同,實時流式傳輸總是實時傳送,特別適合現場事件。實時流式傳輸必須匹配連接帶寬,這意味著圖像質量會因網絡速度降低而變差。
在流式傳輸時,流媒體數據具有實時性,等時性等基本特點,流服務期和客戶終端要保證各種媒體間的同步關系,因此,流媒體傳輸對“最大延時”,“延時抖動”等QoS參數都有嚴格要求。
2.2 流媒體服務器協議棧的設計
在TCP/IP參考模型中,傳輸層通信協議TCP和UDP都不能滿足流媒體傳輸的QoS要求。由于TCP協議采用滑動窗口控制機制,數據傳送隨著流控窗口動態的啟動和關閉,難以滿足流媒體實時和等時的傳送要求。UDP協議的無連接特點能夠提高傳輸速率,雖然可以在某種程度上滿足流媒體的實時性要求,但是由于其本身的不可靠性,也無法滿足流媒體傳輸的需要。
針對傳輸層協議的矛盾,為了實現流媒體在IP上的實時傳送播放,設計流媒體服務器時需要在傳輸層協議(TCP/UDP)和應用層之間增加一個通信控制層。在增加的通信控制層,采用相應的實時傳輸協議,主要有:數據流部分的實時傳輸協議RTP(Real-time Transport Protocol),用于控制部分的實時傳輸控制協議RTCP(Real-time Transport圖1 流媒體服務協議棧Streaming Protocol)。RTP協議主要是用來傳送實時的流媒體信息,數據報主要包括多媒體數據,以及所攜帶負載的時間戳,順序號等。RTCP協議的數據報主要包括了接收者收到某個多媒體流的服務質量信息,用于對服務器端的反饋。
流媒體服務器的協議棧如圖1所示。

當服務器收到RTSP請求,它首先產生RTSP請求對象。服務器通過RTSP協議的應答信息將請求的內容以流會話(streaming session)的形式描述,內容包括數據流包含多少個流、媒體類型、和編解碼格式。一個流會話由一個或多個數據流組成,如視頻流和音頻流等。實際的數據流通過RTP協議傳遞到客戶端。RTP在一對一或一對多的傳輸情況下工作,其目的是提供時間信息和實現流同步。RTP本身并不能為順序傳送數據包提供可靠的傳送機制,它依靠RTCP一起提供流量控制和擁塞控制服務。在RTP會話期間,各連接者監視下層網絡的性能,并將相關信息放入RTCP包,周期性地傳送 RTCP包來通知發送方。發送方也可以用RTCP包提供每次的會話信息,包中含有已發送的數據包的數量、丟失的數據包的數量等統計資料。因此服務器可以利用這些信息動態地改變傳輸速率,甚至改變有效載荷類型。RTP和RTCP配合使用,因有效的反饋和最小的開銷使傳輸效率最佳化。
流媒體服務器的功能框圖如圖2所示。

2.3 高效流媒體服務器的設計
通過流媒體服務器的協議棧的設計,可以明確流媒體服務器是在傳輸層協議(TCP,UDP)上解釋RTP,RTCP,RTSP協議的,所有的客戶連接請求都是以TCP的端口獲得的,流媒體數據也都是打成RTP包,通過UDP端口發出去的,因此,對于TCP,UDP端口事件的調度以及如何把大量的流媒體數據從磁盤空間傳遞到網絡上成為制約流媒體服務器性能的主要因素。
流媒體服務器面對一個單一的客戶,完成的過程如下:
1)在客戶端發出RTSP連接請求后,服務器通過對TCP端口的監聽,讀入請求。
2)解析請求內容,調入相應的流媒體文件。
3)形成RTP包,分發數據流包,獲得RTCP包。
4)數據包發送完畢,關閉連接。
上述過程如果采用傳統的服務器設計方法實現,一般的辦法是用一個線程不斷的讀入用戶的連接請求,然后將這些請求分派給其它的工作線程,這些工作線程則分別循環往復的完成以下的工作:
1)解析請求內容。
2)發送RTP包,發送接收RTCP包
3)判斷數據發送完畢,關閉連接。服務器的結構如圖3所示。

操作系統在對流媒體服務器的功能實現上采用以應用進程(線程)為中心的系統資源管理方式。操作系統采用虛擬內存方式,應用程序的虛擬內存空間映射到物理內存,物理內存與CPU之間有Cache。當流媒體數據從磁盤上到網絡上進行傳遞時,要在不同的系統空間中進行多次傳遞拷貝,如圖4所示。

圖4顯示了磁盤數據到網絡接口的傳遞路徑:首先,數據對象從磁盤拷貝到內存中,然后,數據在內存中由于每個工作線程的空間不同,進行空間拷貝,即從核心空間拷貝到進程空間,接著,數據再從進程空間拷貝到核心空間,最后數據再拷貝到網絡上。由于流媒體數據要經過RTP的打包處理,因此,數據在拷貝到網絡上之前,還要拷貝到Cache,再從Cache中拷貝到CPU寄存器,進行打包處理。
從圖3可以看出,隨著工作線程數n的增大,系統在各線程之間的切換開銷將急劇增加,從操作系統的角度來看,由于每個線程都涉及對硬盤視頻數據的讀取,各自獨立的線程越多,對硬盤讀寫的數據量就越大,數據在不同空間的拷貝增加,操作系統將不斷的進行頁面切換,服務器的性能隨著客戶連接數的增多,效率將急劇下降。
為了改善上述設計的缺點,需重新設計服務器的服務程序結構。根據服務器在流媒體傳輸中所要完成的功能,可以看出,<服務器在客戶有連接請求時,解析連接請求和關閉連接請求是很短的過程服務器的大部分時間都用于給每個客戶發送RTP數據流包。發送RTP數據流包包括服務器把相應的媒體文件調入內存,打包發送,以及獲得RTCP包的反饋。因此,可以設計一個單獨的處理線程,專門用于給客戶發送RTP的數據流包。
改進的流媒體服務器設計如圖5所示,完成主要的功能通過兩個線程來實現。
事件線程負責檢測客戶連接,以及客戶發的RTCP包的到來。事件線程通過對TCP端口的檢測,在有連接請求時建立可維護客戶信息的RTSP會話,在每一個客戶的RTSP會話的存活期內,事件線程不斷的把向客戶發送RTP包這一任務放入處理線程的隊列,直到RTSP會話終止,事件線程再把關閉連接的任務放入隊列。
事件線程把對不同客戶的服務(發送RTP數據包)以任務的形式放入隊列后,處理線程對對列中的任務依次進行處理,也就是說,處理線程根據客戶的不同,不斷的把相應的流媒體文件形成RTP包,依次發出,直到視頻服務的終止。
可以看的出來,處理線程雖然對所有的客戶提供服務,但是執行的任務始終是發送RTP數據流包,同時,該線程所訪問的媒體文件被調入內存后,可以被同一線程的其它任務重復調用,這樣的設計,不但減少了隨著客戶數增加而造成的系統頻繁切換的資源損失,也減少了訪問硬盤數據的次數,縮短了訪問時間,也發揮了指令局部性效率提高的優點。設圖5 改進后的處理流程計中,解析客戶的連接請求也放入處理線程的隊列中,在處理線程中進行處理,雖然解析連接的任務不同于大部分發送RTP包的任務,但是該任務消耗時間少,所以對對系統性能的影響并不大。

采用圖5的設計方法,服務器還可以根據客戶端反饋的RTCP包得知客戶端的網絡狀況,采取一定的策略針對不同的客戶網絡質量進行RTP包發送任務的調度,對于帶寬質量好的客戶,事件線程可以多放一些RTP包到隊列中;對于由于網絡質量造成的即將超時的客戶連接,服務器也可以通過任務調度的方式進行特殊處理,最大限度的提供不同質量的客戶連接服務。
上述的設計是在硬件具有一個CPU的情況下,當系統硬件具有的CPU個數為n時(n>1,事實上做為流媒體服務器的硬件需求,一個CPU是遠遠不能滿足系統需求的),程序將采用n個處理線程來分擔事件線程調度的任務,利用系統的可擴展性來提高性能。
2.4 性能分析
新設計的方案充分發揮了指令局部性和數據局部性的優點。處理線程在處理隊列任務時,由于隊列中每一個操作所作的事都一樣(如不停的發RTP 包),因此每個操作的指令序列都是完全相同的;而且,當客戶在連接后要求獲得熱點節目的媒體文件時,指令操作的數據也將非常相近,都在一個范圍很小的區域內。這樣,經過幾次操作后,當指令被加載到Cache中,數據加載到內存中后,就不再需要從磁盤中去調,極大提高了程序的性能。
新設計的方案可以實現流媒體數據在內存中連續存放,快速存取以及Cache預取,資源管理方式從以應用線程為中心的資源管理與分配轉變為以數據為中心的資源管理與分配。
衡量流媒體服務器的性能可以根據服務CPU的負載情況來衡量。CPU的使用情況主要和連接的客戶數目,客戶端的操作如讀取,快進,搜索等相關。對于一個22kbps的文件集,改進的服務器設計方案與傳統的服務器設計方案的性能優劣比較曲線,如圖6所示。
圖6體現了隨著CPU數的增加,傳統設計方案的性能變化不大,改進的設計方案在多個CPU的系統里,充分利用了CPU所帶的Cache的強大功能,CPU的總體負載明顯下降,可以獲得性能的極大提高。

3 結束語
本文從系統可擴展方面提出了實現高效的流媒體服務器的解決方案。除了系統可擴展方面,設計一個完善的高效流媒體服務器,還需要在實時的服務器操作系統,系統資源管理(CPU管理,內存管理,磁盤資源管理),文件管理,服務器磁盤調度方面進行高效的設計,這需要我們進一步研究和設計。