我的一个rest api接口为app提供登录服务,中间做了三次数据库访问,还调用了一次其他http服务的。这是四次耗时的网络IO请求,除此之外没有任何耗时的操作。
rest api服务host在IIS8下
这四次IO请求逻辑上有顺序性,没办法改写成并发。
使用框架是 MVC4/WebAPI/EF6/HttpClient
压力测试发现这个接口的性能不高,瓶颈在CPU。考虑可能是IO阻塞影响的,测试的机器本身性能又不高,所以将HTTP服务调用改成非阻塞异步的(使用async await关键字,并且将webapi的controller改成async的),发现QPS提升,明显但不显著。
然后我把其他三个数据库访问也改成async的,没想到性能不升反降,CPU一样会顶满,甚至在压力小的时候还不如全部同步的代码的性能
请问哪位有相关经验这种问题的原因在哪?我翻看了很久自己写的代码也没发现有问题,检测其他诸如内存指标也没法泄露问题,压力测试中失败率也几乎不存在,应该没出现deadlock,这到底是为什么?有关异步本身开销的文章很少,这里面是否有一些阈值?
数据库deadlock可能性比较大吧,操作数据库顺序很容易出现
你需要先建立基准线,基于相同的硬件:
1、使用空的 rest api 接口的同步、异步版本得到基本性能数据;
2、直连数据库,使用同步和异步版本得到基本的性能数据;
通常将 I/O 从同步转换为异步后,吞吐量会增加,CPU 也会增加。