性能文章>一次应用程序间歇性出现HTTP 502坏网关错误的排查过程>

一次应用程序间歇性出现HTTP 502坏网关错误的排查过程转载

1月前
219415

在这篇文章中我们来探讨应用程序在亚马逊网络服务(AWS)的Elastic Beanstalk(EBS)服务上运行,此应用程序会间歇性地出现HTTP 502坏网关错误。这篇文章详细的介绍了应该如何对Elastic Beanstalk服务中的HTTP 502坏网关错误进行故障排除和故障解决。

关于AWS Elastic Beanstalk 架构

这个应用程序在AWS Elastic BeanStalk 服务(EBS)中的 AWS Elastic Load Balancer、Nginx 1.18.0、Java 8、Tomcat 8、Amazon Linux 上运行。下面是它的高级架构。 
image1.png
图:AWS Elastic Beanstalk 架构

前面有一个AWS弹性负载平衡器,此负载均衡器将把流量分配给一组EC2实例(可以自动缩放)。每个EC2实例将有一个Nginx Web服务器和一个Tomcat应用程序服务器。弹性负载均衡器发送的请求首先由Nginx服务器处理。然后,Nginx服务器将请求转发到tomcat服务器。

HTTP 502 错误网关错误

此应用程序会间歇性的出现 HTTP 502 bad gateway 错误。几秒钟后,服务将再次恢复,一切将开始正常运行。目前尚不清楚是什么导致 AWS Elastic Beanstalk 环境中出现此 HTTP 502 bad gateway 错误。

我们首先需要了解这个 HTTP 502 bad gateway 错误是什么意思。当 Web 服务器/网关/代理服务器从与之通信的后端服务器获得无效响应时,会引发此错误。
Nginx 在 AWS EBS 中抛出 HTTP 502
现在的问题是:EBS 堆栈中有三个主要组件:
1.弹性负载均衡器
2.Nginx 网络服务器
3.Tomcat 应用服务器

在这 3 个组件中,哪一个会引发 HTTP 502 bad gateway 错误? 
image2.png
图:Nginx 服务器抛出的 HTTP 502 Bad gateway 错误截图

上面是HTTP 502 bad gateway 错误的屏幕截图。此屏幕截图中有一条线索表明是谁引发了此 HTTP 502 错误。Nginx 服务器抛出了 HTTP 502 bad gateway 错误。
 
根据 HTTP 502 错误定义,只有当 Nginx 从 tomcat 服务器获得无效响应时,它才会抛出此错误。因此,这条线索有助于缩小 Tomcat 服务器是问题根源的范围。

内存不足:杀死进程

我们在运行 tomcat 服务器的 EC2 实例上执行了开源yCrash 脚本。yCrash 脚本从技术堆栈中捕获了 16 个不同的工件,其中包括:垃圾收集日志、线程转储、堆转储、ps、top、top -H、vmstat、netstat …我们将捕获的工件上传到yCrash 服务器进行分析.

yCrash 脚本捕获的工件之一是内核日志文件。在这个日志文件中可以找到 Linux 内核中发生的所有事件。yCrash 从日志文件中提取严重错误和警告并显示它们。下面是 yCrash 生成的内核日志的分析报告。
EC4DBBBBC9C04519A4F89E6CFC91E893.png
图:yCrash 的内核日志分析报告“内存不足:杀死进程”

请查看内核日志中突出显示的错误消息:
[Sat May 21 17:31:00 2022] 内存不足:杀死进程 24339 (java) 得分 874
意思是 Java 进程的 Tomcat 服务器已终止。如果进程的内存消耗超过设备的 RAM 容量限制,Linux 内核将终止进程。这也是此应用程序中发生的确切情况。每当应用程序的内存消耗超出容量限制时,Linux 内核就会终止 tomcat 服务器。

根本原因——内存不足

现在的问题是:Linux 终止 tomcat 服务器如何导致间歇性HTTP 502 bad gateway 错误?不应该发生完全中断吗?这是一个公平的问题。

如果你还记得,此应用程序在 AWS Elastic Beanstalk (EBS) 服务上运行。每当 EBS 服务终止时,它将自动重新启动 tomcat 服务器。因此很搞笑。Linux 正在终止,EBS 正在重新启动 tomcat 服务器。在此间歇期间,客户遇到了 HTTP 502 bad gateway 错误。

解决方案 – 升级 EC2 实例 RAM 容量

显然,该应用程序在只有 1GB RAM 容量的 EC2 实例上运行。内存不足,无法运行 tomcat 服务器、Nginx 服务器和其他内核进程。因此,当应用程序升级到在 2GB RAM 容量的 EC2 实例上运行时,问题得到了解决。

注意:这是另一个在非 AWS 环境中运行的应用程序面临的类似问题。这也可能是一个有趣的阅读。

点赞收藏
心动心动

前方无绝路,希望在转角。

请先登录,查看1条精彩评论吧
快去登录吧,你将获得
  • 浏览更多精彩评论
  • 和开发者讨论交流,共同进步

为你推荐

【全网首发】JVM性能问题的自动分析

【全网首发】JVM性能问题的自动分析

【全网首发】揭密Java常用性能调优工具的底层实现原理

【全网首发】揭密Java常用性能调优工具的底层实现原理

【全网首发】一次jstack 的排查之旅

【全网首发】一次jstack 的排查之旅

JVM 优化踩坑记

JVM 优化踩坑记

Java 异步调用原理与实战

Java 异步调用原理与实战

【译】为什么我的数据库很慢,10 个查询反而比 1 个查询更快?

【译】为什么我的数据库很慢,10 个查询反而比 1 个查询更快?

5
1