surging作者出具压测结果

一给  金牌会员 | 2022-8-27 23:47:13 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 796|帖子 796|积分 2388

前言


首先回应下@wen-wen 所贴的压测报告,我也把我和客户压测碰到的问题,和压测结果贴出来,这个结果是由客户提供的。不会有任何的舞弊手脚问题
问题一:Task.Run慎用

首先在最新的社区版本已经把Task.run全部去掉了(包括了kestrel RPC调用服务),当你的程序有比较耗时的业务处理的时候,Task可以提升性能,但是不耗时的时候,也许就不能提高性能,反而成为瓶颈,因为当一批Task.run未执行完,新一批的请求又来了,就会阻塞造成cpu的升高,所以之前在netty 的ServerHandler中使用task.run ,在压测不带业务的服务时候,因为都是纳秒级的响应,所以造成了task的阻塞,执行万次的循环压测,CPU一直在20%左右,后续已经通过netty 的业务线程进行处理,CPU一直稳定在6%左右, 代码如下
  1. if (_logger.IsEnabled(LogLevel.Debug))
  2.                 _logger.LogDebug($"准备启动服务主机,监听地址:{endPoint}。");
  3.             IEventLoopGroup bossGroup = new MultithreadEventLoopGroup(1);
  4.             IEventLoopGroup workerGroup = new MultithreadEventLoopGroup();//Default eventLoopCount is Environment.ProcessorCount * 2
  5.             var bootstrap = new ServerBootstrap();
  6.            
  7.             if (AppConfig.ServerOptions.Libuv)
  8.             {
  9.                 var dispatcher = new DispatcherEventLoopGroup();
  10.                 bossGroup = dispatcher;
  11.                 workerGroup = new WorkerEventLoopGroup(dispatcher);
  12.                 bootstrap.Channel<TcpServerChannel>();
  13.             }
  14.             else
  15.             {
  16.                 bossGroup = new MultithreadEventLoopGroup(1);
  17.                 workerGroup = new MultithreadEventLoopGroup();
  18.                 bootstrap.Channel<TcpServerSocketChannel>();
  19.             }
  20.             var workerGroup1 = new SingleThreadEventLoop();// 声明业务线程
  21.             bootstrap
  22.             .Option(ChannelOption.SoBacklog, AppConfig.ServerOptions.SoBacklog)
  23.             .ChildOption(ChannelOption.Allocator, PooledByteBufferAllocator.Default)
  24.             .Group(bossGroup, workerGroup)
  25.             .ChildHandler(new ActionChannelInitializer<IChannel>(channel =>
  26.             {
  27.                 var pipeline = channel.Pipeline;
  28.                 pipeline.AddLast(new LengthFieldPrepender(4));
  29.                 pipeline.AddLast(new LengthFieldBasedFrameDecoder(int.MaxValue, 0, 4, 0, 4));
  30.                 pipeline.AddLast(workerGroup1, "HandlerAdapter", new TransportMessageChannelHandlerAdapter(_transportMessageDecoder));//添加业务线程处理
  31.                 //添加业务线程处理<br>                pipeline.AddLast(workerGroup1, "ServerHandler", new ServerHandler(async (contenxt, message) =>                           
  32.                 {
  33.                     var sender = new DotNettyServerMessageSender(_transportMessageEncoder, contenxt);
  34.                     await OnReceived(sender, message);
  35.                 },  _logger));
  36.             }));
  37.             try
  38.             {
  39.                 _channel = await bootstrap.BindAsync(endPoint);
  40.                 if (_logger.IsEnabled(LogLevel.Debug))
  41.                     _logger.LogDebug($"服务主机启动成功,监听地址:{endPoint}。");
  42.             }
  43.             catch
  44.             {
  45.                  _logger.LogError($"服务主机启动失败,监听地址:{endPoint}。 ");<br>    }<br>        }<br>
复制代码
 问题二:检查主频,核数

首先客户一开始测试使用的是家庭电脑,他一直压测不上去,说用jmeter怎么2000就timeout了,后面了解到他的电脑是4核,主频1.8,内存32G,后面告诉他你要达到预期就要高频或者多核的干净电脑。
 
[code][/code] 问题三:检查熔断策略

检查MaxConcurrentRequests,ExecutionTimeoutInMilliseconds  等设置

 
客户结果

单表新增数据库, cpu 一直保持在30%,可能因为ingress设置关系只能压测到4000

 
个人测试结果

无业务压测:
用httpkestrel 压测可以达到2w/s,   rpc  可以达到10w/s
rpc 大家都可以测试,  通过社区版本下载, 启用server, 开启多个client 进行压测,有问题可以告诉我
总结

surging 正在往平台化发展, 年底应该会推出社区版雏形, 望大家多多关注。
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

一给

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表