摘要: 本文對目前即時通信服務器現狀作了分析,並介紹了能知足大容量高併發性的網絡負載均衡技術。總結了服務器端的windows完成端、epoll模型、線程池和p2p等相關技術,並進一步提出了展望。
關鍵詞: 大容量;併發性;負載均衡;服務器構架
中圖分類號:TP368.5 文獻標識碼:A 文章編號:1006-4311(2014)01-0192-02
0 引言
Internet的快速增加使多媒體網絡服務器面對的訪問數量快速增長,要求服務器具有提供高併發鏈接數的能力,這對網絡服務提供商提出了巨大的挑戰[1]。併發鏈接數是指代理服務器對其業務信息流的處理能力,是代理服務器可以同時處理的點對點鏈接的最大數目,它反映出代理服務器設備對多個鏈接的訪問控制能力和鏈接狀態跟蹤能力。單臺服務器的性能有限,這是由服務器自己的處理能力和I/O能力決定的,必須採用多服務器和負載均衡技術才能知足大量併發訪問的須要。
對於整個即時通信(IM)服務器端體系,以及遊戲服務器端的體系,通常都採用登錄服務器集羣和應用服務器集羣來分別處理登陸和應用服務。組建分佈式服務器羣能夠有效地均衡負載。負載均衡是解決高負荷訪問和大容量併發請求廣泛採用的解決辦法。它能讓多臺服務器或多條鏈路共同承擔一些繁重的計算或I/O任務,從而以較低成本消除網絡瓶頸,提升網絡的靈活性和可靠性。網絡負載均衡自動檢測到服務器不可用時,可以迅速在剩餘的服務器中從新指派客戶機通信,此保護措施可以幫助爲關鍵業務程序提供不中斷的服務。同時,能夠根據網絡訪問量的增多,來增長網絡負載均衡服務器的數量。[2]
在面對大量用戶訪問、高併發請求方面,解決方案主要集中在如下幾點:良好的服務器組架構,高效率的服務器端程序、高性能的數據庫、高效率的編程語言、還有高性能的Web容器。其中,服務器組架構和高效率的服務器端程序顯得尤其重要。
1 大容量併發性服務器組的架構
良好的服務器組架構可以更好的進行負載均衡工做。如圖1所示。
服務器組架構的考慮因素包括:
1.1 穩定性 穩定提供服務,是服務器系統確保用戶體驗的最基本要求。穩定性主要與應用服務器的軟件質量相關。
1.2 效率 服務器組的運行時效率主要體如今服務器系統的承載能力上。
1.3 可縮放性 可縮放性能夠理解爲:增長服務器硬件是否能夠相應的提升系統的負載能力或者是否能提升用戶體驗。承載能力和用戶體驗都是系統表現的一部分。從遊戲開發及運營的角度來考慮,因素還包括:
1.4 生產力、開發效率 服務器的架構設計不止要考慮系統運行時的效率,也要考慮開發時的工做效率。例如:不一樣的系統服務或應用服務器之間是否會過分耦合等。
1.5 簡單 簡單性要體如今服務器組的部署和維護方面。若是一個遊戲服務器組有20臺硬件,那麼備份數據、更新、重啓這種簡單的事情都會再也不簡單。通常遊戲服務商每週都只作兩小時停機維護,20組服務器的話,都會消耗大量的人力、物力。
1.6 可擴展性 實際上考慮到網絡遊戲服務的持續性,可擴展性也很重要,通常的作法就是週期性的持續提供遊戲更新。可擴展性在架構設計階段就應該考慮到。
2 實現大容量併發性的服務器端程序採用的技術
在IM方面,實現大容量併發性的服務器端程序,總結起來主要有如下技術:提升系統內核I/O性能,線程池和P2P。
2.1 提升系統內核I/O性能 開發網絡程序通常須要建立socket,發起鏈接,接受鏈接,發送和接受數據。讓程序能夠適應從單單一個鏈接到幾千個鏈接乃至於上萬個鏈接是真正的難點。儘可能提升單臺服務器I/O性能是首先須要考慮的,利用Windows平臺完成端口進行重疊I/O的技術和Linux的內核中引入的EPOll技術,是目前提升系統內核I/O性能的很好方法。
2.1.1 WINDOWS完成端口編程[3] 重疊I/O是指當調用了某個函數(好比ReadFile)就馬上返回作本身的其餘動做的時候,同時系統也在對I/0設備進行操做,在這段時間內程序和系統的內部動做是重疊的,所以有更好的性能。因此,重疊I/O是用於異步方式下使用I/O設備的。
Win32重疊I/O機制容許發起一個操做,在操做完成以後接受到信息。對於耗費時間比較長的操做來講,重疊IO機制可使發起重疊操做的線程在重疊請求發出後就釋放掉。咱們能夠把完成端口當作系統維護的一個隊列,操做系統把重疊IO操做完成的事件通知放到該隊列裏,因爲是暴露 「操做完成」的事件通知,因此命名爲「完成端口」(Completion Ports)。一個socket被建立後,能夠在任什麼時候刻和一個完成端口聯繫起來。windows的完成端口機制在操做系統內部已經做了優化,提供了更高的效率。
2.1.2 Linux的EPoll模型 Epoll I/O多路複用技術是Linux 2.6內核中提升網絡I/O性能的新方法,多使用在TCP網絡服務器中。Epoll是爲處理大批量句柄而做了改進的poll。Epoll是一種高效的管理socket的模型,相比於select,epoll最大的好處在於首先它不會隨着監聽fd數目的增加而下降效率。由於在內核中的select實現中,它是採用輪詢來處理的,輪詢的fd數目越多耗時越多。Epoll所支持的fd上限是最大能夠打開文件的數目,這個數字通常遠大於2048;其次,IO效率不隨fd數目增長而線性降低,在內核實現中epoll是根據每一個fd的callback函數實現的,只有「活躍」的socket纔會主動的去調用callback函數,其餘idle狀態socket則不會,在這點上,epoll實現了一個「僞」AIO,由於這時候推進力在os內核。
2.2 線程池thread-pool 傳統多線程方案中服務器端模型是接受到請求,即建立一個新的線程執行任務,完畢後退出,這就是「即時建立,即時銷燬」的策略。若是提交給線程的任務是執行時間較短,並且執行次數極其頻繁,那麼服務器處於不停的建立線程,銷燬線程的狀態。線程池採用預建立的技術,在應用程序啓動以後,把當即建立必定數量的線程(N1),放入空閒隊列中。這些線程都是處於阻塞(Suspended)狀態,不消耗CPU,但佔用較小的內存空間。當任務到來後,緩衝池選擇一個空閒線程,把任務傳入此線程中運行。當N1個線程都在處理任務後,緩衝池自動建立必定數量的新線程,用於處理更多的任務。在任務執行完畢後線程也不退出,而是繼續保持在池中等待下一次的任務。當系統比較空閒時,大部分線程都一直處於暫停狀態,線程池自動銷燬一部分線程,回收系統資源。基於這種預建立技術,線程池把線程建立和銷燬自己所帶來的開銷分攤到了各個具體的任務上,執行次數越多,每一個任務所分擔到的線程自己開銷則越小。可是線程之間同步所帶來的開銷還須要考慮。 2.3 P2P P2P是點對點傳輸,P2P與傳統的少數服務器服務多個用戶的C/S服務模式不一樣,大部分的服務靠用戶間互相提供服務完成。[4]
P2P技術屬於覆蓋層網絡(Overlay Network)的範疇,是相對於客戶機/服務器(C/S)模式來講的一種網絡信息交換方式。因爲可以極大緩解傳統架構中服務器端的壓力過大、單一失效點等問題,又能充分利用終端的豐富資源,因此P2P技術被普遍應用於計算機網絡的各個應用領域。P2P的基本原理是容易實現的,人們的研究方向也由基礎架構的構建和維護及優化算法等桎梏中擺脫出來,開始深刻到P2P技術的根本性問題中去。最新的研究成果代表,很多研究人員已經開始將重心轉入到覆蓋層網絡的節點延時彙集研究、覆蓋網之間(Inter-Overlay)優化研究、P2P支撐平臺研究以及P2P安全方面的研究等方面。
3 展望
隨着3G時代的到來,咱們也對網絡的大容量併發性控制提出了更高的要求,在現有的技術開發基礎上,能夠採用多核CPU來提升服務器性能、優化內核以增大系統最大網絡併發鏈接數等。在服務器組構架設計方面能夠根據用戶的使用習慣,細分分區,減小單個數據庫的壓力,使服務器對於分區的變化可以給與相應的支持;使用複雜的策略,根據系統壓力分佈對用戶登陸的分配能夠方便的調整;經過提升系統的配置性,能夠實現不停的經過簡單堆疊擴展系統容量,使系統隨用戶數量增長不斷擴大。
參考文獻:
[1]J. Almeida, V. Almeida, and D. Yates. Measuring the Behavior of a World-Wide Web Server. Technical Report TR-96-025, Boston University, CS Dept., Boston MA, 1996.
[2]朱利,張興軍.Web服務器組的負載均衡方法研究[J].小型微型計算機系統,2003(12).
[3]R. Abbott and H.Garcia-Molina. Seheduling I/O requests with Deadlines: A Performance Evaluation. Proceedings of the IEEE Real-Time Systems Symposium,113-124, Lake Buena Vista,Florida,USA,December 1990.
[4]Ananth Rao, Karthik Lakshminarayanan, Sonesh Surana, Richard Karp, and Ion Stoica, Load Balancing in Structured P2P Systems, in Proc. IPTPS, Feb. 2003.算法