基于tcp/udp socket多线程并发实现对二进制协议的压力测试

1、项目背景

服务端采取tcp/udp协议实现,携带二进制协议码流,现有的测试工具Jmeter在使用过程中遇到一些限制,譬如产生唯一性的字段时需要从csv文件读值,然后插入到tcpsampler携带的二进制码流中,反复读文件影响性能。QPS不高,达不到压测要求。另外,在性能测试过程中,不能够灵活的配合开发去定位问题。譬如某个请求失败了,需要提供一些请求相关的字段给到开发去快速定位问题。基于此,自己用java写了一个简单的tcp/udp性能测试工具。

2、总体架构

并发基于tcp/udp socket多线程并发实现对二进制协议的压力测试_第1张图片N个线程来达到增加QPS的目的。

每个线程的网络操作是同步的,没有采取异步socket(此时QPS和时延是强相关的,时延越小,QPS越高)

整个程序需要统计总的请求次数,服务器回包次数,服务器回包中结果为失败的次数,tcp建立连接失败次数,tcp建立连接时延,发送接收时延

3、单线程的代码实现

@Override
	public void run(){
		long st=System.nanoTime();
		for(int i=0;i/**
     * recv data from server
     * @return true if recv data successfully,otherwise false
     */
    public boolean recvN(){
    	try{
    		if(in!=null){
	    		do{
	    			if(!buffer.isCompleted && sleepTime>0){
		    			try{
							Thread.sleep(sleepTime);}//6统计时延时,需要注释掉,高并发的时候,sleep会有助于性能提升,因为send后服务器回包肯定是在多少ms后了,避免无谓浪费cpu
			    			catch(Exception w){
			    				
			    			}
		    		}
	    			if(in.available()>0){
	    				sendRecvDelay=System.nanoTime()-sendTime;
						byte[] recvBuff=new byte[in.available()];
						int len=in.read(recvBuff);
						buffer=getFullPackageFromSocketDataN(recvBuff,len);
						recvBuff=null;
					}
	    			
	    			/*
	    			if(!buffer.isCompleted){
		    			try{
						Thread.sleep(sleepTime);}//统计时延时,需要注释掉
		    			catch(Exception w){
		    				
		    			}
					}
					*/
	    		}while(!buffer.isCompleted && !isTimeOut());
	    		
    		}
    	}catch(IOException e){
    		System.out.println("socket recv:"+e.getMessage());
    		isRecvSucessfully=false;
    		closeN();
    	}
    	return isRecvSucessfully;
    }


4、并发50000个线程时,qps可以达到1.6w左右(服务器时延在10ms以下)

你可能感兴趣的:(基于tcp/udp socket多线程并发实现对二进制协议的压力测试)