JedisConnectionException: java.net.SocketException: Broken pipe (Write failed) 问题排查
问题描述
笔者有2个应用会不定时请求redis,其中一个应用大约每分钟请求一次,可以正常请求,但是另一个大约每小时请求一次的应用,经常出现Broken pipe (Write failed)
报错,具体报错信息如下:
redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketException: Broken pipe (Write failed)
at redis.clients.jedis.Connection.flush(Connection.java:282)
at redis.clients.jedis.Connection.getBinaryMultiBulkReply(Connection.java:222)
at redis.clients.jedis.Jedis.hgetAll(Jedis.java:780)
...
Caused by: java.net.SocketException: Broken pipe (Write failed)
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:111)
at java.net.SocketOutputStream.write(SocketOutputStream.java:155)
at redis.clients.util.RedisOutputStream.flushBuffer(RedisOutputStream.java:31)
at redis.clients.util.RedisOutputStream.flush(RedisOutputStream.java:213)
at redis.clients.jedis.Connection.flush(Connection.java:279)
... 26 more
问题定位
定位到redis服务端配置了3600秒的超时时间,即如果客户端连接超过3600秒空闲,那么就会被redis服务端主动清理掉。笔者大约每小时请求一次redis的应用,若请求时间间隔超过1小时,会被redis服务端认为连接是空闲的,然后把连接清理掉,此时客户端在去请求redis,就会出现报错: Broken pipe (Write failed)
。
解决方案
笔者首先尝试调大客户端socketTimout的超时时间,让客户端socketTimout的时间超过3600秒,如:7200秒。调整后发现,大约每小时请求一次redis的应用,仍然会出现 Broken pipe (Write failed)
报错。由此可见,当客户端和服务端都包含超时的配置时,redis会以服务端为准。
既然调整客户端的超时配置没有效果,服务端仍然会清理空闲的连接。那么客户端是否可以把服务端清理的连接,主动关闭掉呢?然后在需要时在重建连接。按照这个思路,笔者在每次请求redis前,会先执行ping操作。若ping成功了,说明socket连接还没被清理,可以直接请求redis;若ping 不成功,那么会抛出异常,捕获异常后在关闭客户端连接,后面在执行请求redis的命令时,会重新建立socket连接。以下是捕获异常后关闭连接的相关代码。
try {
String result = jedis.ping();
LOGGER.debug("ping redis: {}", result);
} catch (Exception e){
LOGGER.warn("ping failed, close jedis and reconnect, {}", e.getMessage());
try {
jedis.close();
LOGGER.info("jedis closed");
} catch (Exception e1){
LOGGER.warn("close jedis failed, {}", e1.getMessage());
}
}
通过上述方案,客户端空闲超过1小时后,向redis请求会抛出异常 Broken pipe (Write failed)
,程序捕获异常后关闭客户端连接,然后客户端重建连接,在执行请求就恢复正常了。
参考资料
JedisConnectionException: java.net.SocketException: Broken pipe (Write failed) 问题排查的更多相关文章
- redis报错:java.net.SocketException: Broken pipe (Write failed); nested exception is redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketException: Broken pipe (Write failed)
最近写了一个服务通过springboot构建,里面使用了redis作为缓存,发布到服务器运行成功,但是有时候会报redis的错误:org.springframework.data.redis.Redi ...
- Caused by: java.net.SocketException: Broken pipe
异常信息 时间:2017-03-24 17:22:16,719 - 级别:[ WARN] - 消息: [other] The web application [ROOT] appears to hav ...
- java.net.SocketException: Broken pipe 异常可能的原因
org.apache.catalina.connector.ClientAbortException: java.net.SocketException: Broken pipe at org.apa ...
- java.net.SocketException: Broken pipe
java.net.SocketException: Broken pipe 生产上遇到一个问题,socket发生Broken pipe错误,如下 这个问题跟踪了好几个月,始终没有模拟出为什么会发生Br ...
- Jedis Unexpected end of stream & java.net.SocketException: Broken pipe问题解决思路
笔者一直维护的稳定基础服务测试环境不稳定了,这能忍!盘他,虽然不一定能完全盘的了. 背景: hrexternal 基础服务对外提供公司员工获取的多个接口,很多接口访问频率比较高,加了缓存,使用的是re ...
- solr报错 ERROR SolrDispatchFilter null:ClientAbortException: java.net.SocketException: Broken pipe 原因是nginx截断了请求
[root@localhost nginx]# lltotal 36drwx------. 2 www root 4096 Aug 13 13:25 client_body_tempdrwxr-xr- ...
- jedis异常Broken pipe (Write failed)
异常:java.net.SocketException: Broken pipe (Write failed); nested exception is redis.clients.jedis.exc ...
- java.io.IOException 断开的管道 解决方法 ClientAbortException: java.io.IOException: Broken pipe
今天公司技术支持的童鞋报告一个客户的服务不工作了,紧急求助,于是远程登陆上服务器排查问题. 查看采集数据的tomcat日志,习惯性的先翻到日志的最后去查看有没有异常的打印,果然发现了好几种异常信息,但 ...
- 线上问题!----------org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe
1.问题出现 昨晚项目在上线的时候因为推广的原因,新增的大量请求.在八点的时候. org.apache.catalina.connector.ClientAbortException: java.io ...
随机推荐
- Kubernetes Job Controller 原理和源码分析(三)
概述Job controller 的启动processNextWorkItem()核心调谐逻辑入口 - syncJob()Pod 数量管理 - manageJob()小结 概述 源码版本:kubern ...
- Bean Validator
Bean Validator 关于Jakarta EE 2018年03月, Oracle 决定把 JavaEE 移交给开源组织 Eclipse 基金会,并且不再使用Java EE这个名称. 因此jav ...
- 论文阅读 Real-Time Streaming Graph Embedding Through Local Actions 11
9 Real-Time Streaming Graph Embedding Through Local Actions 11 link:https://scholar.google.com.sg/sc ...
- (数据科学学习手札138)使用sklearnex大幅加速scikit-learn运算
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,scikit-learn作为经 ...
- 记一次学习kibaba踩过的坑(Windows环境)
下载地址 ElasticSearch:https://www.elastic.co/cn/downloads/elasticsearchLogstash:https://www.elastic.co/ ...
- 关于升级最新版本node.js你知道多少?
1.先检查版本 node -v 2.清除缓存 npm cache clean -f 3.全局安装管理node.js版本工具 npm install -g n 4.确认安装最新版本 n stable 5 ...
- python基础知识-day9(数据驱动)
1.数据驱动的概念 在自动化测试中,需要把测试的数据分离到JSON,YAML等文件中. 2.YAML 的相关知识 YAML 入门教程 分类 编程技术 YAML 是 "YAML Ain't a ...
- bat-注册表修改win11右键风格
展开:reg add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32&q ...
- Linux编辑shell脚本快速启动jar包
1.上传jar包到服务器 2.创建并编辑start.sh文件 vi start.sh 将下面内容复制到文件中 ps -ef|grep xf-demo |grep -v grep |awk '{prin ...
- Kafka KRaft模式探索
1.概述 Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据.其核心组件包含Producer.Broker.Consumer,以及依赖的Zookeeper集群. ...