[NewLife.Net]单机400万长连接压力测试

目标

对网络库NewLife.Net进行单机百万级长连接测试,并持续收发数据,检测网络库稳定性

【2020年8月1日晚上22点】

先上源码:https://github.com/NewLifeX/NewLife.Net

结论,8月1日晚达到200万,8月2日下午达到404万。

上一次百万级压测是2017年4月1日,失败了,只达到84.5万。后来做了一次吞吐量压测。

技术革新

自上一次百万级压测(2017.4.1)以来,网络库进行了诸多细节优化(没有调整架构),特别优化了内存拷贝和多线程操作。

上次购买了20多台高配大数据服务器(16C64G和8C16G),每台发起5万Tcp长连接,纯人肉方式,相当累。这次从泥水佬那里学到本地配置多IP地址建立更多连接的方式,大大节省了服务器资源和人力成本。每台服务器设置20个IP,每个IP发起5万Tcp长连接。

测试程序也从.Net 4.5升级到了.Net Core 3.1,性能提升可观。

服务器资源

阿里云上海区共购买6台12C24G的计算型C5服务器,按照抢占型实例购买,晚上特别便宜。平时3.7每小时的价格,现在0.355就可以拿到。

这次压测对网络要求极高,所以选择的服务器必须有高带宽以及高PPS,务必是同一个机房,便于内网测试。

第一次购买的002因为设置IP失误导致弄残了服务器,不得不释放重新购买。

001~004配置多IP花了很长时间,后来才想到用命令批量设置。

默认每个ECS只有一个私网IP,可以再增加9个,一共10个。

经@景洋 提醒,ECS可以通过 绑定弹性网卡,得到20个IP地址,后面的005/002/006都有20个IP。

环境准备

优化Tcp参数

Windows默认只能使用5000个端口,需要优化Tcp参数设置。

把码神工具拷贝到服务器,直接双击运行,工具->网络调试工具,内容区点击右键,查看Tcp参数,可以看到MaxUserPort是5000,右键还有个“设置最大Tcp”把各个参数值设置为最优。无需重启,直接生效。

码神工具也可以在这里下载,http://x.newlifex.com/XCoder_Install.exe

码神工具源码:https://github.com/NewLifeX/XCoder

安装.NET Core运行时

.NET Core 3.1.6 也需要拷贝上去安装,或者直接从 http://get.dot.net 下载。服务器网络非常快。

网卡设置

为了增加每台测试端的连接数,我们需要用netsh命令增加IP地址。这些IP地址来自于ECS设置的辅助私网IP。请一定要申请辅助私网IP以后再去设置网卡,未申请的IP地址可能出问题,第一次购买的002就是这样残废了。

设置主网卡辅助私网IP

设置弹性网卡辅助私网IP

NetBench002

netsh interface ip add address "以太网" 172.19.18.73 255.255.0.0 172.19.19.253
netsh interface ip add address "以太网" 172.19.18.75 255.255.0.0 172.19.19.253
netsh interface ip add address "以太网" 172.19.18.76 255.255.0.0 172.19.19.253
netsh interface ip add address "以太网" 172.19.18.77 255.255.0.0 172.19.19.253
netsh interface ip add address "以太网" 172.19.18.78 255.255.0.0 172.19.19.253
netsh interface ip add address "以太网" 172.19.18.79 255.255.0.0 172.19.19.253
netsh interface ip add address "以太网" 172.19.18.80 255.255.0.0 172.19.19.253
netsh interface ip add address "以太网" 172.19.18.81 255.255.0.0 172.19.19.253
netsh interface ip add address "以太网" 172.19.18.82 255.255.0.0 172.19.19.253
netsh interface ip add address "以太网" 172.19.18.83 255.255.0.0 172.19.19.253
netsh interface ip add address "以太网 2" 172.19.18.74 255.255.0.0 172.19.19.253
netsh interface ip add address "以太网 2" 172.19.18.84 255.255.0.0 172.19.19.253
netsh interface ip add address "以太网 2" 172.19.18.85 255.255.0.0 172.19.19.253
netsh interface ip add address "以太网 2" 172.19.18.86 255.255.0.0 172.19.19.253
netsh interface ip add address "以太网 2" 172.19.18.87 255.255.0.0 172.19.19.253
netsh interface ip add address "以太网 2" 172.19.18.88 255.255.0.0 172.19.19.253
netsh interface ip add address "以太网 2" 172.19.18.89 255.255.0.0 172.19.19.253
netsh interface ip add address "以太网 2" 172.19.18.90 255.255.0.0 172.19.19.253
netsh interface ip add address "以太网 2" 172.19.18.91 255.255.0.0 172.19.19.253
netsh interface ip add address "以太网 2" 172.19.18.92 255.255.0.0 172.19.19.253
netsh interface ip add dns name="以太网" addr=100.100.2.136
netsh interface ip add dns name="以太网" addr=100.100.2.138
netsh interface ip add dns name="以太网 2" addr=100.100.2.136
netsh interface ip add dns name="以太网 2" addr=100.100.2.138

NetBench005

netsh interface ip add address "以太网" 172.19.18.53 255.255.0.0 172.19.19.253
netsh interface ip add address "以太网" 172.19.18.55 255.255.0.0 172.19.19.253
netsh interface ip add address "以太网" 172.19.18.56 255.255.0.0 172.19.19.253
netsh interface ip add address "以太网" 172.19.18.57 255.255.0.0 172.19.19.253
netsh interface ip add address "以太网" 172.19.18.58 255.255.0.0 172.19.19.253
netsh interface ip add address "以太网" 172.19.18.59 255.255.0.0 172.19.19.253
netsh interface ip add address "以太网" 172.19.18.60 255.255.0.0 172.19.19.253
netsh interface ip add address "以太网" 172.19.18.61 255.255.0.0 172.19.19.253
netsh interface ip add address "以太网" 172.19.18.62 255.255.0.0 172.19.19.253
netsh interface ip add address "以太网" 172.19.18.63 255.255.0.0 172.19.19.253
netsh interface ip add address "以太网 2" 172.19.18.54 255.255.0.0 172.19.19.253
netsh interface ip add address "以太网 2" 172.19.18.64 255.255.0.0 172.19.19.253
netsh interface ip add address "以太网 2" 172.19.18.65 255.255.0.0 172.19.19.253
netsh interface ip add address "以太网 2" 172.19.18.66 255.255.0.0 172.19.19.253
netsh interface ip add address "以太网 2" 172.19.18.67 255.255.0.0 172.19.19.253
netsh interface ip add address "以太网 2" 172.19.18.68 255.255.0.0 172.19.19.253
netsh interface ip add address "以太网 2" 172.19.18.69 255.255.0.0 172.19.19.253
netsh interface ip add address "以太网 2" 172.19.18.70 255.255.0.0 172.19.19.253
netsh interface ip add address "以太网 2" 172.19.18.71 255.255.0.0 172.19.19.253
netsh interface ip add address "以太网 2" 172.19.18.72 255.255.0.0 172.19.19.253
netsh interface ip add dns name="以太网" addr=100.100.2.136
netsh interface ip add dns name="以太网" addr=100.100.2.138
netsh interface ip add dns name="以太网 2" addr=100.100.2.136
netsh interface ip add dns name="以太网 2" addr=100.100.2.138

测试程序准备

我们采用网络库例程来充当测试程序。

服务端,https://github.com/NewLifeX/NewLife.Net/tree/master/EchoTest

客户端,https://github.com/NewLifeX/NewLife.Net/tree/master/Benchmark

源代码在这里有详细讲解

此处为语雀文档,点击链接查看:https://www.yuque.com/go/doc/8990258

二者都需要Release编译,以减少调试日志输出。

为了减少内存占用,我们需要修改配置文件`Config\Socket.config`,把缓冲区大小从64k改为1k

<?xml version="1.0" encoding="utf-8"?>
<Socket><!--网络调试--><Debug>false</Debug><!--会话超时时间。默认20*60秒--><SessionTimeout>7200</SessionTimeout><!--缓冲区大小。默认64k--><BufferSize>1024</BufferSize>
</Socket>

服务端客户端都要修改这个配置,否则内存占用过大。

我们选定001作为主服务器,内网IP是172.19.18.4,拷贝EchoTest到服务器目录,双击跑起来,运行模式选择1,服务端,开始监听1234端口。

002~006作为测试端,配置环境后,拷贝Bench到服务器目录,打开cmd,输入一下命令跑起来(以005为例):

netbench.exe -c 1000000 -n 1000 -i 30000 -b 172.19.18.53-72 tcp://172.19.18.4:1234

各参数解读如下:

  • -c 1000000,表示100万并发,也就是100万个tcp连接。003/004只有10个私有IP,这里最高只能10*5w=50w

  • -n 1000,每个连接收发1000次数据;

  • -i 30000,两次收发数据之间间隔30秒;

  • -b 172.19.18.53-72,发起连接时,绑定本地IP地址172.19.18.73到172.19.18.72,这些IP会均摊前面的100万

  • tcp://172.19.18.4:1234,指定目标服务端的协议地址和端口

00:45达到100万长连接

003和004各自贡献了50万连接,它们只有10个IP。

服务端在0点45分达到100万在线,非常稳定,服务端和客户端没有出现任何错误。CPU和内存占用也很好。

最后这张网络图可以看到,前面测试百万连接时,增长很快,实际上导致了部分连接失败(<0.01%),后来加上参数控制了连接速度,才有稳步爬坡。

01:19突破200万长连接

在003/004达到100万长连接并维持30分钟后,先后开启005和002,预期朝着300万方向走。

在1点19分左右,突破200万长连接。此时,CPU和内存的压力都很大,部分测试机的连接开始断开。

经检查,主服务器内存不足,导致处理能力变弱,少量客户端认为连接超时,执行自动重连,让服务器压力加大,形成雪崩。

总结

超量完成了预期目标,100万=>200万。如果这次选择48G或96G内存作为主服务器,也许真有可能上300万长连接。

2017年做的2266万tps吞吐量测试

此处为语雀文档,点击链接查看:https://www.yuque.com/go/doc/10610986

8月2日上午再战300万

购买12C96G高配实例,杭州区便宜,编号NetBench007

IP设置

netsh interface ip add address "以太网" 172.16.188.92 255.255.240.0 172.16.191.253
netsh interface ip add address "以太网" 172.16.188.94 255.255.240.0 172.16.191.253
netsh interface ip add address "以太网" 172.16.188.95 255.255.240.0 172.16.191.253
netsh interface ip add address "以太网" 172.16.188.96 255.255.240.0 172.16.191.253
netsh interface ip add address "以太网" 172.16.188.97 255.255.240.0 172.16.191.253
netsh interface ip add address "以太网" 172.16.188.98 255.255.240.0 172.16.191.253
netsh interface ip add address "以太网" 172.16.188.99 255.255.240.0 172.16.191.253
netsh interface ip add address "以太网" 172.16.188.100 255.255.240.0 172.16.191.253
netsh interface ip add address "以太网" 172.16.188.101 255.255.240.0 172.16.191.253
netsh interface ip add address "以太网" 172.16.188.102 255.255.240.0 172.16.191.253
netsh interface ip add address "以太网 2" 172.16.188.93 255.255.240.0 172.16.191.253
netsh interface ip add address "以太网 2" 172.16.188.103 255.255.240.0 172.16.191.253
netsh interface ip add address "以太网 2" 172.16.188.104 255.255.240.0 172.16.191.253
netsh interface ip add address "以太网 2" 172.16.188.105 255.255.240.0 172.16.191.253
netsh interface ip add address "以太网 2" 172.16.188.106 255.255.240.0 172.16.191.253
netsh interface ip add address "以太网 2" 172.16.188.107 255.255.240.0 172.16.191.253
netsh interface ip add address "以太网 2" 172.16.188.108 255.255.240.0 172.16.191.253
netsh interface ip add address "以太网 2" 172.16.188.109 255.255.240.0 172.16.191.253
netsh interface ip add address "以太网 2" 172.16.188.110 255.255.240.0 172.16.191.253
netsh interface ip add address "以太网 2" 172.16.188.111 255.255.240.0 172.16.191.253
netsh interface ip add dns name="以太网" addr=100.100.2.136
netsh interface ip add dns name="以太网" addr=100.100.2.138
netsh interface ip add dns name="以太网 2" addr=100.100.2.136
netsh interface ip add dns name="以太网 2" addr=100.100.2.138

准备就绪

先来一个亿热身

开启100个并发连接,每个密集请求100万次,轻轻松松得到 130万tps 的吞吐

使用IPv6会更强一点

正式开始

本机压测命令

netbench.exe -c 1000000 -n 10000 -i 60000 -b * tcp://127.0.0.1:1234

其中`-b *`表示绑定本机所有IP地址。

3分钟轻松上100万

由于没有控制连接速度,期间有小量连接失败。控制台那里有日志时间,同时可以看到客户端服务端连接数一致。

我们等它稳定一段时间,再去准备更多服务器

从11:40开始,截止现在14:16,持续两个半小时。建立999742个连接,现存也是999742,最大值999743说明中途有一个连接断开,但是重连成功了。

增加测试机资源

再买5台同样配置服务器,编号NetBench008~NetBench012

开始配置NetBench008,每次打命令太要命了,我们给码神工具增加一个批量设置IP的功能。

从阿里云ECS控制台把辅助私网IP复制过来,点击“设置IP”,即可把这些IP地址设置到网卡上。

杭州区服务器的网络限制很严格(可能别的区也这样),在哪张网卡上申请的IP地址,只能设置到这张网卡上。即使每台服务器有两张网卡,也不能把各自的辅助私网IP设置错了,否则无法使用。

15:51达到300万长连接

服务端进程占用内存15G

15:54达到400万长连接

服务器0核4核爆满

15:56操作系统直接挂了,自动重启,连接数峰值404万。

吞吐率压测

5台测试机,每台向服务端建立100个连接,每个连接发送100万个消息,每个端平均速度170万tps

服务端总速度 170万*5=1050万tps

CPU很满,网卡PPS太高

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/308433.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ABP快速开发一个.NET Core电商平台

总听.NETer羡慕Java有SSM框架&#xff0c;其实.NET也有ABP&#xff0c;极度优秀的开源应用程序框架&#xff0c;支持.NET Framework和.NET Core。羡慕Java有SpringCloud&#xff0c;其实.NET也有ABP.vNext&#xff0c;由ABP团队全新打造的.NET Core微服务架构开源框架&#xff…

java swing 控件拖动_java swing中实现拖拽功能示例

java实现拖拽示例Swing中实现拖拽功能&#xff0c;代码很简单&#xff0c;都有注释&#xff0c;自己看&#xff0c;运行效果如下图&#xff1a;package com;import java.awt.*;import java.awt.datatransfer.DataFlavor;import java.awt.dnd.DnDConstants;import java.awt.dnd.…

7-26 Windows消息队列 (25 分)(详解+思路+超时解决)

一&#xff1a;题目 消息队列是Windows系统的基础。对于每个进程&#xff0c;系统维护一个消息队列。如果在进程中有特定事件发生&#xff0c;如点击鼠标、文字改变等&#xff0c;系统将把这个消息加到队列当中。同时&#xff0c;如果队列不是空的&#xff0c;这一进程循环地从…

java 视频监控 分屏ui_视频监控网页ActiveX视频分屏播放控件开发

最近在搞视频监控项目&#xff0c;需要在网页上显示实时视频&#xff0c;于是网上找了很多资料研究如何在网页上播放视频&#xff0c;一种实现方式就是开发activex控件嵌入到网页中。如下我将介绍如何开发一个可以分屏播放视频的activex控件 (部分内容也是从网上抄的&#xff0…

基于.NetCore3.1系列 —— 日志记录之日志核心要素揭秘

前言在上一篇中&#xff0c;我们已经了解了内置系统的默认配置和自定义配置的方式&#xff0c;在学习了配置的基础上&#xff0c;我们进一步的对日志在程序中是如何使用的深入了解学习。所以在这一篇中&#xff0c;主要是对日志记录的核心机制进行学习说明。说明在上一篇中&…

listview在java中的使用_我的Android开发之路——ListView的使用

在Android开发过程中&#xff0c;遇到需要列表显示的时候&#xff0c;这时候就会用到listview。1.首先创建一个ListViewTest项目&#xff0c;选择empty activity类型。修改activity_main.xml的布局文件&#xff0c;添加listview控件&#xff0c;设置宽高和id等属性此时通过预览…

如何利用NLog输出结构化日志,并在Kibana优雅分析日志?

上文我们演示了使用NLog向ElasticSearch写日志的基本过程(输出的是普通文本日志)&#xff0c;今天我们来看下如何向ES输出结构化日志、在Kibana中分析日志。什么是结构化日志&#xff1f;当前互联网、物联网、大数据突飞猛进&#xff0c;软件越复杂&#xff0c;查找任何给定问题…

java打印设备集中管理_Kafka+Log4j实现日志集中管理

记录如何使用KafkaLog4j实现集中日志管理的过程。引言前面写的《SpringLog4jActiveMQ实现远程记录日志——实战分析》得到了许多同学的认可&#xff0c;在认可的同时&#xff0c;也有同学提出可以使用Kafka来集中管理日志&#xff0c;于是今天就来学习一下。特别说明&#xff0…

7-27 家谱处理 (30 分)(详解+map做法)map真香啊

一&#xff1a;题目 人类学研究对于家族很感兴趣&#xff0c;于是研究人员搜集了一些家族的家谱进行研究。实验中&#xff0c;使用计算机处理家谱。为了实现这个目的&#xff0c;研究人员将家谱转换为文本文件。下面为家谱文本文件的实例&#xff1a; John Robert Frank Andr…

微软开源基于 Envoy 的服务网格 Open Service Mesh

原文地址&#xff1a;https://techcrunch.com/2020/08/05/microsoft-launches-open-service-mesh/Open Service Mesh&#xff08;OSM&#xff09;是一个轻量级的、可扩展的、云原生的服务网格&#xff0c;它允许用户对高度动态的微服务环境进行统一管理、安全保护&#xff0c;并…

java servlet jsp javabean关系图_Servlet+JSP+JavaBean开发模式(MVC)介绍

好伤心...写登陆注册之前看见一篇很好的博文&#xff0c;没有收藏&#xff0c;然后找不到了。前几天在知乎上看见一个问题&#xff0c;什么时候感觉最无力。前两天一直想回答&#xff1a;尝试过google到的所有solve case&#xff0c;结果bug依然在。今天想回答&#xff1a;明明…

7-28 搜索树判断 (25 分)(思路加详解) just easy!

一&#xff1a;题目 对于二叉搜索树&#xff0c;我们规定任一结点的左子树仅包含严格小于该结点的键值&#xff0c;而其右子树包含大于或等于该结点的键值。如果我们交换每个节点的左子树和右子树&#xff0c;得到的树叫做镜像二叉搜索树。 现在我们给出一个整数键值序列&…

Azure DevOps+Docker+Asp.NET Core 实现CI/CD(一 .简介与创建自己的代理池)

前言本文主要是讲解如何使用Azure DevOpsDocker 来实现持续集成Asp.NET Core项目(当然 也可以是任意项目).打算用三个篇幅来记录完整的全过程觉得有帮助的朋友~可以左上角点个关注,右下角点个推荐CI/CD简介首先,我们先来简单的介绍一下什么是CI/CDCI全拼Continuous Integration…

7-31 笛卡尔树(25分)(题目分析+简单算法+详解+思路)

一&#xff1a;题目 7-31 笛卡尔树 (25 分) 笛卡尔树是一种特殊的二叉树&#xff0c;其结点包含两个关键字K1和K2。首先笛卡尔树是关于K1的二叉搜索树&#xff0c;即结点左子树的所有K1值都比该结点的K1值小&#xff0c;右子树则大。其次所有结点的K2关键字满足优先队列&#…

不仅性能秒杀Hadoop,现在连分布式集群功能也开源了

就在昨天&#xff08;2020年8月3日&#xff09;&#xff0c;涛思数据团队正式宣布&#xff0c;物联网大数据平台TDengine集群版开源。此次开源&#xff0c;我们在GitHub上传了23.9万行源代码&#xff0c;1198个源文件&#xff0c;包含我自己疫情期间写的一万余行C代码&#xff…

7-32 哥尼斯堡的“七桥问题” (25 分)(思路+详解+题目分析)两种做法任选其一

一&#xff1a;题目&#xff1a; 哥尼斯堡是位于普累格河上的一座城市&#xff0c;它包含两个岛屿及连接它们的七座桥&#xff0c;如下图所示。 可否走过这样的七座桥&#xff0c;而且每桥只走过一次&#xff1f;瑞士数学家欧拉(Leonhard Euler&#xff0c;1707—1783)最终解…

一次简单的服务器 cpu 占用率高的快速排查实战

前两天&#xff0c;朋友遇到一个线上 cpu 占用率很高的问题&#xff0c;我们俩一起快速定位并解决了这个问题。在征求朋友同意后&#xff0c;特发此文分享整个过程。本文以对话的形式展开&#xff0c;加上我的内心独白。文中对话与实际对话略有出入。友&#xff1a; 在吗&#…

7-33 地下迷宫探索 (30 分)(思路加详解)

一&#xff1a;题目 7-33 地下迷宫探索 (30 分)地道战是在抗日战争时期&#xff0c;在华北平原上抗日军民利用地道打击日本侵略者的作战方式。地道网是房连房、街连街、村连村的地下工事&#xff0c;如下图所示。 我们在回顾前辈们艰苦卓绝的战争生活的同时&#xff0c;真心钦…

联通定时休眠5G基站 戳破皇帝的新衣

近年来&#xff0c;5G被欧美政客、大公司、媒体连番炒作&#xff0c;在公开舆论上&#xff0c;5G成为了“科技制高点”&#xff0c;成为决定国家命运的“外星科技”&#xff0c;个别明星企业家还声称&#xff0c;“5G改变社会”&#xff0c;“5G应用后美国将成为落后国家”。但…

java中的线程不安全和实例解析

一&#xff1a;引言&#xff08;特指单核&#xff09; 所谓线程不安全&#xff0c;就是在共享数据时&#xff0c;不同的线程在执行时&#xff0c;出现数据的不准确&#xff0c;&#xff08;以模拟抢票和模拟银行取钱为例&#xff09;&#xff0c;那么我们的线程不安全具体指的…