1. 程式人生 > >ab測試tomcat併發效能(測試BIO與NIO差別)(一)

ab測試tomcat併發效能(測試BIO與NIO差別)(一)

二、BIO、NIO、AIO

NIO通常採用Reactor模式,AIO通常採用Proactor模式。AIO簡化了程式的編寫,stream的讀取和寫入都有OS來完成,不需要像NIO那樣子遍歷Selector。Windows基於IOCP實現AIO,Linux只有eppoll模擬實現了AIO。

Java7之前的JDK只支援NIO和BIO,從7開始支援AIO。

4種通訊方式:TCP/IP+BIO, TCP/IP+NIO, UDP/IP+BIO, UDP/IP+NIO。

TCP/IP+BIO、

Socket和ServerSocket實現,ServerSocket實現Server端埠監聽,Socket用於建立網路IO連線。

不適用於處理多個請求 1.生成Socket會消耗過多的本地資源。2. Socket連線的建立一般比較慢。

BIO情況下,能支援的連線數有限,一般都採取accept獲取Socket以後採用一個thread來處理,one connection one thread。無論連線是否有真正資料請求,都需要獨佔一個thread。

可以通過設立Socket池來一定程度上解決問題,但是使用池需要注意的問題是:1. 競爭等待比較多。 2. 需要控制好超時時間。

TCP/IP+NIO

使用Channel(SocketChannel和ServerSocketChannel)和Selector。

Server端通常由一個thread來監聽connect事件,另外多個thread來監聽讀寫事件。這樣做的好處是這些連線只有在真是請求的時候才會建立thread來處理,one request one thread。這種方式在server端需要支援大量連線但這些連線同時傳送請求的峰值不會很多的時候十分有效。

UDP/IP+BIO

DatagramSocket和DatagramPacket。DatagramSocket負責監聽埠以及讀寫資料,DatagramPacket作為資料流物件進行傳輸。

UDP/IP是無連線的,無法進行雙向通訊,除非雙方都成為UDP Server。

UDP/IP+NIO

通過DatagramChannel和ByteBuffer實現。DatagramChannel負責埠監聽及讀寫。ByteBuffer負責資料流傳輸。

如果要將訊息傳送到多臺機器,如果為每個目標機器都建立一個連線的話,會有很大的網路流量壓力。這時候可以使用基於UDP/IP的Multicast協議傳輸,Java中可以通過MulticastSocket和DatagramPacket來實現。

Multicast一般多用於多臺機器的狀態同步,比如JGroups。SRM, URGCP都是Multicast的實現方式。eBay就採用SRM來實現將資料從主資料庫同步到各個搜尋節點機器。