彭 華
(中國電子科技集團公司第三十研究所,四川 成都 610041)
隨著網(wǎng)絡和信息安全技術的快速發(fā)展,每天有數(shù)以萬計的用戶在不斷訪問各類大型網(wǎng)站,服務器需要并發(fā)處理大量的用戶連接請求。如何使服務器在面對大量訪問請求時仍能應付自如,成為需要迫切解決的問題。在服務器的網(wǎng)絡處理能力設計時,通常采用多路復用I/O機制加線程池技術實現(xiàn)[1]。
但是,大量訪問請求產(chǎn)生的網(wǎng)絡連接可能導致頻繁的線程調(diào)度,從而消耗大量的系統(tǒng)額外時間,或者導致調(diào)度不及時,導致連接請求沒有及時響應和處理,最終導致線程池技術沒有發(fā)揮出預期的性能。如何設計服務器的線程池調(diào)度算法使其能夠盡可能發(fā)揮線程池的效能,是一個需要重點解決的問題。
創(chuàng)建和銷毀線程很費時,因為創(chuàng)建一個線程要獲取內(nèi)存資源或者其他更多資源。因此,提高效率的一個手段是盡可能減少創(chuàng)建和銷毀對象的次數(shù),特別是一些耗資源的對象創(chuàng)建和銷毀。為了節(jié)省對象創(chuàng)建和銷毀所產(chǎn)生的系統(tǒng)時間,需要準備一個容器用來保存一批這樣的對象。當需要使用這種對象時,不再需要每次去創(chuàng)建,而是直接從容器中取出現(xiàn)成的直接使用。由于節(jié)省了創(chuàng)建和銷毀對象所需的開銷,程序性能得以提升,而存放和管理這些線程對象的容器就是線程池[2]。
如圖1所示,一般簡單線程池至少由以下3部分組成[2]。
圖1 線程池組成結構
線程池管理器:也稱為主控線程,用于創(chuàng)建和管理線程池中的工作線程,定時對任務隊列掃描、清理過期未提交工作線程執(zhí)行的積壓數(shù)據(jù)。
工作線程:用于任務處理的獨立單元,并根據(jù)系統(tǒng)初始設定創(chuàng)建其數(shù)量,繁忙時會動態(tài)創(chuàng)建新工作線程。
任務隊列:提供一種緩沖機制用于存放等待處理的任務,工作線程根據(jù)相應的原則從任務隊列中獲取數(shù)據(jù)處理。
線程池采用預創(chuàng)建的技術,在應用程序啟動后,將立即創(chuàng)建一定數(shù)量的線程(N)放入空閑隊列中。這些線程處于阻塞狀態(tài),不消耗CPU,但占用較小的內(nèi)存空間。
線程池中線程的數(shù)目是動態(tài)調(diào)整的。當任務到來后將其存入任務隊列,線程池管理器選擇一個空閑線程,把任務傳入此線程中運行。當線程池中的所有線程都處于繁忙狀態(tài)時,線程池自動創(chuàng)建新線程處理更多的任務;當線程池比較空閑時,線程池銷毀一部分空閑線程,釋放系統(tǒng)資源,只保留初始創(chuàng)建的N個線程[2]。
(1)可以控制產(chǎn)生線程的數(shù)量。通過預先創(chuàng)建一定數(shù)量的工作線程并限制其數(shù)量,控制線程對象的內(nèi)存消耗[3]。
(2)降低系統(tǒng)開銷和資源消耗[3]。通過對多個請求重用線程,線程創(chuàng)建、銷毀的開銷被分攤到多個請求上。另外,通過限制線程數(shù)量,降低線程池在垃圾回收方面的開銷。
(3)提高系統(tǒng)響應速度。線程事先已被創(chuàng)建,任務到達時可直接進行處理,消除了因線程創(chuàng)建所帶來的時間延遲。另外,多個線程可以并發(fā)處理[3]。
線程池技術解決了服務器多個線程執(zhí)行的調(diào)試問題,可以使處理器盡量保持忙碌狀態(tài),充分利用系統(tǒng)的可用資源,顯著提高系統(tǒng)性能。但是,如果線程池調(diào)度策略設計不當也會事與愿違[4]。
可以通過以下2個實驗測試線程池調(diào)度策略的參數(shù)取值對服務器性能和資源占用的影響。
假設并發(fā)用戶連接總數(shù)為T,線程池初始線程數(shù)N,每個線程處理最多M個用戶連接。當有用戶連接請求時,線程池會隨機選擇一個線程對該連接請求進行處理。線程繁忙臨界點設為P(0%
如圖2所示,當某一個工作線程的用戶連接數(shù)X=0時,說明該線程處于空狀態(tài);當用戶連接數(shù)X 圖2 工作線程的運行狀態(tài) 線程池調(diào)度周期為t,當所有工作線程處于忙狀態(tài)時,線程池管理器會新創(chuàng)建一個線程并加入線程池。 以T=20 000、N=4、M=2 000、t=1 s為例,測試線程繁忙臨界點P在不同取值下的訪問完成時間和線程總數(shù)。 根據(jù)概率論與統(tǒng)計學原理,自然界很多看似沒有規(guī)律可尋的隨機事件其實服從正態(tài)分布[5]。 正態(tài)分布是一種自然分布,有極其廣泛的應用背景。在生產(chǎn)和科學實驗中,很多隨機變量的概率分布都可以近似用正態(tài)分布來表示。 如圖3所示,正態(tài)分布有2個參數(shù),即期望值和標準差,可記作N(μ,σ)。 圖3 正態(tài)分布 正態(tài)分布有如下特性: 假設在用戶訪問服務器的高峰時間段,用戶訪問總數(shù)為50萬,用戶訪問數(shù)量服從正態(tài)分布,如表1所示。 表1 高峰時間段訪問服務器的用戶數(shù) 測試線程繁忙臨界點P在取值30、60和90的情況下,高峰時段在各時間點的用戶完成數(shù)和耗時。 實驗利用線程池方式實現(xiàn)的服務器做性能測試分析。服務器CPU為Intel Xeon 2.10 GHz雙核,內(nèi)存64 GB,操作系統(tǒng)Fedora Core 14。實驗一的測試結果如表2所示。 表2 臨界點P對完成時間和線程數(shù)的影響 將表2中的臨界點P在不同取值下的完成時間轉換為圖4,將表2中的臨界點P在不同取值下的處理線程數(shù)轉換為圖5。 圖4 臨界點P在不同取值下的完成時間對比 圖5 臨界點P在不同取值下的線程數(shù)對比 綜合圖4和圖5可見,隨著臨界點P值的增大,用戶連接處理不及時的概率增加,導致用戶連接處理完成時間變長,降低了網(wǎng)絡服務器的性能。但是,如果臨界點P值設置過小,會在線程還未飽和的情況下提前創(chuàng)建新線程,導致線程數(shù)量增加,造成系統(tǒng)資源浪費。 實驗二的測試結果,如圖6、圖7所示。 分析圖6可知,在用戶訪問的高峰時間段,隨著臨界點P值的增大,服務器對高峰期用戶訪問請求的響應速度變慢,未及時處理的用戶訪問請求會被延遲到高峰期后處理。 分析圖7可知,在用戶訪問的高峰時間段,隨著臨界點P值的增大,對高峰期用戶訪問請求的處理耗時會隨著用戶數(shù)的增加而增大,一旦到達服務器的處理極限后,會保持相同的處理耗時。結合圖6的分析可知,由于未及時處理的用戶訪問請求被延遲,所以處理耗時的下降拐點隨著臨界點P值的增大而延后。 圖6 臨界點P在不同取值下的用戶完成數(shù)對比 圖7 臨界點P在不同取值下的處理耗時對比 綜上所述,線程池模型主要是通過線程池管理器對線程池進行并發(fā)調(diào)度。線程池管理器主要通過各個工作線程的負載情況和任務的優(yōu)先級別調(diào)度任務,使得線程池工作更加靈活,處理任務更加及時、高效。但是,由于線程池的工作調(diào)度依賴于線程池管理器調(diào)度算法,所以線程池性能主要受到調(diào)度策略和調(diào)度參數(shù)的影響[6]。因此,不同的服務器需要根據(jù)應用場景尋找最優(yōu)的線程池調(diào)度方案,使服務器性能與資源消耗達到平衡。 線程池技術為線程創(chuàng)建銷毀的開銷問題和系統(tǒng)資源不足的問題提供了一個較好的解決方案,尤其適用于大量用戶訪問請求的服務器應用[7]。但是,要使線程池的處理效率更高,對線程池的調(diào)度是一個要考慮的問題,且調(diào)度策略和調(diào)度參數(shù)要根據(jù)實際應用場景來設定。只有合理的線程池調(diào)度,才能發(fā)揮出線程池技術在服務器應用中的最大效能。2.2 實驗二
3 實驗結果和分析
4 結 語