生产环境突然发现feign.RetryableException: Connection reset报错信息,一开始怀疑是服务问题,经排查服务均正常。最后想起最近修改的线程池配置从代码写死改为配置文件,去检查线程池配置,发现核心线程数代码以前是30,现在配置改为了10。把线程池核心线程数,最大线程数改为30,60。之后就没有再发现错误信息了。
核心线程数一开始按照标准算法去估算,实际发现生产不够用,扩大后才正常,扩大后已经偏离标准算法,这里还是有疑惑的,因为这里核心线程数跟cpu的关系就搞不清楚了。。
最终看了这篇文章后,得到解惑:https://www.jianshu.com/p/f9aa31cfe610
计算核心线程数:
逻辑CPU的数量=物理CPU的数量x单个CPU的内核数x2
所以4核CPU=8逻辑CPU数量
那么
核心线程数=8x2+1=17,那么设置大一点就取20。
最大线程数=20x2+1=41。
1.feign.RetryableException: Connection reset异常
feign.RetryableException: Connection reset executing POST http://xxxxxxx/v1/house/info?id=xxxxxxxx
at feign.FeignException.errorExecuting(FeignException.java:249)
at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:129)
at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:89)
at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:100)
at com.sun.proxy.$Proxy195.info(Unknown Source)
at com.dtyunxi.redex.center.worksheet.acl.service.workaclimpl.WorkDutyNumApiImpl.getDecorationStandard(WorkDutyNumApiImpl.java:41)
at com.dtyunxi.redex.center.worksheet.biz.apiimpl.WorkDutyApprovalApiImpl.getWorkOrderRespDtoList(WorkDutyApprovalApiImpl.java:1069)
at com.dtyunxi.redex.center.worksheet.biz.apiimpl.WorkDutyApprovalApiImpl.info(WorkDutyApprovalApiImpl.java:520)
at com.dtyunxi.redex.center.worksheet.biz.apiimpl.WorkDutyApprovalApiImpl$$FastClassBySpringCGLIB$$908740da.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
Caused by: java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:210)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at org.apache.http.impl.io.SessionInputBufferImpl.streamRead(SessionInputBufferImpl.java:137)
at org.apache.http.impl.io.SessionInputBufferImpl.fillBuffer(SessionInputBufferImpl.java:153)
at org.apache.http.impl.io.SessionInputBufferImpl.readLine(SessionInputBufferImpl.java:280)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:138)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:56)
at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:259)
at org.apache.http.impl.DefaultBHttpClientConnection.receiveResponseHeader(DefaultBHttpClientConnection.java:163)
at org.apache.http.impl.conn.CPoolProxy.receiveResponseHeader(CPoolProxy.java:157)
2.修改线程池配置
spring:
#线程池配置
task:
execution:
thread-name-prefix: task-
pool:
#核心线程数
#CPU密集型:核心线程数 = CPU核数 + 1 【机器学习、视频转码】
#IO密集型:核心线程数 = CPU核数 * 2 + 1 【Web应用】——当前使用
core-size: 30
#最大线程数=核心线程数 * 2
max-size: 60
#队列容量
queue-capacity: 1000