场景描述:
在应用服务后端上丢弃rabitmq服务发出的包,操作:
iptables -I INPUT 1 -p tcp -s 【rabbitmq IP】 -j DROP
现象:
所有接口TPS逐渐下降为0,MAXRT飙升到25s,失败率增加;超过200个线程线程处于BLOCKED状态。应用日志无报错。
资源使用:应用cpu下降为0.
线程状态:

阻塞的代码块:

分析:
ensureIsOpen()并不确保Connection处于开启状态,它所做的仅仅是判断连接是否已经被打开,如果连接处于关闭状态,会直接抛出一个AlreadyClosedException。(但是应用日志中无报错)
quiescingTransmit():委托AMQCommand传输
补充:blocked状态的线程是如何产生的
阻塞状态(Blocked) : 阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:
(01) 等待阻塞 -- 通过调用线程的wait()方法,让线程等待某工作的完成。
(02) 同步阻塞 -- 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态。
(03) 其他阻塞 -- 通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
如上问题中的blocked线程则是在获取synchronized同步锁失败(因为锁被其它线程所占用)后进入同步阻塞状态。
网友评论