redisson 大量ping操作,导致 tps过高
大家好,我是烤鴨:
????這個(gè)問(wèn)題有點(diǎn)奇怪,新服務(wù)上線,redis tps居高不下,還都是ping命令。
環(huán)境:
服務(wù) : 280臺(tái),redis集群:12主24從
問(wèn)題
由于服務(wù)剛上線,還沒(méi)有訪問(wèn),發(fā)現(xiàn)ping命令的qps 7K,就很納悶。運(yùn)維幫忙看了下,確認(rèn)這些命令的發(fā)起ip是業(yè)務(wù)服務(wù)。
問(wèn)題排查
項(xiàng)目中用到了 lettuce和redisson,在測(cè)試環(huán)境測(cè)試,嘗試把redisson去掉后,沒(méi)有大量ping了。
加上之后,又有了,頻率大概是 每分鐘 26次。
看下源碼
跟了源碼發(fā)現(xiàn)是 PingConnectionHandler.sendPing 發(fā)起的ping操作。
如果觸發(fā)了 channelActive 就會(huì)定時(shí)執(zhí)行ping,檢測(cè)channel 是否還保持連接。
protected void sendPing(final ChannelHandlerContext ctx) {final RedisConnection connection = RedisConnection.getFrom(ctx.channel());final RFuture<String> future = connection.async(StringCodec.INSTANCE, RedisCommands.PING);config.getTimer().newTimeout(new TimerTask() {@Overridepublic void run(Timeout timeout) throws Exception {CommandData<?, ?> commandData = connection.getCurrentCommand();if ((commandData == null || !commandData.isBlockingCommand()) && (future.cancel(false) || !future.isSuccess())) {ctx.channel().close();log.debug("channel: {} closed due to PING response timeout set in {} ms", ctx.channel(), config.getPingConnectionInterval());} else {sendPing(ctx);}}// 決定ping的頻率,為0表示不再ping了,默認(rèn)是0}, config.getPingConnectionInterval(), TimeUnit.MILLISECONDS); }大部分人都不會(huì)有這個(gè)問(wèn)題,因?yàn)?redisson默認(rèn)的 pingConnectionInterval 就是0…
主要是寫(xiě)公共組件那哥們把這個(gè)值默認(rèn)寫(xiě)成了60s…
結(jié)論
這個(gè)值改了之后就沒(méi)有這個(gè)問(wèn)題了。不過(guò)ping tps: 7k 確實(shí)有點(diǎn)詭異。
這個(gè)7k 只是部分client發(fā)起的,再平均到redis 實(shí)例,每個(gè)實(shí)例150 tps,也還可以接受吧。
最終發(fā)現(xiàn)是發(fā)現(xiàn)不同的grafana統(tǒng)計(jì)數(shù)據(jù)有差異,估計(jì)150 tps差不多。
總結(jié)
以上是生活随笔為你收集整理的redisson 大量ping操作,导致 tps过高的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 1-5Tomcat 目录结构 和 web
- 下一篇: java json.stringify_