java 在高并发情况下调用 redis 返回数据很慢,一个命令执行 200+ms, 低并发正常情况下 10+ms ,有遇到过吗? 主要耗时就在 JedisPool.getResource()这个操作上
1
6IbA2bj5ip3tK49j 2016-09-19 16:25:08 +08:00 1
我猜一下,应该是有连接池的。
高并发下池满了,获取连接需要等待。时间就耗在这儿了。可以调一下最大连接数量试试。 |
3
cvv 2016-09-19 21:18:59 +08:00 1
WhenExhaustedAction 怎么设的
|
4
rrfeng 2016-09-19 21:27:53 +08:00 1
JedisPool.getResource()
新建连接可能达到了某种隐形的限制。例如 socket 数量, fd , nofile 等等所以 poolsize 虽然没有上限,但是达到一定量之后自然就会资源不足。 先看看 pool 有多少连接,或者系统里 ss/netstat 看下程序一共有多少个 redis 连接。 |
5
fxmqs 2016-09-19 21:40:10 +08:00 1
@x537196 确实碰到过,个别请求 50 多 ms ,但大部分没问题,当时统计大概在 2%左右,因为不影响业务,所以没跟踪了。
|
6
9hills 2016-09-19 22:05:03 +08:00 via iPhone 1
做压测,然后观察各种指标。只有这个信息不太好判断。
|
7
zts1993 2016-09-19 22:17:55 +08:00 3
今天在 jedis 上发 issue 的是你吧。。。
我看到了。 JedisPool.getResource() 是因为你设置了 testOnBorrow 。这个会发一个 ping 然后 ping 卡住了。 卡住的原因还是 redis 阻塞了,比如大量 smemebers 或者 lrange 这样。 具体可以发一下 redis 的 slowlog 。看一下卡顿和长时间操作是否一致。 |
8
yonka 2016-09-20 09:55:36 +08:00 1
应该不是连接耗尽吧? redis 一个正常请求占用连接的时间应该在个位 ms ,你的高并发得有多少啊?
|
11
x537196 OP @zts1993 redis 是使用的阿里云的实例,只能找阿里的人看日志了,现在已经把列表类的 key 转到另一个实例,单键值的 key 已经转移到 memcached 了,现在只能各种原因排查了
|
13
x537196 OP @yonka redis 是没有问题的,就是 jedis 这边,可能是有哪个操作阻塞了,或者网络原因,导致了这个情况,现在排查中
|
14
xchange 2016-09-20 11:03:30 +08:00 1
@x537196 说不定是阿里云的问题,前天晚上我们的 redis cluster 挂了,然后昨天另外的 redis 实例部分 value 长度比较大的 key 取不出来……
|
15
Infernalzero 2016-09-20 12:11:12 +08:00 1
你都发现时网卡跑满那原因都很明显了,序列化后存储体积过大,网络拥塞了所以慢,压缩下再存吧
|
16
x537196 OP @Infernalzero 网卡跑满是大部分是其他业务的流量, redis 的很少
|
17
iminto 2016-10-03 18:06:06 +08:00
jedis 本身性能问题
|