Tomcat性能調校之連接器模塊JIO、APR和NIO

轉自:http://www.gootry.com/wangzhuan/article/100928211150/252

Tomcat提供了三種不同的服務器設計實現方法,以服務於HTTP,並實現與服務於AJP三種設計方法相同的設計方法。


JIO(java.io)

除非在Tomcat啓動時找到了APR Connector的libtcnative庫,否則這是Tomcat的默認連接器實現方法,這也稱爲“Coyote”。


  它是一個使用java.io核心Java網絡類的純Java TCP包服務器實現。它也完全是HTTP和AJP的模塊化實現


於是用純Java編寫的,所以對完全支持Java的所有操作系統來說,JIO是二進制可隨處移植的(portable)。


許多人認爲這種實現方法比主流的Apache httpd要慢,因爲它是用Java編寫的。假定Java總是比編譯的C要慢。真的嗎?請拭目以待!


APR(Apache Portable Runtime)

第二種連接服務器的方法是以Java類的方式實現,這些Java類包含了一個以C編程語言編寫的、置於小的libtcnative庫文件中的JNI壓縮包,這些Java類輪流取決於Apache Portable Runtime(APR)庫文件。


  連接Apache httpd Web服務器的類庫也是在C中實現的,而且用APR進行網絡通信。


這種可選的實現方法的目標包括:使用勝過JIO連接器的相同開源C代碼,作爲Apache httpd的服務器實現方法,並提供至少與Apache httpd同等的性能。


因爲這種方法主要是在C中實現的,所以缺陷在於單個二進制版本的這種連接器不能像JIO連接器一樣運行在所有平臺上。


這意味着Tomcat管理員需要編譯連接器,因此必須具備一定的開發環境,而且可能有編譯問題。


但是,這種連接器的作者通過要求得到比這種連接器實現要快的Tomcat的Web性能,驗證了這種特殊設置的效果。


筆者將通過基準調校,讓您親眼看到其實際效果。


  NIO(java.nio)
這是用純Java編寫的連接器(Conector)的一種可選方法。該實現用java.nio核心Java網絡類以提供非阻塞的TCP包特性。


這種Connector設計的主要目標是用非阻塞(nonblocking)的方式部分實現Connectot,以達到使用很少的線程給Tomcat管理員提供比JIO Connector執行效果更好的Connectot實現。


另一方面,NIO Connector只需要一個線程就能分析衆多連接器的請求,但每個請求隨後必須運行自身線程(Java Servlet規範要求限制的)才能尋到servlet。


因爲部分請求處理是以非阻塞的Java代碼完成的,因此,部分請求處理所佔用的時間是Java線程不需處於在用狀態的時間,這意味着小線程池可用於處理相同數量的併發請求。


小線程池通常意味着低CPU佔用,輪流使用該線程池意味着獲得更好的性能。這樣處理使速度更快的理論原因建立在假設高堆棧可以或不可以用於任何入的自身Web應用程序和交換負荷之上。


因此,對一些請求處理,NIO Connector會執行更好,而對另一些請求處理,則執行效果更差,這要視其他Connector設計的情況而定。
依靠這些Tomcat Connector,筆者在prefork及worker多線程(Multi-Process Model,縮寫爲MPM)編譯配置下進行Apache httpd基準調校,井要求通過Apache httpd連接器模塊,把基準調校的請求所在的httpd prefork和worker配置從Apache httpd發送到Tomcat。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章