首先单个客户端连接测试没有问题。
1、压测端50个线程与服务器建立50个TCP长连接
2、 然后向后台服务组件发送请求,服务器读出请求处理完成后将结构返回给压测端
3、压测端解析应答输出然后继续向服务器发送请求,这样重复100次。
问题是压测端总是只有部分线程线程能够执行完成退出,如只有20个线程完成请求退出,使用netstat -antp查看端口,发现服务端有多个连接的Recv-Q是76,应该是没有退出的线程都在等待服务器应答。但是服务器读端使用read和write系统调用,都做了中断(EINTR)继续读的处理。
服务器使用了两种架构进行测试,一种是一个连接请求一个线程处理,即一个线程只处理一个连接;另一种使用epoll IO复用处理。
1、一个连接一个线程的处理压测端也是有部分线程没有执行完成,等待服务器应答,netstat查看服务端连接Recv-Q是76。
2、使用epoll LT或ET模式处理后也是结果Recv-Q是76,奇怪的是将压测端程序退出后服务器只把压测程序处理完成的那些线程的连接关闭了,而没有处理完成的线程的连接没有关闭。当启动一个客户端向服务器端发送请求时服务器端读出的刚刚关闭的压测程序的连接发送的内容,可我已经关闭了压测程序。
不知道这是什么问题,希望大家帮解析下这个问题。
下图是 执行 netstat -antp | grep 4900命令输出的部分截图,4900是服务器绑定的端口