记录一次莫名奇妙的跨域502(badgateway)错误

这里图片加载不了,原文请访问:原文链接

公司的项目,这几天添加了一个统计功能, 本地测试没太大问题,上线后有一个问题,具体现象描述如下:

  • 统计首页接口大约有5-6个,也就是同时需要访问6个接口拿首页数据
  • 这些接口浏览器访问会随机的,偶尔的出现跨域错误,提示CROS。但偶尔又能全部正常访问
  • 本地测试没有问题CROS问题

基于以上描述,首先想到可能nginx会有问题,因为线上和测试环境就只加了一层转发。而测试环境没有这个问题, 于是直接暴露线上服务端口访问,故障依旧。

这里没太想明白为啥是cros错误,对比了下options请求响应,都是正常请求响应的,响应数据也是正确的。所以这个问题暂记下

但是本地启动为什么没有CROS问题呢,看了下线上启动脚本,线上启动有添加堆大小限制的启动命令(限制为512MB)。本地同步添加,果然问题就在本地复现了。

访问浏览器提示跨域时,服务后台日志如下:

java 复制代码
14:50:41.003 [http-nio-8985-exec-60] ERROR o.a.c.h.Http11NioProtocol - [log,175] - Failed to complete processing of a request
java.lang.OutOfMemoryError: Java heap space
14:50:41.210 [http-nio-8985-exec-58] ERROR o.a.c.h.Http11NioProtocol - [log,175] - Failed to complete processing of a request
java.lang.OutOfMemoryError: Java heap space
14:50:41.211 [http-nio-8985-exec-60] ERROR o.a.t.u.n.NioEndpoint - [log,175] - Error running socket processor
java.lang.NullPointerException: Cannot invoke "java.nio.ByteBuffer.limit(int)" because "this.byteBuffer" is null
	at org.apache.coyote.http11.Http11InputBuffer.recycle(Http11InputBuffer.java:262)
	at org.apache.coyote.http11.Http11Processor.recycle(Http11Processor.java:1418)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.release(AbstractProtocol.java:1085)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:1060)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1744)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)
	at java.base/java.lang.Thread.run(Thread.java:842)
14:50:41.211 [http-nio-8985-exec-58] ERROR o.a.t.u.n.NioEndpoint - [log,175] - Error running socket processor
java.lang.NullPointerException: Cannot invoke "java.nio.ByteBuffer.limit(int)" because "this.byteBuffer" is null
	at org.apache.coyote.http11.Http11InputBuffer.recycle(Http11InputBuffer.java:262)
	at org.apache.coyote.http11.Http11Processor.recycle(Http11Processor.java:1418)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.release(AbstractProtocol.java:1085)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:1060)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1744)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)
	at java.base/java.lang.Thread.run(Thread.java:842)

堆溢出,我擦。第一时间想的就是哪里内存泄漏了? 导出堆空间,分析下内存。 这里可以看到有一个对象堆占用特别多

接下来看下堆中各个对象占用情况:

这里可以看到 bytes 数组占用太大,有点不正常。 继续跟进去看看谁在引用这些数组。

把这个字节数组导出来,看看是写什么。 这里面只有http请求头,而且后面很多都是空。 大小125MB.

继续跟踪字节数组被谁持有

这里可以看到字节数组被一个http11InputBuffer对象的inputBuffer持有, 而inputBuffer里面headerBufferSize属性,这个属性值等于131072000 也就是前面的 125MB

这个headerbuffer怎么这么大啊,谷歌搜索下,这个buffer是用来装http请求的header数据内容,也就是说http每次请求就需要申请125MB的空间,怪不得请求会报堆栈溢出。

再看了下文章,这个属性可以通过 max-http-request-header-size 属性进行配置。

所以接下来就简单了,项目中搜索这个配置。有人配置为:max-http-request-header-size: 131072000 换算下来 1GB。 我的天

这也太大了,调整为10MB吧。 重启项目,问题消失。

结语就是,绕了一大圈,这个跨域错误居然是内存泄漏,这个提示真的有方向性误导啊。哈哈

相关推荐
databook4 分钟前
当条形图遇上极坐标:径向与圆形条形图的视觉革命
python·数据分析·数据可视化
行者9629 分钟前
Flutter跨平台开发在OpenHarmony上的评分组件实现与优化
开发语言·flutter·harmonyos·鸿蒙
阿部多瑞 ABU34 分钟前
`chenmo` —— 可编程元叙事引擎 V2.3+
linux·人工智能·python·ai写作
acanab37 分钟前
VScode python插件
ide·vscode·python
阿蒙Amon39 分钟前
C#每日面试题-Array和ArrayList的区别
java·开发语言·c#
SmartRadio1 小时前
ESP32添加修改蓝牙名称和获取蓝牙连接状态的AT命令-完整UART BLE服务功能后的完整`main.c`代码
c语言·开发语言·c++·esp32·ble
且去填词1 小时前
Go 语言的“反叛”——为什么少即是多?
开发语言·后端·面试·go
知乎的哥廷根数学学派1 小时前
基于生成对抗U-Net混合架构的隧道衬砌缺陷地质雷达数据智能反演与成像方法(以模拟信号为例,Pytorch)
开发语言·人工智能·pytorch·python·深度学习·机器学习
WangYaolove13142 小时前
Python基于大数据的电影市场预测分析(源码+文档)
python·django·毕业设计·源码
知乎的哥廷根数学学派2 小时前
基于自适应多尺度小波核编码与注意力增强的脉冲神经网络机械故障诊断(Pytorch)
人工智能·pytorch·python·深度学习·神经网络·机器学习