NewLife.Net——网络压测单机1.88亿tps
NewLife.Net压力测试,峰值4.2Gbps,50万pps,消息大小24字节,消息处理速度2266万tps!
共集合20台高配ECS参与测试,主服务器带宽6Gbps、100万pps,16核心64G内存。另外19台共模拟400个用户连接,13*16+6*32=400,每用户发送2000万个消息,服务端收到后原样返回。
tps意义非常重大,就是告诉所有人,.Net下普普通通的Socket封装,甚至没有使用MSDN的Pool,就能得到非常不错的性能!
*感谢楼下提醒,错误计算了速度,算法如下:
每秒流量 = 4.2G / 8 = 537.6M (进出都是4.2Gbps)
包头消耗 = 50万 * 40 = 19M (50万包,ip+tcp头40字节)
处理速度 = (537.6M - 19M) / 24 = 22,657,979 = 2266万
另外每个nc客户端均有速度计算,102万~200万tps之间,共19客户端,与上吻合
由于我的疏忽,只是简单拿4.2G除以24得到1.88亿,也没有汇总各客户端数据,给出了错误数据,非常抱歉!
(有考虑tcp包头,因报文很短必然粘包,按MTU=1500算误差2.7%,所以直接没有算进去)
有些同学比较着急,觉得前面两篇有点小儿科,群友就说,上数字吧!
我们在2017.4.1做了一个极限并发测试,奔着单机100万并发,实际上只得到了84.5万,这次补一个吞吐量的压力测试好了。
老规矩,先上代码:https://github.com/NewLifeX/NewLife.Net
一、测试结果



二、服务端修改
我们对前一篇文章的例程稍微调整一下:
class MyNetSession : NetSession<MyNetServer>
{
/// <summary>客户端连接</summary>
public override void Start()
{
base.Start(); // 欢迎语
var str = String.Format("Welcome to visit {1}! [{0}]\r\n", Remote, Environment.MachineName);
Send(str);
} /// <summary>收到客户端数据</summary>
/// <param name="e"></param>
protected override void OnReceive(ReceivedEventArgs e)
{
//WriteLog("收到:{0}", e.Packet.ToStr()); // 把收到的数据发回去
Send(e.Packet);
}
}
把显示收到数据的那一行给注释了,否则这一行就能玩死千万级测试,更别说亿万级了。
服务主函数的线程数也要从2改为1,关闭第二个向所有客户端定时群发时间的任务。
public MyService()
{
ServiceName = "EchoAgent";
DisplayName = "回声服务";
Description = "这是NewLife.Net的一个回声服务示例!"; // 准备两个工作线程,分别负责输出日志和向客户端发送时间
//ThreadCount = 2;
ThreadCount = ;
Intervals = new[] { , };
}
三、增加客户端压测项目
新建控制台项目Benchmark,并从nuget引用NewLife.Core
入口函数需要分析参数:
static void Main(String[] args)
{
XTrace.UseConsole(); try
{
var cfg = new Config(); // 分解参数
if (args != null && args.Length > ) cfg.Parse(args); // 显示帮助菜单或执行
if (cfg.Address.IsNullOrEmpty())
ShowHelp();
else
Work(cfg);
}
catch (Exception ex)
{
XTrace.WriteException(ex.GetTrue());
} //Console.WriteLine("OK!");
//Console.ReadKey();
}
主函数就是开一定数量的LongTask,然后等待
static void Work(Config cfg)
{
var uri = new NetUri(cfg.Address);
if (cfg.Content.IsNullOrEmpty()) cfg.Content = "学无先后达者为师";
var pk = new Packet(cfg.Content.GetBytes()); Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("NewLife.NC v{0}", AssemblyX.Entry.Version); Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("目标:{0}", uri);
Console.WriteLine("请求:{0:n0}", cfg.Times);
Console.WriteLine("并发:{0:n0}", cfg.Thread);
Console.WriteLine("并发:[{0:n0}] {1}", pk.Count, cfg.Content);
Console.ResetColor();
Console.WriteLine(); var sw = Stopwatch.StartNew(); // 多线程
var ts = new List<Task>();
var total = ;
for (var i = ; i < cfg.Thread; i++)
{
var tsk = Task.Factory.StartNew(() =>
{
try
{
var client = uri.CreateRemote();
client.Open();
for (var k = ; k < cfg.Times; k++)
{
client.Send(pk);
Interlocked.Increment(ref total);
}
}
catch { }
}, TaskCreationOptions.LongRunning);
ts.Add(tsk);
}
Task.WaitAll(ts.ToArray()); sw.Stop(); Console.WriteLine("完成:{0:n0}", total); var ms = sw.Elapsed.TotalMilliseconds;
Console.WriteLine("速度:{0:n0}tps", total * 1000L / ms);
}
四、上线测试
从阿里云分批租用最高配置的竞价实例20台。统一选择华东2(上海)的D区,因为代码压测只能使用内网,公网达不到这个速度。
整个华东2D最高配就是大数据网络增强型,仅剩的7台都拿下,其中一台作为服务端跑EchoAgent,另外再补13台8核的机器,共19台跑nc(Benchmark)。


在8核心机器上(13台),测试命令:
nc -n 20000000 -c 16 tcp://172.19.227.198:1234
在16核心机器上(6台),测试命令
nc -n 20000000 -c 32 tcp://172.19.227.198:1234
五、结论
人有多大胆,地有多大产!
虽然这次的EchoTest只是简单把数据包发回来,没有挂载复杂业务,但是说明了网络库不是瓶颈,只要硬件性能跟得上,它要多强有多强!
e.Packet的设计,实际上实现了ZeroCopy,同时大大减轻了GC负担,后面会有专门文章提到。
网络库NewLife.Net支持.Net Core 2.0,但XAgent不支持,毕竟它是Windows服务。
这次测试在 .Net Framework v4.6.1 上进行。
网络系列文章,是为了一步步介绍X组件网络库 NewLife.Net的设计理念,从2005年开始,活了13年,不管是成功还是失败,都积累了很多的经验。
我是大石头,打1999年起,19年老码农。目前在物流行业从事数据分析架构工作,日常工作都是亿万数据的读写使用。欢迎大家一起C#大数据!
NewLife.Net——网络压测单机1.88亿tps的更多相关文章
- Jmeter之http性能测试实战 非GUI模式压测 NON-GUI模式 结果解析TPS——干货(十一)
性能测试计划 性能测试用例 录制脚本 性能测试结果 性能测试报告 性能测试监控报告 准备工作 从脚本已录制成功之后开始进行压测 安装Jmeter拓展插件 查看 Transactions per Sec ...
- 压测中的QPS与TPS区别
原文来自:https://www.cnblogs.com/fkkk/p/11957566.html QPS(每秒查询率)=并发数/平均响应时间 TPS(每秒处理事务数)=请求数/时间(秒) TPS的过 ...
- RocketMQ性能压测分析(转载)
一 机器部署 1.1 机器组成 1台nameserver 1台broker 异步刷盘 2台producer 2台consumer 1.2 硬件配置 CPU 两颗x86_64cpu,每颗 ...
- RocketMQ性能压测分析(转)
原创文章,转载请注明出处:http://jameswxx.iteye.com/blog/2093785 一 机器部署 1.1 机器组成 1台nameserver 1台broker 异步刷盘 2 ...
- 7. 堪比JMeter的.Net压测工具 - Crank 总结篇 - crank带来了什么
目录 堪比JMeter的.Net压测工具 - Crank 入门篇 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml 堪比JMeter的.Net压测工具 - Crank 进阶篇 ...
- jmeter 压测duobbo接口,施压客户端自己把自己压死了
jmeter 压测duobbo接口,jmeter代码不合理,导致每执行一次请求,会调用一次消耗内存的实例化.导致越压越慢,请求发不出去.这个时候需要考虑修改代码了. 截图中,tps越来越少. 原来初始 ...
- 记一次压测问题定位:connection reset by peer,TCP三次握手后服务端发送RST_网络_c359719435的专栏-CSDN博客 https://blog.csdn.net/c359719435/article/details/80300433
记一次压测问题定位:connection reset by peer,TCP三次握手后服务端发送RST_网络_c359719435的专栏-CSDN博客 https://blog.csdn.net/c3 ...
- CentOS单机安装k8s并部署.NET 6程序 压测 记录
前面部分依照CentOS单机安装k8s并部署.NET 6程序来进行,内存.cpu.centos版本一致,之前222元买的三年8M 2c4g腾讯云轻量服务器,这个教程算是写的很详细的了,基本可以一致执行 ...
- Openfire 集群探究_压测情况
一.(测试时间:20151220 - 下午14:00-17:00) windows环境 第一次测试,运行中发现在eclipse环境下.4w个连接耗尽了约1G的内存. 另外:服务本来可用的,压测客户端强 ...
随机推荐
- Mybatis插件原理分析(二)
在上一篇中Mybatis插件原理分析(一)中我们主要介绍了一下Mybatis插件相关的几个类的源码,并对源码进行了一些解释,接下来我们通过一个简单的插件实现来对Mybatis插件的运行流程进行分析. ...
- React 之props属性
React 里有一个非常常用的模式就是对组件做一层抽象.组件对外公开一个简单的属性(Props)来实现功能,但内部细节可能有非常复杂的实现. 可以使用 JSX 展开属性 来合并现有的 props 和其 ...
- ROS_Kinetic_11 ROS程序基础Eclipse_C++(二)
ROS_Kinetic_11 ROS程序基础Eclipse_C++(二) 编写简单的Service和Client (C++): http://wiki.ros.org/cn/ROS/Tutorials ...
- 批量替换数据库中所有用户数据表中字段数据类型为char和varchar到nvarchar的脚本
解决问题:字段类型为char的总是占用指定字节长度(末尾好多空白符号),varchar数据类型长度一个汉字占2个字节,内容存储为中文的字段个人建议全部使用nvarchar. 操作说明:打开SQL Se ...
- 【翻译】Ext JS 6有什么新东西?
工具包ToolKits 发布 包的命名 Fashion 图表 ItemEdit插件 网格 电子表格 可操作模式Actionable Mode和可访问性 LazyItems插件 屏幕阅读器支持可访问性 ...
- oracle的rownum与having用法 去除重复 在重复情况用rownum
一般来说,大家会用rownum,也就是伪列来指定要显示多条数据, 比如 select linename from aced where rownum<3 但是,大家注意,如果取出来的数据有重复数 ...
- 4.5、Libgdx运行日志管理
(原文:http://www.libgdx.cn/topic/47/4-5-libgdx%E8%BF%90%E8%A1%8C%E6%97%A5%E5%BF%97%E7%AE%A1%E7%90%86) ...
- (NO.00001)iOS游戏SpeedBoy Lite成形记(十三)
游戏特效部分就先这样了,因为毕竟是Lite版本,而且是第一个App,所以咱们把主要精力放在游戏可玩逻辑上吧(虽然已经厚颜无耻的加了不少特效了). 说句题外话:游戏美工是独立开发者不可逾越的鸿沟,是无法 ...
- Java进阶(七)Java加密技术之非对称加密算法RSA
Java加密技术(四)--非对称加密算法RSA 非对称加密算法--RSA 基本概念 非对称加密算法是一种密钥的保密方法. 非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(priv ...
- 《java入门第一季》之面向对象(抽象类其实不抽象)
上一篇(http://blog.csdn.net/qq_32059827/article/details/51334198)对抽象类做了一些描述,这一篇根据两个案例加深一下印象.会觉得抽象类其实不抽象 ...