? 优质资源分享 ?
学习路线指引(点击解锁) | 知识定位 | 人群定位 |
---|---|---|
? Python实战微信订餐小程序 ? | 进阶级 | 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 |
?Python量化交易实战? | 入门级 | 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 |
前言
首先回应下@wen-wen 所贴的压测报告,我也把我和客户压测碰到的问题,和压测结果贴出来,这个结果是由客户提供的。不会有任何的舞弊手脚问题
问题一:Task.Run慎用
首先在最新的社区版本已经把Task.run全部去掉了(包括了kestrel RPC调用服务),当你的程序有比较耗时的业务处理的时候,Task可以提升性能,但是不耗时的时候,也许就不能提高性能,反而成为瓶颈,因为当一批Task.run未执行完,新一批的请求又来了,就会阻塞造成cpu的升高,所以之前在netty 的ServerHandler中使用task.run ,在压测不带业务的服务时候,因为都是纳秒级的响应,所以造成了task的阻塞,执行万次的循环压测,CPU一直在20%左右,后续已经通过netty 的业务线程进行处理,CPU一直稳定在6%左右, 代码如下
| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546 | if
(_logger.IsEnabled(LogLevel.Debug))
_logger.LogDebug($
"准备启动服务主机,监听地址:{endPoint}。"
);
IEventLoopGroup bossGroup =
new
MultithreadEventLoopGroup(1);
IEventLoopGroup workerGroup =
new
MultithreadEventLoopGroup();
//Default eventLoopCount is Environment.ProcessorCount * 2
var
bootstrap =
new
ServerBootstrap();
if
(AppConfig.ServerOptions.Libuv)
{
var
dispatcher =
new
DispatcherEventLoopGroup();
bossGroup = dispatcher;
workerGroup =
new
WorkerEventLoopGroup(dispatcher);
bootstrap.Channel();
}
else
{
bossGroup =
new
MultithreadEventLoopGroup(1);
workerGroup =
new
MultithreadEventLoopGroup();
bootstrap.Channel();
}
var
workerGroup1 =
new
SingleThreadEventLoop();
// 声明业务线程
bootstrap
.Option(ChannelOption.SoBacklog, AppConfig.ServerOptions.SoBacklog)
.ChildOption(ChannelOption.Allocator, PooledByteBufferAllocator.Default)
.Group(bossGroup, workerGroup)
.ChildHandler(
new
ActionChannelInitializer(channel =>
{
var
pipeline = channel.Pipeline;
pipeline.AddLast(
new
LengthFieldPrepender(4));
pipeline.AddLast(
new
LengthFieldBasedFrameDecoder(
int
.MaxValue, 0, 4, 0, 4));
pipeline.AddLast(workerGroup1,
"HandlerAdapter"
,
new
TransportMessageChannelHandlerAdapter(_transportMessageDecoder));
//添加业务线程处理
//添加业务线程处理 pipeline.AddLast(workerGroup1, "ServerHandler", new ServerHandler(async (contenxt, message) =>
{
var
sender =
new
DotNettyServerMessageSender(_transportMessageEncoder, contenxt);
await OnReceived(sender, message);
}, _logger));
}));
try
{
_channel = await bootstrap.BindAsync(endPoint);
if
(_logger.IsEnabled(LogLevel.Debug))
_logger.LogDebug($
"服务主机启动成功,监听地址:{endPoint}。"
);
}
catch
{
_logger.LogError($
"服务主机启动失败,监听地址:{endPoint}。 "
); } }
|
问题二:检查主频,核数
首先客户一开始测试使用的是家庭电脑,他一直压测不上去,说用jmeter怎么2000就timeout了,后面了解到他的电脑是4核,主频1.8,内存32G,后面告诉他你要达到预期就要高频或者多核的干净电脑。
| 1 | |
问题三:检查熔断策略
检查MaxConcurrentRequests,ExecutionTimeoutInMilliseconds 等设置
客户结果
单表新增数据库, cpu 一直保持在30%,可能因为ingress设置关系只能压测到4000
个人测试结果
无业务压测:
用httpkestrel 压测可以达到2w/s, rpc 可以达到10w/s
rpc 大家都可以测试, 通过社区版本下载, 启用server, 开启多个client 进行压测,有问题可以告诉我
总结
surging 正在往平台化发展, 年底应该会推出社区版雏形, 望大家多多关注。
转载请注明:xuhss » surging作者出具压测结果