(1.首都師范大學 信息工程學院, 北京 100037; 2.中國科學院 計算技術研究所, 北京 100080; 3.中國科學院 研究生院, 北京 100049)
摘要:多核處理器環境日益普及,針對此體系結構的應用程序的并行性研究已成為焦點。輕量級Web服務器應用廣泛,但傳統實現不能充分利用多核優勢且編程方法相對復雜。提出一種基于數據流結合虛擬機優化及Java擴展庫的解決方案,給出了一種新的Web服務器實現方法。實驗結果表明該方法有效提高了Web服務器的處理性能。
關鍵詞:多核; 并行; 數據流Java; 虛擬機; 組件
中圖分類號:TP39文獻標志碼:A
文章編號:1001-3695(2008)11-3357-04
Implementation of optimized lightweight Web server based on dataflow Java
ZHONG Lu-jie1,2,3, WANG Jie1,2,3, WU Cheng-yong2, ZHOU Li-juan1
(1.College of Information Engineering, Capital Normal University, Beijing 100037, China; 2.Institute of Computing Technology, Chinese Academy of Sciences, Beijing 100080, China; 3.Graduate School, Chinese Academy of Sciences, Beijing 100049, China)
Abstract:Multi-core processors are applied into various computer application areas, researching on how to develop the para-llelism of application which based on this architecture become focus. Lightweight Web servers are used widely, but traditional realization can not take multi-core advantages enough and the programming methods are relatively complicated. This paper proposed a scheme which based on dataflow and combined Java extend library with optimized virtual machine, supposed a new Web server design and implement approach. The experiment results show the approach obviously produce performance improvement.
Key words:multi-core; parallism; dataflow Java; virtual machine; component
0引言
隨著處理器技術向著多核多線程高度并發的可擴展架構發展,原有的軟件設計方法和算法均面臨著重大的革新。如何更好地開發和改善針對多核體系結構應用程序的并行性能已日益成為研究熱點。面向大眾提供的HTTP服務輕量級Web服務器應用廣泛,但傳統的Web服務器的多線程實現機制需要程序員增加額外的線程池支持,因而產生了多余的性能開銷,對多核體系結構的支持僅被動地依賴于操作系統,運行時環境支持則完全依賴于相應的編程語言及環境。對此,本文提出一種基于數據流Java的結合Java擴展庫及虛擬機優化的解決方案,對輕量級Web服務器重新進行了設計與實現,并從每秒處理請求數及吞吐量等多個重要的衡量Web服務器的性能因素著手,進行了大量實驗和分析,結果表明基于該方案改寫的Web服務器性能可獲得明顯提升。
1多核體系結構下程序并行性挖掘
多核體系結構下的性能優化編程是目前的研究熱點問題之一。Java是一種非常流行的編程語言,具有許多易于編程和調試的特點。Java內建的多線程編程的并發性建立在線程和管程基礎上,這種模型易于學習和理解,但是難以實用。即使有經驗的程序員所編寫的多線程程序,仍易包含數據競爭、死鎖、饑餓等難以監測和調試的錯誤[1,2],并且當問題復雜性增加時,多線程的Java程序非常難以擴展。
在多核多線程體系結構上,較為理想的并行模型是混合型的設計方案。在細粒度上,保持程序的串行特征;在粗粒度上,適當引入并行特性,使并行程序在執行時較易映射到體系結構的線程級并行。目前多數基于Java的并行程序設計模型擴展都是以單純的擴展庫方式實現。這樣虛擬機的運行時環境往往不能獲得并行模型的運行時特征,從而無法進行針對性的性能優化。對此提出了一種基于數據流Java[3~8]的并行程序設計方案,其主要思想是將一個數據流Java程序描述為一個數據流圖(dataflow graph)。圖中的節點稱為組件(component),節點之間存在有向邊,有向邊稱為通道(channel)。組件之間的數據對象通過先入先出(FIFO)的通道進行傳遞。
與單純地擴展Java庫[9~11]實現的并行程序設計模型相比,本文采用了將Java擴展庫與Java虛擬機相結合的方案。該方案實現方式簡單、快速,并且可使虛擬機獲得并行程序設計模型的相關特性和各種運行信息而作出針對性的優化。由于底層硬件特征對虛擬機可見,運行時環境在不同的硬件平臺上運行時,可根據模型的運行時行為,利用硬件特征對上層并行程序進行適應性優化,從而獲得更好的性能。
11Java擴展庫設計
本文通過Java擴展庫的方式向程序員提供程序設計接口。Java擴展庫的實現基于JavaFBP[12,13]庫,在保留了部分JavaFBP接口的基礎上重新進行了擴展實現。
Component類是所有組件的基類,它含有兩個抽象方法execute()和openPorts()以及存儲輸入/輸出端口的成員變量。InputPort類是輸入端口,提供了receive()方法;OutputPort類是輸出端口,提供了send()方法。輸入端口和輸出端口均含有虛擬機中實際端口實例的指針,用于真正地發送和接收數據。InitializationInputPort是參數端口,它是輸入端口的子類,其成員變量content用于保存獲得的參數對象。Network類是Component的子類,使得網絡可作為一個組件與其他組件進行協作,其成員變量components包含了所有屬于這個網絡的組件。
12虛擬機內部數據流模塊
為了高效地支持數據流Java模型和進行運行時的自適應優化,在Java虛擬機中提供對模型的運行時支持[14]。本文采用的是開放源碼的Apache Harmony DRLVM[15]的虛擬機平臺。DRLVM是一個Java虛擬機,主要由虛擬機核心(VM core)、執行引擎(execution engine)、執行管理器(execution manager)、垃圾收集器(garbage collector)、線程管理器(thread manager)和移植層(porting layer)組成[16]。
根據DRLVM內部的功能模塊分工,設計了虛擬機內部的數據流Java模型架構,如圖2所示。
該架構主要由以下幾部分構成:
a)通信信道(communication channel)。位于虛擬機核心模塊,對上層數據流Java擴展庫提供高度并發的、非阻塞的通信機制。
b)即時編譯器(JIT compiler),除自身編譯執行功能,還對數據流Java各個模塊提供instrument及write barrier接口。
c)Profiler,負責收集通信通道的統計信息以及即時編譯器生成的插樁代碼產生的訪存序列信息等。
d)系統資源監視器,負責收集系統各種資源信息,用于自適應優化。
e)線程管理器,負責線程管理、組件動態復制等。
2輕量級Web服務器設計與實現
為便于說明,本文將以一個Java開源的典型的多線程Web服務器Tornado[17]為例闡述本文提出的解決方案。Tornado具備安全、高效、輕便的特點,提供HTTP 1.1的完全實現,是一個具有代表性的輕量級Web服務器。
21Tornado Web服務器
與大多數傳統的多線程Web服務器相似,Tornado需要程序員創建線程池并實現相應的threadManager來進行多線程管理工作。
Tornado類的構造函數首先創建ServerPool類實例,在其中調用ServerPool類的構造函數,該構造函數負責完成ServerThread的創建工作。緊接著創建ThreadManager類實例,之后完成根據端口數創建ListenThread類實例的工作。ServerThread類負責從arrayList中獲得一個可用的Socket,然后開啟HTTP事務,并作出響應,最后完成并關閉連接。每個HTTP transaction都會引發一個ServerThread,相當于一個客戶端。所有的ServerThread在一個threadGroup當中。每執行完一次ServerThread,就會關閉Socket。ListenThread類主要負責服務端Socket的創建和監聽;而ThreadManager類負責線程的休眠及空閑線程的管理;ServerPool類負責產生和殺死ServerThread,以及將Socket分發到arrayList中。
22數據流Java Web服務器設計
針對Web服務器的業務邏輯和并行需求,首先進行數據流圖的設計。在該數據流圖設計中擯棄了傳統Web服務器中關于線程池和線程管理器的實現,程序員僅需根據程序邏輯設計相應的組件與之對應,并行性的開發更為直觀,工作量也大為減少。為與傳統Tornado服務器區別,本文將數據流Java方式的Tornado服務器稱為DataflowJavaTornado。
在數據流圖中(圖3),主要定義了三個組件:dataflowJavaTornadoInit、listenThread及serverThread。其中listenThread和serverThread均為fireable組件。
1)DataflowJavaTornadoInit組件針對每一個端口的監聽有兩個輸出端口,即LTOUTi和LTSTi (0≤i≤n,n為要用于監聽的端口總數)。其中,LTOUTi對應port類型,而LTSTi對應一種自定義的數據元素類型dataElement。
2)ListenThread組件它包含兩個輸入端口、兩個輸出端口。其中,輸入端口為IN和STLTIN,IN對應port類型,而STLTIN對應dataElement類型,本文使用不同的字符串區別分別來自于dataflowJavaTornadoInit和serverThread的回圈。輸出端口包括STOUT0和STOUT1,STOUT0對應Socket類型,而STOUT1對應port類型。
3)ServerThread組件它包含兩個輸入端口和兩個輸出端口。其中,輸入端口為IN0和IN1,IN0對應Socket類型,IN1對應port類型;輸出端口為STLTOUT0和STLTOUT1,STLTOUT0對應port類型,而STLTOUT1對應dataElement類型。
圖3中的多個listenThread和serverThread組件由運行時環境根據系統資源情況作出自適應的復制和消減。
23部分代碼
采用上文提及的數據流Java模型中的Java擴展庫的接口重新編寫了HTTP服務器的實現。以下是部分有代表性的代碼片段。其中,Tornado.java定義了一個網絡,一個網絡可以是一個數據流Java程序,也可以是一個組件。定義一個網絡,必須顯式定義一個dataflow.java.lang.Network的子類。在網絡中,程序員可以定義端口,作為一個組件與外部通信;也可以不定義端口,作為一個獨立運行的數據流Java程序。Torando.java中定義的網絡屬于后一種情況。作為可獨立運行的網絡必須定義兩個成員方法,即define()和main()。
ListenThread.java定義了一個component。組件的定義需要程序員顯式地定義一個dataflow.java.lang.component的子類,如果一個組件是可觸發的,則需要聲明該組件實現了fireable接口。在組件中,程序員可以聲明多個端口用于和外部交換數據。ListenThread.java中用到的端口類型有兩種,即輸入端口(inputPort)和輸出端口(outputPort),分別用于進行receive和send操作。
每一個組件除了定義端口之外,必須定義兩個成員方法,即openPorts()和execute()。其中,opentPorts()用于打開組件內指定的端口;而execute()是組件運行時所執行的方法,指定了組件的運行邏輯。該方法一旦執行完畢,組件終止。
2)ListenThread.java
與引擎數、每秒請求數、吞吐量(Byte/s)和錯誤(連接+傳送)數幾個方面的測試數據。
表1Tornado、DataflowJavaTornado、Apache 2.0數據集
服務器名稱客戶端引擎數每秒請求數吞吐量/Bps)錯誤(連接+傳送)
從測試數據看,DataflowJavaTornado相比傳統的Tornado服務器和Apache 2.0在參與引擎數上更具優勢,能夠更充分地調動參與引擎;DataflowJavaTornado性能較Tornado有很大提高,與Apache 2.0相比就HTTP服務而言也更具優勢,但Apache 2.0的錯誤數更少。
32結果分析
圖4分別從每秒處理請求數和吞吐量兩個方面對Tornado、Apache 2.0及DataflowJavaTornado進行了比較。其中DataflowJavaTornado由于充分利用了多核特性,其性能提升明顯,與傳統Tornado相比性能平均提升達兩倍以上。
Apache 2.0由于綜合了其他服務功能,如FTP、e-mail等,在吞吐量及處理請求數方面有所消耗,故較之DataflowJavaTornado而言并不占據優勢。
4結束語
本文通過一個簡潔明確的基于數據流Java的并行編程模型有效地提高了輕量級Web服務器針對多核體系結構的處理性能,且程序員無須進行繁瑣的語言學習,是一個可行且值得推廣的解決方案。
參考文獻:
[1]HILDERINK G, BROENINK J, VERVOORT W. Communicating Java threads[C]//Proc of Parallel Programming and Java. Netherlands:IOS Press, 1997:48-76.
[2]LEE E A. The problem with threads[D].Berkeley: EECS Department, University of California, 2006.
[3]LEE E A,PARKS T M. Dataflow process networks[J].Proceeding of the IEEE, 1995,83(5):773-779.
[4]劉弢. 數據流Java程序設計模型及其支撐技術研究[D].北京:中國科學院計算技術研究所,2007.
[5]ASANOVIC K. The landscape of parallel computing research: a view from Berkeley[R]. Berkeley:University of California at Berkeley, 2006.
[6]CATALDO J A, LEE E A. Composition languages[R].Berkeley: EECS Department,University of California, 2006.
[7]CHARLES P, GROTHOFFC SARASW-ATV,et al.X10: an object oriented approach to non-uniform cluster computing[C]//Proc of the 20th Annual ACM SIGPLAN Conference on Object Oriented Programming, Systems, Languages, and Applications. New York:ACM Press,2005:519-538.
[8]AMMONS G, BELL T, LARUS J R. Exploiting hardware performance counters with flow and context sensitive profiling[C]//Proc ofACM SIGPLAN Conference on Programming Language Design and Implementation. New York:ACM Press,1997:85-96.
[9]FOSTER I. Designing and building parallel programs: concepts and tools for parallel software engineering[M].[S.l.]: Addison Wesley, 1995.
[10]Communicating sequential processes for Java (JCSP) [EB/OL]. http://www.cs.kent.ac.uk/projects/ofa/jcsp/.
[11]Jada [EB/OL]. http://www.cs.unibo.it/~rossi/jada.
[12]Flow-based programming [EB/OL]. http://www.jpaulmorrison.com /fbp/.
[13]GORDON M I, THIES W, AMARASINGHE S. Exploiting coarse-grained task, data and pipeline parallelism in stream programs[C]//Proc ofthe 12th International Conference on Architectural Support for Programming Lanuages and Operating.New York: ACM Press, 2006:151-162.
[14]LIANG Sheng, VISWANATHAN D. Comprehensive profiling support in the Java virtual machine[C]//Proc of the 5th USENIX Conference on the MathWorks. Berkeley:USENIX Association,2006:17.
[15]Apache Harmony DRLVM[EB/OL]. http://harmony.apache.org/ subcomponents/drlvm/index.html.
[16]Apache Portable Runtime library[EB/OL].http://apr.apache.org/.
[17]Tornado Web Server[EB/OL].http://tornado.sourceforge.net/.
[18]Webbench Test Suite[EB/OL].http://cs.uccs.edu/~cs526/webbench/ webbench.htm.