rabbitmq异常导致线程blocked

场景描述:

    在应用服务后端上丢弃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同步锁失败(因为锁被其它线程所占用)后进入同步阻塞状态。

你可能感兴趣的:(rabbitmq异常导致线程blocked)