抢购性能问题排查之三——Redis连接池无法获取连接

1. 问题的现象

此前抢购时段,系统响应速度很慢。起初查了一下数据库的慢查询,做了很多SQL优化。

渐渐的,当数据库的慢查询降低了一大批之后,主库0.3s的阀值基本都没剩多少。请求响应的平均时段已经降低到500ms。
突然,新的现象发生了,Jedis连接池开始报错。

所有的错误都是这一个:

Could not get a resource from the pool

2. 初步尝试

仔细看了一下源码,就是连接池拿不到连接。配置已经写了最大50个线程,最大等待50ms。

起初把连接数增加到100个,看了一下有缓和,报错少了一点,但是总体响应时间没什么提升。
后来怀疑是不是TCP建立连接导致瞬时网络请求过多,然后把最大等待时间改到100ms,最大连接数改到50个,报错数量没什么变化,总体响应时间略微延长。

整体感觉好像跟连接池没啥关系,就重新去分析整体链路。

2. 问题的排查

2.1 系统的链路

nginx -> tomcat --连接池--> twemproxy --单线程--> redis

2.2 定位瓶颈

仔细分析了一下整个系统的链路,观察链路上每台机器的表现。

tomcat应用:CPU偏高,峰值可以去到80%多,均值也在40%
twemproxy:机器资源使用比较正常
redis:机器资源很低,独占物理机

起初怀疑是不是tomcat所在机器的CPU问题导致,但是通过机器调整,发现有的机器原来表现好的,加入了更高配的机器,表现会变差。总体没有改观,表现更像是一个公共资源的竞争,谁能抢到谁就快

2.3 可能存在的问题

起初怀疑有两种可能:

  1. 公用宿主机的资源抢占
    a. 符合的现象:在比较空闲的宿主机上,表现会比机器资源少的VM要好
    b. 不符合的现象:为什么机器配置那么好,还是会报错
  2. 公共网络带宽的抢占
    a. 符合的现象:一个远程机房比本地机房错误数量多很多
    b. 不符合的现象:起初两边差别很明显,后来两边问题出现数量又差不多了(中间出现了一次twemproxy ip的飘移,变到另外一个代理上去了,可能是这个引起的,未深究,但最后的现象排除了网络问题的可能)

所以,我初步判断可能问题在twemproxy上,它也是公共资源。

3.4 twemproxy的分析

3.4.1 验证假设

直接先在上面用tcprstat进行抓包,看看实际tcp的耗时

timestamp   count   max min avg med stddev  95_max  95_avg  95_std  99_max  99_avg  99_std
1553220001  13183   268863  75  3101    510 10735   13837   1187    2256    54200   2325    6474
1553220002  13472   820293  650 17587   14331   33983   47133   12710   6322    114430  14874   12630
1553220003  29429   715253  376 4797    2874    9475    12935   3681    2933    21747   4174    3777
1553220004  27724   799628  181 7645    6302    10045   17490   6759    4598    23827   7266    5148
1553220005  27296   424576  151 4586    2652    6692    17075   3693    3300    20673   4294    4367

刚好与我们看到的现象完全一致,每次都是第2秒开始到第3秒集中报错,这个响应延迟也刚好出现在那一秒。

3.4.2 问题分析

redis是一个对网卡敏感的应用,查了一下是万兆网卡,整机流量并不高。

然后,为了最大程度减少网络和网卡的干扰,直接把twemproxy和redis部署在同一台物理机上。结果一测性能飙升,整体表现极其完美。

进一步追查,运维同学告知系统采用的CentOS 6.8版本,其网卡驱动采用的是单队列模式,在极端高并发的情况下,性能会急剧下降。将系统升级至CentOS 7.3版本,采用多队列模式可以解决问题。

3.4.3 插曲

中间也怀疑过,是不是twemproxy的配置不合理,毕竟只配置了一个线程。后来找到作者对这个解释,结合一些性能分析。

如果配置了多线程会带来一个问题,如果使用了pipeline,到twemproxy可能就会被分到不同的线程去执行,因而导致执行并非是按预期的,所以结果可能会出错。

但是,twemproxy自己为了提升的性能,做了两个重要的工作,一个是采用了“zero copy”技术,另一个是把命令也打包成一个pipeline批量执行。因此,他的性能损耗有人测试也就大约10%。

4 后记

这个问题处理完,抢标的性能问题告一段落。峰值响应速度从原来最坏去到2s降低到不足100ms,而且从zabbix监控上都快看不出来抢购的峰值了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容