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/nnhy/NewLife.Net.Tests

一、测试结果

二、服务端修改

我们对前一篇文章的例程稍微调整一下:

 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 = 1;Intervals = new[] { 1, 5 };
}

三、增加客户端压测项目

新建控制台项目Benchmark,并从nuget引用NewLife.Core

入口函数需要分析参数:

static void Main(String[] args)
{XTrace.UseConsole();    try{        var cfg = new Config();        // 分解参数if (args != null && args.Length > 0) cfg.Parse(args);        // 显示帮助菜单或执行if (cfg.Address.IsNullOrEmpty())ShowHelp();        elseWork(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 = 0;    for (var i = 0; i < cfg.Thread; i++){        var tsk = Task.Factory.StartNew(() =>{            try{                var client = uri.CreateRemote();client.Open();                for (var k = 0; 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——网络压测单机2266万tps相关推荐

  1. 开源网络压测工具dperf登上了github C语言趋势榜

    dperf上了github C语言趋势榜.向支持dperf的朋友们说声谢谢. dperf是目前世界性能最高开源网络压力测试仪.性能可以达到100Gbps,每秒1千万TCP新建连接,几十亿TCP并发连接 ...

  2. 信雅纳|2.4TbE网络压测平台,基于400G PAM4的7速网络测试解决方案

    典型应用场景 Layer0:PRBS BERT: Layer1:针对PAM4编码信号的FEC压力测试,Pre/Post-FEC BERT,误码水平: Layer23:针对MAC/IP Ethernet ...

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

    目标 对网络库NewLife.Net进行单机百万级长连接测试,并持续收发数据,检测网络库稳定性. [2020年8月1日晚上22点] 先上源码:https://github.com/NewLifeX/N ...

  4. ZLJ卖场-全链路压测演进

    作者|庄锦弟 背景 原ZLJ卖场的压测流程,是依托于阿里云PTS工具,团队自身缺乏性能测试能力自建,缺少性能分析和数据沉淀,测试场景单一,只有单接口和多接口压测,缺少场景和链路压测,不能相对合理的评估 ...

  5. RocketMQ压测报告书

    RocketMQ压测报告书 公司需要压测RocketMq,这里给出个人的压测结果.因为机器不足的原因,这里只能做基准测试.不能做容量测试.稳定性和异常测试. 1. 部署结构 1.1 机器组成 2台机器 ...

  6. 干货 | 应用性能提升 70%,探究 mPaaS 全链路压测的实现原理和实施路径

    简介:全链路压测方案下,非加密场景下至少有 70% 的性能提升,加密场景下 10%的性能提升,并在 MGS 扩容完成后可实现大幅的性能提升,调优的结果远超预期. 业务背景 随着移动开发行业的步入存量时 ...

  7. RocketMQ性能压测分析(转载)

    一   机器部署 1.1  机器组成 1台nameserver 1台broker  异步刷盘 2台producer 2台consumer 1.2  硬件配置 CPU  两颗x86_64cpu,每颗cp ...

  8. 技术干货 | 应用性能提升 70%,探究 mPaaS 全链路压测的实现原理和实施路径

    简介: 全链路压测方案下,非加密场景下至少有 70% 的性能提升,加密场景下 10%的性能提升,并在 MGS 扩容完成后可实现大幅的性能提升,调优的结果远超预期. 业务背景 随着移动开发行业的步入存量 ...

  9. 互联网广告请求链路_生产环境的全链路压测应该怎么做?答案都在这里了

    "双11前最后一次全链路压测,所有技术.系统.安全策略与应急预案被一一演练.流量峰值,一秒内有几千万次请求,这意味着一秒会产生数百万次交易."这是2018年阿里双十一前夕战况.随着 ...

最新文章

  1. QT的QScriptEngineDebugger类的使用
  2. android cpu hotplug,[MTK] [CPU DVFS/Hotplug]运行时,把CPU固定在特定频率/特定核数的办法...
  3. .Net Discovery 系列之二--string从入门到精通(下)
  4. html 01前沿-web介绍
  5. 在asp.net中调用process.start执行程序
  6. Dos批处理编程常用命令
  7. sqlmap源码阅读_listTamperingFunctions和_setTamperingFunctions
  8. C++各个算数类型占用的字节数
  9. linux查看服务器温度指令,linux查看服务器温度
  10. linux查进程内存问题,关于linux 查看服务进程内存,cpu,内存占用的一些基础命令...
  11. Javascript基础之-强制类型转换(三)
  12. 深度学习中的“卷积”与数学中的“卷积”有何不同
  13. C++_运算符重载 再思考
  14. 小明开了一家糖果店、把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖 小朋友来买糖的时候,他就用两种包装来组合,当然有些糖果数目是无法组合出来的,比如要买10颗糖 在这种包装情况下,最大不能买到
  15. java ee 设计模式_Java EE 设计模式解析与应用_源雷技术空间
  16. workflow-工作流
  17. java新闻网站项目描述_基于jsp的新闻网站-JavaEE实现新闻网站 - java项目源码
  18. 重新整理一下Handler原理(温故而知新,可以为师矣)
  19. 从零开始搭建Salt Web之初探salt-api
  20. Qt QLineEdit 信号函数总结

热门文章

  1. 保险箱模拟JAVA_保险箱模拟器
  2. Linux笔记(六)——权限的基本介绍,修改权限,修改文件/目录的所有者及所在组
  3. 把NT“赶尽杀绝”攻击NT的一些技术(转)
  4. 以视频搜视频?智能视频检索或将诞生新曙光
  5. https接入我们国标流媒体服务器视频无法播放问题解决
  6. 如何创建自己的小程序?
  7. 全球与中国织物保护喷雾市场现状及未来发展趋势
  8. maskrcnn-benchmark安装记录
  9. 消防应急指挥三维地理信息平台
  10. 启用tcp_wrappers防火墙