.Net Core Socket 压力测试
想起之前同事说go lang写的push service单机可以到达80万连接,于是就想测试下.Net Core能达到多少。简单地写了全异步的服务端和客户端代码(未作任何优化)。测试环境只是笔记本18万连接CPU点26%左右内存点1.2G,目测放到服务器上80万还是有希望。
一、测试代码
服务端:启动TcpListener监听,异步接受客户端连接AcceptTcpClientAsync。连接到达后异步读取客户端数据,收到数据后原封不动发送到客户端。
客户端:启动60个任务,每个任务依次异步连接到服务端,连接后启动数据收发任务,在收发任务中先改送140bytes左右的数据到服务端再读取服务端返回的数据,等待30s(Task.Delay)后循环前端的收发等待步骤。共60000个连接。
数据统计:服务端客户端中都有相应的数据统计,统计数据有:已连接Socket数量、发送的数据包总数、接收数据包数总数。
代码地址:https://github.com/chrishaly/TcpStressTest
二、测试方式
服务端:Windows 10,运行服务程序。
客户端:(1)Windows 10和服务端同一机器(2)Windows Server 2012 R2 - VMWare(3)Windows 7 - VMWare。由于Winodws对连接数有限制需要修改注册表增大连接数HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters下添加DWORD值 MaxUserPort=65534。在客户端主机上运行客户端程序。3个客户端各6万连接只18万连接
三、环境及结果(各进程详情)
主机 | 配置 | Socket连接数 | CPU占用 | 内存占用 |
服务端 | 笔记本i7-4720HQ, 16G内存 | 17.99万 | 19% ~36% | 1.2G |
客户端Win 10 | 笔记本i7-4720HQ, 16G内存 | 6万 | 5% | 241M |
客户端 Win 2012 | VMWare 1 CPU 1 Core, RAM 2G | 6万 | 8%左右 | 318M |
客户端 Win 7 | VMWare 1 CPU 4 Core, RAM 2G | 5.99万 | 8%左右 | 258M |
四、遇到的一些问题:主要也就Socket连接数限制,Windows上修改注册表即可。
五、插曲:客户端本来是要用Linux的,先是用了Debian 8.6 x64连接数达到1.6万左右出现了问题,找了下Debian最大连接数ulimit –a没有限制,就没继续找原因了。果断开了Ubuntu Server 16.04 TLS连接也是1.6万左右出现了AddressAlreadyInUse的异常,然后又试了桌面版的Ubuntu 16.04 TLS也有此问题。目的是测试虚拟机太多了另外换一个吧,就用了VMWare Win 7, VMWare Windows Server 2012 R2。Debian、Ubuntu连接数据的问题以后再看。
六、有图有真相: 4个运行窗口左上角那个是服务端
服务进程情况:PID为19944的为服务进程