502 Bad Gateway 引起的反思

转自:502 Bad Gateway 引起的反思

今天突然系统调用出现大量 502 错误! 502 错误是请求已经到了HTTP服务器(Nginx),但是在反向代理时请求不到应用服务器(Tomcat)!

查看了实例应用的 JVM 探针!下面是异常前日和当日(上图是昨日,下图是今日)各项参数的对比。

1. CPU: 昨天的 CPU 使用率稳定 4%,而今日则有较大波动!

2. JVM 堆内存:两日相比,异常当日 JVM 堆内存的增长较前日要异常的!

3. Full GC:由于 JVM 对内存增长很快,造成 Full GC 的次数较前日有明显增加!

4. Young GC:对比两日的 Young GC,频次也有较大不同!

6. 线程数:昨日的线程数稳定在 1100+ 左右,而今天在异常时段暴涨到 1700+!

JVM 各项参数的异常,尤其是线程数的暴涨!再查看的服务器的系能参数(上图是昨日,下图是今日)。

1. TCP Conn:昨日的 TCP Conn 稳定波动在 100~200 之间,而今天在异常时段达到到 6000!

这就是问题点,Tomcat 的默认线程池大小是 1000个,而且请求多是 Http 短连接,其实很难线程池溢出!

2. Load:系统 Load 在异常时段较昨日下降很多,推断:极有可能是有请求超时,后续的请求被堵塞,同时 系统 Load 下降!

根据已上推断,检查所有方法调用监控!

确有发现(上图是今日、下图是昨日),一外部方法调用的 TP99 达到 150s,而昨日正常 100ms!

追诉其根本,由于该方法还调用了内部服务,属于 RPC 调用,检查其方法调用,发现方法可用率跌至 7%,同时调用次数也急剧上上!

至此,系统 502 Bad Gateway的问题定位!

同时也吸取教训,作为系统外部服务的提供者,尤其是接入层,对接逻辑容器时,应该添加缓冲队列!由同步改成异步调用!

 

转载请并标注: “本文转载自 linkedkeeper.com (文/张松然)”

转自:502 Bad Gateway 引起的反思 续

今天线上又发现 502 Bad Gateway 的现象,但奇怪的是没有方法可用率报警,检查发现,线程数上线,但没有方法异常!

在毫无头绪之际,突然想到查看 jstack,日志如下:

发现程序的线程全部处于 BLOCKED 状态!等了一会,在查看 jstack,日志如下:

发现 BLOCKED 状态消失了,都变成了 TIMED_WAITING 状态!

仔细分析日志,发现线程都在 waiting for 同一个地址空间,这说明程序里使用了锁!

查看程序原代码,示例代码如下:

1
2
3
4
5
6
7
8
9
public void connect(String session) throws Exception {
    final ReentrantLock runLock = this._lock;
    runLock.lock();
    try {
        doSomething();
    finally {
        runLock.unlock();
    }
}

由于使用了锁,重启堆积的线程数造成了资源抢占,所以同样造成了之前的影响!

 

转载请并标注: “本文转载自 linkedkeeper.com (文/张松然)”

此条目发表在java分类目录,贴了, 标签。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。 必填项已用*标注