现在做的是:
final Socket socket = serverSocket.accept();
每拿到一个Socket ,用线程池里的一个线程来处理,然后解析请求头,匹配请求路径,然后找到对应的Method来执行method.invoke,然后返回结果。
@ZGet(path = "/html")
@ZHtml
public String html() {
return "index.html";
}
@ZGet(path = "/")
public String index() {
return "OK";
}
机器是64G内存,amd R5 5600G 6核12线程的CPU,写java程序单线程来请求测试,如上两个接口没什么逻辑也不耗时,结果都是在1秒四千出头,这个正常吗。多线程并发请求,最多也才1.3万左右。还是在本机测试的。html方法是读取 index.html文件然后返回,我改为只读一次然后从内存读了,结果和index方法测试结果都在四千左右了,index.html就是个很简单的html页面也没多大。读取请求是用的 BufferedReader.readLine,返回响应结果用的 PrintWriter.write。请问瓶颈是出在了哪里呢。但是放在linux虚拟机里用ab测试则可以达到3万左右,这是怎么回事呢,以哪个为准呢。
要注意的是ServerSocket的accept方法和read/write都是阻塞的,每接收到一个socket,然后用线程池去处理,就相当于线程池里的每个线程也只能处理一个socket,并发肯定上不来。这也是为啥现在用nio的原因。