最近用jmeter测试并发出现了访问端口异常问题的排查及解决方案做一个归纳:
背景:接口压测异常情况发生率达到了99%
线上情况:
错误情况展示:
原因:
Jmeter里的http sample勾选了keep alive,导致会话一直保持,而windows本身的端口有限,导致端口被占用完后,无法分配新的端口,因此会产生java.net.BindException: Address already in use: connect 报错。
解决方案一:
解决方案二:
解决方案: jmeter压测报:java.net.BindException: Address already in use: connect解决方法_菜菜de旺仔的博客-CSDN博客
错误率直接降下来了:
并发情况下,异常率还是存在,继续优化:
网关出现了一些熔断造成了异常率:
# hystrix 配置
hystrix:command:default: #default全局有效,service id指定应用有效execution:timeout:enabled: trueisolation:strategy: SEMAPHOREthread:timeoutInMilliseconds: 60000 #断路器超时时间,默认1000msdataSqlConsoleHystrix: #sql工作台方法的超时时间 60sfallback:enabled: trueexecution:timeout:enabled: trueisolation:thread:timeoutInMilliseconds: 60000 #断路器超时时间,默认1000msdataApiMappingHystrix: #api调用方法的超时时间 60sfallback:enabled: trueexecution:timeout:enabled: trueisolation:thread:timeoutInMilliseconds: 60000 #断路器超时时间,默认1000msshareSecurityContext: true# 请求处理的超时时间
# 建议hystrix的超时时间为:(1 + MaxAutoRetries + MaxAutoRetriesNextServer) * ReadTimeout
ribbon:OkToRetryOnAllOperations: false #对所有操作请求都进行重试,默认falseReadTimeout: 10000 #负载均衡超时时间,默认值5000ConnectTimeout: 20000 #ribbon请求连接的超时时间,默认值2000MaxAutoRetries: 0 #对当前实例的重试次数,默认0MaxAutoRetriesNextServer: 3 #对切换实例的重试次数,默认1
解决方案:histrix熔断器timeoutInMilliseconds时间从10s调到了60s,ribbon最大重试次数调到3,异常错误为0
补充:在TCPTimedWaitDelay设置默认240s的时候存在问题,因为4分钟之内如果之前jmeter没跑完,那么端口还是被占用的状态,所以设置一个合理的值让其释放掉,30,60,可以再去测试一下