此文已由作者张洪箫授权网易云社区发布。
欢迎访问网易云社区,了解更多网易技术产品运营经验。
问题描述
随着考拉业务的增长和规模的扩大,很多的应用都开始重度依赖缓存服务,也就是杭研的nkv。但是在使用过程中,发现服务端压力并不是特别大的情况下,客户端的rt却很高,导致应用在到达一定并发的情况下,服务的质量下降的非常严重,甚至出现不可用的情况。这个在大促阶段尤其严重,所以在杭研性能测试团队(这里特别感谢霞姐和小宝的大力支持)的协助下,在线下进行了压测和问题定位。
问题发现过程
测试使用了dubbo接口调用形式对fee工程进行加压,fee会在被调用后通过nkv客户端访问nkv服务端。
第一阶段
在逐步加压的过程中,发现并发到达150时,rt已经涨到50ms左右,此时使用jstack打印堆栈,发现大量的线程在等待消息的返回。反观此时服务端的情况,基本无压力,故此时定位,瓶颈在客户端。 review客户端代码,客户端调用服务端采用的是netty的异步方式,同步接口会在调用netty发送消息后使用future来获得响应;异步则将future返回给应用,交由应用处理。简单的过了一遍代码,并没有发现什么异常。 因为从哨兵监控上观察应用并没有异常,只是上下文切换的次数稍多,差不多有8w左右,怀疑有可能是因为线程数过多导致上下文切换过于频繁导致,所以将dubbo的线程数从400降低到了200,再次压测,发现在同等并发数下,rt比之前低&#x