Jetty使用固定长度队列,导致无法服务
来源:互联网 发布:windows正版镜像 编辑:程序博客网 时间:2024/06/08 03:08
后来查看jetty源代码,具体原因如下:
问题:
1. web应用依赖的第三方服务临时挂掉(使用httpclient调用),导致请求量剧增(客户端重试机制),jetty停止服务。(前置机nginx->不同服务器(nginx和jetty))
现象:
1. jetty输出大量请求分配失败日志如下:
12 Jan 2016 18:59:25.828 WARN nio[243]-Dispatched Failed! SCEP@34b2eaa5{l(/127.0.0.1:29829)<->r(/127.0.0.1:8080),s=-1,open=true,ishut=false,oshut=false,rb=false,wb=false,w=true,i=0}-{AsyncHttpConnection@4e4b11aa,g=HttpGenerator{s=0,h=-1,b=-1,c=-1},p=HttpParser{s=-14,l=0,c=0},r=0} to org.eclipse.jetty.server.nio.SelectChannelConnector$ConnectorSelectorManager@7839e749
2.linux服务器close_wait急剧增加:
3.服务迅速不可用,暂时解决办法,对nginx切流量,重启jetty,jetty使用httpclient调用请求恢复。
解决:
1. jetty配置文件,改用默认队列(当时采用固定长度队列,是防止jetty贪吃,导致jetty崩溃问题,目前在nginx限流解决)
问题:
1. 为什么使用固定长度队列,就会出现Dispatched Failed?
1)使用固定长度队列,当httpclient请求第三服务时,第三方服务出现问题,线程池所有线程都堵塞在请求第三方服务处;2)外部请求不断过来,队列占满,请求再源源不断过来时,就会采用丢弃任务策略,就会输出Dispatched Failed
2. 服务器为什么出现大量close_wait?
1)通过ss -ant | awk '{++s[$1]} END {for(k in s) print k,s[k]}' 命令查看各个状态,发现close_wait居多,并且都是同一个服务器nginx流量打到本服务器jetty上的
2)查看nginx日志:2015/11/24 16:38:56 [error] 25941#0: *15256 upstream timed out (110: Connection timed out) while reading response header from upstream, client:
3 )通过日志和close_wait截图看出,主要是jetty发送很多segment后,每次都超时,导致nginx关闭socket,导致出现close_wait状态。
3. 为什么使用默认无界队列,系统就没问题?
1)使用无界队列,所有请求都会能被Dispatch给线程处理,当使用httpcliet调用第三方服务出现问题,由于httpclient设有超时,web应用会自动关闭httpclient(所以jetty作为客户端调用httpclient服务不会出现close_wait)
2) 此时,相对于nginx而言,jetty没有出现Dispatched Failed错误,而是等待获取httpclient链接超时,自动关闭链接。而不是nginx端关闭,所以不会出现close_wait状态。
备注:
1. 附上jetty使用filter限流方案:http://www.eclipse.org/jetty/documentation/current/qos-filter.html#qos-understanding
- Jetty使用固定长度队列,导致无法服务
- RabbitMQ服务主机名更改导致消息队列无法连接
- 实现一个固定长度的集合队列
- 限制固定长度的队列结构
- (Java)固定长度队列的实现
- Jetty服务部署调试使用
- 使用Service描述的服务与springAop冲突导致服务无法暴露
- Java简单实现固定长度队列(FIFO)
- Java简单实现固定长度队列(FIFO)
- LimitQueue一个限制固定长度的队列结构
- 单调队列 移动区间(长度固定)最值问题。
- 使用jetty 嵌入式构建 https 服务
- Jetty9使用jetty.sh启动Unix服务
- mac下eclipse的jetty插件无法起服务
- 优化大师导致OracleOraHome92TNSListener 服务无法启动
- 优化大师导致OracleOraHome92TNSListener 服务无法启动解决办法!
- 豌豆夹导致ADB服务无法开启
- 服务器重启导致无法启动MySQL
- TextView 画线(中间线、下划线)
- JAVA初学的体会
- 【Accelerated C++】重点回顾(续)
- mobiscroll插件使用
- GPG key generation: Not enough random bytes available.
- Jetty使用固定长度队列,导致无法服务
- 逻辑——真与假的世界
- Android 将类中的文字提取到String.xml中
- springmvc配置
- 实际上Java访问数据库的方式主要有四种
- codeforces 581d
- android学习之选择媒体库中的图片
- jfinal 学习笔记
- Android学习之Animation(三)