Closed ZeeLyn closed 5 years ago
第一步 在控制台程序中 项目中添加最小线程数的设定。 先设置个100试试。性能是否有改善。task的机制本身是不占用线程的。
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.1</TargetFramework>
<RuntimeIdentifiers>win10-x64;centos.7-x64</RuntimeIdentifiers>
<ThreadPoolMinThreads>100</ThreadPoolMinThreads>
<ThreadPoolMaxThreads>100</ThreadPoolMaxThreads>
</PropertyGroup>
这个项目的第一个版本做过简单的测试,并未特别的性能问题。现在代码库中的版本我正在做重构,还没测试,你可以试试sample中的greetingservice 在你机器上测试一下
有尝试修改线程池大小,并没有改善
另外我看了你的控制台示例,是通过循环调用的,循环不是并发,我是通过jmeter测试并发
另外我看了你的控制台示例,是通过循环调用的,循环不是并发,我是通过jmeter测试并发
你可以jmeter 调用下greeting这个项目的http接口。 math那个是测试客户端和服务端的
简单模拟了一下你说的情况,4核cpu 8g内存,客户使用200个线程 调用20w次。。结果如下。服务器cpu还没有跑满
我在我们的测试服务器上运行了MathService,另外我新建了一个web api项目,模拟网关并发调用后端的微服务,web api的代码如下: jmeter开400的并发,测试并没有开启循环,只做了一次测试,测试结果如下图,比我的效率稍好,但是我觉得用于生产环境还是欠佳 如有不妥之处,请指出。
补上服务器配置
第一步 测试性能的时候Console Log 不要添加 第二,我的框架本身有提供gateway服务,你参考Sample中的GreeterHttpService 服务 另外配置额外线程后 ,可以明显提升性能,如下图,你可以和我第一次做对比
你把Console Log去掉再测一次看看把
我去掉了,结果差不多,有一个问题我不太明白,想请教一下。我对项目里的网关不太理解,我理解的网关是对外提供服务的,比如现在社区比较成熟的Ocelot,后面有很多的微服务,网关通过rpc调用后面的服务来给用户提供服务。我看项目里的GreeterHttpService并没有连接服务器端,所以我不太理解。服务实现部分代码应该是下面这个吧,这个会通过AOP代理接口实现远程调用具体的实现吗?谢谢
`
///
/// <inheritdoc />
public class GreeterService : BaseService<IGreeterService>, IGreeterService
{
public Task<RpcResult<SayHelloRes>> SayHelloAsync(SayHelloReq req)
{
var result = new RpcResult<SayHelloRes>
{
Data = new SayHelloRes {Greeting = $"Hello {req.Name},{req.Id}!"}
};
return Task.FromResult(result);
}
}
`
你看下我刚刚添加的示例代码MathHttpClient 启动后用http://localhost:5561/api/math/sum?a=10&b=1000
client 可以自动查找服务在本地还是远端,默认查找本地,如果配置了远端则调用远端服务。
我测试了 http服务 和rpc服务分离的情况。 代码就是MathHttpClient
我自己也做了一个类似的项目,也是基于dotnetty实现rpc调用,但是dotnetty是异步回调机制,项目里也是用TaskCompletionSource等待返回消息,但是性能很差,我现在还没头绪,大概原因是:因为线程竞争造成的,我电脑是4核的,默认线程池最小线程数是4个,由于创建新的线程代价很昂贵,线程池做了保护,一秒钟最多创建不超过两个线程,所以并发一上来,就出现拥堵。不知道作者有没有做过类似的测试。下面是我使用jmeter开200个线程测试结果,很不理想