之前经常有人问平台能支持多少设备同时在线,由于事情多没时间做。最近刚好有机会做下压力测试。在不间断的连续压测三天,最终结果为13.6万TCP连接,30秒上报频率。
一、测试目的
测试平台同时接入设备数量与并发处理能力。
二、准备环境
一台主服务器用于部署车辆定位平台,是常见的8核16G内存300G硬盘,操作系统为centos 7.9,基础软件mysql8.0、redis3.2、jdk1.8,还有车辆定位平台软件。
三台压力测试服务器,同内网服务器。两台为8核16G,一台为2核4G。操作系统均为centos 7.9。
一台8核16G的服务器模拟6.3万个终端设备。
一台8核16G的服务器模拟5.3万个终端设备。
一台2核4G的服务器模拟2万个终端设备,该服务器由于配置原因模拟2万已是极限。
共模拟13.6万个终端设备,外加2台真实设备。
5.3万的压力服务器还有加压1万的空间,但加压后报异常:java.net.NoRouteToHostException: Cannot assign requested address (Address not available)。
三、编写压力测试程序
压力程序由java编写,用Socket类保持长连接,并收发数据,比较简单两个类。源代码如下:
public class TestApp { public static void main(String[] args) { String ip=args[0]; String port=args[1]; String maxThread=args[2]; String startIndex="0"; if(args.length>=4)startIndex=args[3]; try { int sindex=Integer.parseInt(startIndex); int eindex=sindex+Integer.parseInt(maxThread); for(int i=sindex;i<eindex;i++) { System.out.println("启动线程"+i); new Thread(new SendJT808Thread(Utils.leftAdd0(String.valueOf(i), 14),ip,Integer.parseInt(port))).start(); } } catch (Exception e) { e.printStackTrace(); } } }
public class SendJT808Thread implements Runnable { private String tid=""; private String ip; private int port; private Socket socket; public SendLhcxThread(String tid,String ip,int port) { this.tid=tid; this.ip=ip; this.port=port; } @Override public void run() { try { System.out.println("连接服务器->"+ip+":"+port); socket=new Socket(ip,port); while(true) { Thread.currentThread().sleep(30*1000); String time=Utils.getTime(); String temp="这里生成JT808的0x0200报文"; socket.getOutputStream().write(Utils.hexToBytes(temp)); int len=socket.getInputStream().available(); socket.getInputStream().skip(len); } } catch (Exception e) { e.printStackTrace(); }finally { try { if(socket!=null) socket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
四、参数调优
1、测试端放开端口区间,以下是临时设置,没放开只能模拟1万多个终端
sysctl -w net.ipv4.ip_local_port_range=“1024 64000”
2、测试端开启允许最大线程,以下是临时设置,没放开只能模拟3.2万个终端
sysctl kernel.pid_max
sysctl -w kernel.pid_max=65535
3、服务端,放开文件句柄数,目标为10万连接,没放开服务器报错:Too many open files
/etc/security/limits.conf
root soft nofile 200001
root hard nofile 200002
4、车辆定位的JT808网关解析线程设置为16,默认为2
五、测试结果
连续压测几天后接入2个真实设备操作业务,数据上报及指令下发都正常。各项服务器指标如下:
六、附地址:
演示地址
http://gps.lingx.com/
账号:admin
密码:123456
终端设备接入
IP:47.100.112.218
端口:8808