xuanye / dotbpe

dotbpe rpc is a lightweight and high performance, easy to learn rpc framework
MIT License
21 stars 8 forks source link

作者有对这个项目做简单的压力测试吗? #10

Closed ZeeLyn closed 5 years ago

ZeeLyn commented 5 years ago

我自己也做了一个类似的项目,也是基于dotnetty实现rpc调用,但是dotnetty是异步回调机制,项目里也是用TaskCompletionSource等待返回消息,但是性能很差,我现在还没头绪,大概原因是:因为线程竞争造成的,我电脑是4核的,默认线程池最小线程数是4个,由于创建新的线程代价很昂贵,线程池做了保护,一秒钟最多创建不超过两个线程,所以并发一上来,就出现拥堵。不知道作者有没有做过类似的测试。下面是我使用jmeter开200个线程测试结果,很不理想 image

xuanye commented 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 在你机器上测试一下

ZeeLyn commented 5 years ago

有尝试修改线程池大小,并没有改善

ZeeLyn commented 5 years ago

另外我看了你的控制台示例,是通过循环调用的,循环不是并发,我是通过jmeter测试并发

xuanye commented 5 years ago

另外我看了你的控制台示例,是通过循环调用的,循环不是并发,我是通过jmeter测试并发

你可以jmeter 调用下greeting这个项目的http接口。 math那个是测试客户端和服务端的

xuanye commented 5 years ago

简单模拟了一下你说的情况,4核cpu 8g内存,客户使用200个线程 调用20w次。。结果如下。服务器cpu还没有跑满

unnamed qq screenshot20190129164901 _20190129164556

ZeeLyn commented 5 years ago

我在我们的测试服务器上运行了MathService,另外我新建了一个web api项目,模拟网关并发调用后端的微服务,web api的代码如下: image jmeter开400的并发,测试并没有开启循环,只做了一次测试,测试结果如下图,比我的效率稍好,但是我觉得用于生产环境还是欠佳 image 如有不妥之处,请指出。

补上服务器配置 image

xuanye commented 5 years ago

第一步 测试性能的时候Console Log 不要添加 第二,我的框架本身有提供gateway服务,你参考Sample中的GreeterHttpService 服务 另外配置额外线程后 ,可以明显提升性能,如下图,你可以和我第一次做对比

项目启动后用 http://ip:5560/api/greeter/hello?name=xuanye

unnamed qq screenshot20190129171928

xuanye commented 5 years ago

你把Console Log去掉再测一次看看把

ZeeLyn commented 5 years ago

我去掉了,结果差不多,有一个问题我不太明白,想请教一下。我对项目里的网关不太理解,我理解的网关是对外提供服务的,比如现在社区比较成熟的Ocelot,后面有很多的微服务,网关通过rpc调用后面的服务来给用户提供服务。我看项目里的GreeterHttpService并没有连接服务器端,所以我不太理解。服务实现部分代码应该是下面这个吧,这个会通过AOP代理接口实现远程调用具体的实现吗?谢谢 ` ///

/// IGreeterService Greet服务 /// [RpcService(101)] public interface IGreeterService:IRpcService { /// /// Say Hello 方法 /// /// /// [RpcMethod(1),Router("/api/greeter/hello")] Task<RpcResult> SayHelloAsync(SayHelloReq req); }

/// <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);
    }
}

`

xuanye commented 5 years ago

你看下我刚刚添加的示例代码MathHttpClient 启动后用http://localhost:5561/api/math/sum?a=10&b=1000

xuanye commented 5 years ago

client 可以自动查找服务在本地还是远端,默认查找本地,如果配置了远端则调用远端服务。

xuanye commented 5 years ago

unnamed qq screenshot20190129185002 我测试了 http服务 和rpc服务分离的情况。 代码就是MathHttpClient