tornado-ssy commented on PR #1457:
URL:
https://github.com/apache/servicecomb-service-center/pull/1457#issuecomment-1997190336
1、 背景
新底座要求能够支撑2w实例的servicecomb引擎的发放的同时,也对其性能做出了要求。要求注册实例接口tps达到2000/s,实际压力测试表现:
可以看到实例压力测试结果是注册实例接口的tps为1500/s,小于2000/s
2、 在压测该接口时,拉取cpu profile文件,分析火焰图:
可以看到,cpu绝大部分时间消耗在getprefixkey这个方法上。
查看代码:
实例数是通过树形结构来维护的,可以看到查询实例数是通过递归来进行查询的,
当实例数量变多后,递归耗时自然相应增加,存在性能瓶颈。
3、 优化
既然每次查询实例数都要递归查一遍,为什么不能使用一个变量来维护当前实例数,这样就把每次注册实例查询递归的操作分摊到每次注册实例或者实例下线里面去,每次注册实例,对实例进行增加,实例下线,对实例数变量进行减少。及addprefixkey和
Deleteprefixkey这两个方法中(这两个方法是listwatch机制触发的,进一步减少了分摊成本)
由于全局实例(例如sc自己的实例)的数量是比较少(一般为个位数)的,且为全局实例单独维护个变量成本较大,所以查询全局实例数依然采用了递归方式。
4、 代码
此处代码有很多地方用到,是通过chche.name来区分的,当查询实例时,name为INSTANCE,因为此次仅优化注册实例接口性能,且出于控制影响范围的考虑,所以代码里写了chche.name为INSTANCE的过滤条件
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]