nkv客户端性能调优
此文已由作者张洪箫授权网易云社区发布。
欢迎访问网易云社区,了解更多网易技术产品运营经验。
问题描述
随着考拉业务的增长和规模的扩大,很多的应用都开始重度依赖缓存服务,也就是杭研的nkv。但是在使用过程中,发现服务端压力并不是特别大的情况下,客户端的rt却很高,导致应用在到达一定并发的情况下,服务的质量下降的非常严重,甚至出现不可用的情况。这个在大促阶段尤其严重,所以在杭研性能测试团队(这里特别感谢霞姐和小宝的大力支持)的协助下,在线下进行了压测和问题定位。
问题发现过程
测试使用了dubbo接口调用形式对fee工程进行加压,fee会在被调用后通过nkv客户端访问nkv服务端。
第一阶段
在逐步加压的过程中,发现并发到达150时,rt已经涨到50ms左右,此时使用jstack打印堆栈,发现大量的线程在等待消息的返回。反观此时服务端的情况,基本无压力,故此时定位,瓶颈在客户端。
review客户端代码,客户端调用服务端采用的是netty的异步方式,同步接口会在调用netty发送消息后使用future来获得响应;异步则将future返回给应用,交由应用处理。简单的过了一遍代码,并没有发现什么异常。
因为从哨兵监控上观察应用并没有异常,只是上下文切换的次数稍多,差不多有8w左右,怀疑有可能是因为线程数过多导致上下文切换过于频繁导致,所以将dubbo的线程数从400降低到了200,再次压测,发现在同等并发数下,rt比之前低,在40ms左右。
因为40ms并不能满足要求,而且不过压测机的并发数提高多少,qps最高只能在1500-1700左右徘徊,无法继续加压,所以只能继续找问题。
第二阶段
在之后的阶段卡了很久。后来观察到qps不高,load却比较高,邵峰提出是否是netty的一个bug,即在并发不高的情况下,占用大量的cpu,导致响应较慢,尝试把netty的更换到一个较高的版本,再次尝试,问题依然。
第三阶段
百思不得其解的时候,霞姐偶然在监控堆栈的地方看到有几率出现在一个锁的地方停留,然后回过头仔细看了下那段代码,终于发现了问题。
nkv在调用netty发送消息前会做这两个操作,第一个是将channal和seq的信息放到一个DelayQueue中,然后再将seq和channal的对应放到一个ConcurrentHashMap里
然后再收到响应后,从DelayQueue中删除收到消息对应的信息,再根据seq找到channal,然后唤醒等待的线程。

DelayQueue在这里主要是为了防止在某些异常情况下,导致channal未释放,会有另一个线程定时扫描DelayQueue清除超时对象。
但是在大并发下,由于DelayQueue的删除是上锁后遍历整个列表的,所以收到响应后的清除操作,会将网络回调线程和业务的发送线程阻塞,虽然很快就收到服务端的响应,但是回调线程却无法回调,所以导致整体响应非常慢。
第四阶段
找到原因后,解决方案的选择就比较多,后来选择的方案是将DelayQueue去掉,在调用发送后,将获取future的结果的操作放入try-finally中,释放chnnal的操作放在finally,则同步操作时释放肯定会被执行。异步操作则是在网络线程的回调后清除channal。
修改完成后,再次压测,再qps接近3倍的情况下,平均rt降低到原来的1/4,基本满足了本次调优的目标。
第五阶段
调优是没有止境的,所以再过了一遍代码,发现在调用netty发送后,客户端调用了await来等待网络的回调,

但是因为nkv的rt正常情况下非常低,很多操作都是毫秒内的,但是await的单位是毫秒,这样很有可能导致有些情况下本来需要1.1.毫秒的操作,却变成了2ms。
所以就将await改成了awaitNanos,纳秒级等待。
修改后测试,在使用batch操作时,平均rt降低1.6ms,可能有些人觉得才1.6ms,差别不大,但是在99%响应在10ms内的缓存服务中,降低1.6毫秒的影响已经很大了。
总结
需要好的工具,像霞姐他们的性能测试工具,这样事半功倍
往往优化的点就是备忽略的点,还是得自己review
优化无止境,小的点也会有很大的影响
更多网易技术、产品、运营经验分享请点击。
相关文章:
【推荐】 限时购校验小工具&dubbo异步调用实现限
【推荐】 一个体验好的Windows 任务栏缩略图开发心得
nkv客户端性能调优的更多相关文章
- web前端性能调优
最近2个月一直在做手机端和电视端开发,开发的过程遇到过各种坑.弄到快元旦了,终于把上线了.2个月干下来满满的的辛苦,没有那么忙了自己准备把前端的性能调优总结以下,以方便以后自己再次使用到的时候得于得心 ...
- [网站性能2]Asp.net平台下网站性能调优的实战方案
文章来源:http://www.cnblogs.com/dingjie08/archive/2009/11/10/1599929.html 前言 最近帮朋友运营的平台进行了性能调优,效果还不错, ...
- Asp.net平台下网站性能调优的实战方案(转)
转载地址:http://www.cnblogs.com/chenkai/archive/2009/11/07/1597795.html 前言 最近帮朋友运营的平台进行了性能调优,效果还不错,所以写出来 ...
- JVM内存模型与性能调优
堆内存(Heap) 堆是由Java虚拟机(JVM,下文提到的JVM特指Sun hotspot JVM)用来存放Java类.对象和静态成员的内存空间,Java程序中创建的所有对象都在堆中分配空间,堆只用 ...
- iOS-------应用性能调优的25个建议和技巧
性能对 iOS 应用的开发尤其重要,如果你的应用失去反应或者很慢,失望的用户会把他们的失望写满App Store的评论.然而由于iOS设备的限制,有时搞好性能是一件难事.开发过程中你会有很多需要注意的 ...
- iOS应用性能调优建议
本文来自iOS Tutorial Team 的 Marcelo Fabri,他是Movile的一名 iOS 程序员.这是他的个人网站:http://www.marcelofabri.com/,你还可以 ...
- iOS应用性能调优的25个建议和技巧
本文来自iOS Tutorial Team 的 Marcelo Fabri,他是Movile的一名 iOS 程序员.这是他的个人网站:http://www.marcelofabri.com/,你还可以 ...
- Advacned Puppet: Puppet Master性能调优
本文是Advanced Puppet系列的第一篇:Puppet master性能调优,谈一谈如何优化和提高C/S架构下master端的性能. 故事情节往往惊人地类似:你是一名使用Puppet管理线上业 ...
- 性能调优:理解Set Statistics Time输出
在性能调优:理解Set Statistics IO输出我们讨论了Set Statistics IO,还有如何帮助我们进行性能调优.这篇文章会讨论下Set Statistics Time,它会告诉我们执 ...
随机推荐
- Centos安装SZRZ方便文件传输
方便Centos服务器传输文件, 要用到szrz命令, 具体安装如下: # wget http://freeware.sgi.com/source/rzsz/rzsz-3.48.tar.gz# ta ...
- 手把手编写PHP框架 深入了解MVC运行流程
1 什么是MVC MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller ...
- django admin扩展user表password验证及set_password
一般如果扩展了django user内置表,在admin后台创建新用户的时候密码将会变成明文,故而导致登录不成功.所以我们在admin.py可以通过form自定义进行对password进行操作,可以双 ...
- C++中函数重载
C++中函数重载使用顶层const修饰参数和不使用const修饰参数效果是一样的,如果定义了这样的重载函数会报函数重定义的错误. 追其原因,C++中的函数传递方式有三种,一种是值传递,就是拷贝,一种是 ...
- linux 在后台运行数据库导入导出命令
nohup imp dbusername/password@orcl file=/home/20170928.dmp ignore=y log=/home/oracle/20170928.log fu ...
- ACM学习历程—HDU5423 Rikka with Tree(搜索)
Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, so he ...
- bzoj 1441: Min 裴蜀定理
题目: 给出\(n\)个数\((A_1, ... ,A_n)\)现求一组整数序列\((X_1, ... X_n)\)使得\(S=A_1*X_1+ ...+ A_n*X_n > 0\),且\(S\ ...
- 4445: [Scoi2015]小凸想跑步 半平面交
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=4445 题解: 设点坐标,利用叉积可以解出当p坐标为\((x_p,y_p)\)时,与边i- ...
- 【LeetCode】137. Single Number II
题目: Given an array of integers, every element appears three times except for one. Find that single o ...
- python【事物 】【数据库锁】
1.数据库事物 1. 什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一 ...