同步堵塞IO压测

143 阅读1分钟

只做各种IO方式的横向比较,故不列具体机器规格


一、 服务端源码

TimeServer.class

 import java.io.IOException;
 import java.net.ServerSocket;
 import java.net.Socket;
 ​
 public class TimeServer {
     public static void main(String[] args) throws IOException {
         int port = 8080;
         if (args != null && args.length > 0) {
             try {
                 port = Integer.valueOf(args[0]);
             } catch (NumberFormatException e) {
 ​
             }
         }
 ​
         try (ServerSocket server = new ServerSocket(port);) {
 ​
             System.out.println("The time server is start in port: " + port);
             Socket socket = null;
             while (true) {
                 socket = server.accept();
                 new Thread(new TimeServerHandler(socket)).start();
             }
         }
     }
 }

TimeServerHandler.class

 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.PrintWriter;
 import java.net.Socket;
 import java.util.Date;
 ​
 public class TimeServerHandler implements Runnable {
     private Socket socket;
 ​
     public TimeServerHandler(Socket socket) {
         this.socket = socket;
     }
 ​
     @Override
     public void run() {
         try (BufferedReader in = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
             PrintWriter out = new PrintWriter(this.socket.getOutputStream(), true);){
 ​
             String currentTime = null;
             String body = null;
             while (true) {
                 body = in.readLine();
                 if (body == null) {
                     break;
                 }
                 System.out.println("The time server receive order : " + body);
                 currentTime = "QUERY TIME ORDER".equalsIgnoreCase(body) ? new Date(
                     System.currentTimeMillis()).toString() : "BAD ORDER";
                 out.println(currentTime);
             }
         } catch (Exception e) {
             try {
                 this.socket.close();
             } catch (IOException ioException) {
                 ioException.printStackTrace();
             }
         }
 ​
     }
 }

二、Jemeter 压测结果

5线程

Jconsole结果 同步堵塞IO 5线程压测Jconsole结果.png Jemeter吞吐量 同步堵塞IO 5线程压测吞吐量.png

CPU占用率17%,吞吐量47850

10线程

Jconsole结果 同步堵塞IO 10线程压测Jconsole结果.png Jemeter吞吐量 同步堵塞IO 10线程压测吞吐量.png

CPU占用率18.7%,吞吐量66353

20线程

Jconsole结果

同步堵塞IO 20线程压测Jconsole结果.png Jemeter吞吐量 同步堵塞IO 20线程压测吞吐量.png

CPU占用率18%,吞吐量69689

总体来看,服务端响应线程数随着Jemeter压测线程数量增加而增加,吞吐量也有所增加。BIO优缺点都比较明显,有点