描述:
1.用netty+json做服务接收数据,模拟近似单一业务(接收入库,有则更新)
2.数据库mysql5.6:用到ON DUPLICATE KEY UPDATE
3.服务端CPU E5-2620(双处理器,每个处理器6核12线程) 内存16 系统server2007(32位)
4.客户端i7-6700K(4核8线程) 内存8G WIN10
5.网络42环保专网(客户端用的无线连接)
6.模拟多客户端同时连接,每5秒定时发送数据,服务端接收json格式数据,解析入库更新
7.如果客户端出现一个响应时间超过3秒,则全部停止
测试1:
Server JVM设置 -Xmx400m -Xmx400m
Client JVM设置 -Xmx4G -XmxG
每个协议,包含20条记录
启动线程数1500,每分钟增加100线程(即初始化记录数为1500*20=30000,每分钟增加2000记录,同时入库更新)
线程数到2400时,出现超时情况。
分析:
1.客户端堆不到2G,cpu使用极低,情况正常
2.Druid连接池,正常
3.Server GC日志:GC (Allocation Failure)频繁,调整-Xms800m -Xmx800m -Xmn600m
测试2(每个协议,包含20条记录)
启动线程数2000,每分钟增加100线程
远程server服务器出现卡顿现象,CPU正常,数据接收正常,估计是无线网络导致的问题,
调整-Xms1200m -Xmx1200m -Xmn1000m内存不足,调整mysql:innodb_buffer_pool_size = 512M
线程数到2600时,出现超时情况。(怀疑访问错误)
测试3(每个协议,包含200条记录)
并发时每个客户端创建延迟10ms避免竞争
启动线程数1000,每分钟增加100线程(即初始化记录数为1000*200=20W)
线程数到1900时,出现超时情况。
测试4(每个协议,包含20条记录)
启动线程数2000,每分钟增加100线程(即初始化记录数为2000*20=4W)
线程数到3800时,出现超时情况。
测试5
druid的并发一直都是4,查看是否与worker.group.size相关
-Dnetty.server.boss.group.size=2
-Dnetty.server.worker.group.size=4->16
启动线程数3000,每分钟增加100线程(即初始化记录数为3000*20=6W)
worker现场组设置成16后,druid并发变成16,确实相关
线程数到3800时,出现超时情况。(因为执行中的并发一直都很小所以,mysql入库不是导致超时原因)
列表记录20条~1.56k,列表记录200条~14.6k
测试号 | 线程数 | 列表记录 | 大小 | 大小 |
1 | ||||
2 | ||||
3 | 1900 | 200 | 1900*14.6=27740k | 27m |
4 | ||||
5 | 3800 | 20 | 3800*1.56k=5928k | 6m |
问题记录:
并发时每个客户端创建延迟10ms避免竞争(可以提高并发数,测试3开始)
Client JVM设置 -Xmx400m -Xmx400m 线程1500就异常了,设置4G正常运行
启动出现重新情况(未处理)(设置延迟10ms避免竞争,未出现)
服务器默认32位系统,启动server为client模式(修改jvm.cfg)