首页 新闻 搜索 专区 学院

异步代码性能不升反降

0
悬赏园豆:30 [待解决问题]

我的一个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,这到底是为什么?有关异步本身开销的文章很少,这里面是否有一些阈值?

apodemakeles的主页 apodemakeles | 初学一级 | 园豆:4
提问于:2015-10-11 09:56
< >
分享
所有回答(2)
0

数据库deadlock可能性比较大吧,操作数据库顺序很容易出现

jello chen | 园豆:7096 (大侠五级) | 2015-10-11 10:08
0

你需要先建立基准线,基于相同的硬件:

1、使用空的 rest api 接口的同步、异步版本得到基本性能数据;

2、直连数据库,使用同步和异步版本得到基本的性能数据;

 

通常将 I/O 从同步转换为异步后,吞吐量会增加,CPU 也会增加。

Launcher | 园豆:45045 (高人七级) | 2015-10-12 10:07
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册