记一次中间件宕机以后持续请求导致应用OOM的排查思路(server.max-http-header-size属性配置不当的严重后果)

一、背景

最近有一次在系统并发比较高的时候,数据库突然发生了故障,导致大量请求失败,在数据库宕机不久,通过应用日志可以看到系统发生了OOM

二、排查

初次看到这个现象的时候,我还是有点懵逼的,数据库宕机以后为什么会导致应用发生OOM呢?

不管怎么样,先按照传统思路,分析一下应用此时的dump文件。

通过MemoryAnalyzer工具进行dump文件分析,通过Leak Suspects页面可以发现,有两个可以点,如下:

在这里插入图片描述

system class loader看起来没有什么问题,org.apache.coyote.http11.Http11OutputBuffer对象占用这么多内存倒是真的可疑。

打开MemoryAnalyzer工具Dominator Tree页面,过滤org.apache.coyote.http11.Http11OutputBuffer,截图如下:

在这里插入图片描述

可以看到,内存中有大量org.apache.coyote.http11.Http11OutputBuffer对象,同时每个对象都持有一个2048000长度的字节数据。

通过在IDEA中对org.apache.coyote.http11.Http11OutputBuffer对象的引用发现,Http11OutputBuffer是用于tomcat处理请求时,用于每个请求处理时都会生成,代码如下:

org.apache.coyote.http11.Http11Processor#Http11Processor

在这里插入图片描述

进入protocol.getMaxHttpRequestHeaderSize()方法:

在这里插入图片描述

进入getMaxHttpHeaderSize()方法:

在这里插入图片描述

可以看到maxHttpHeaderSize属性值默认是8192字节,怎么变成了上面的2048000长度了呢?

通过debug代码可以发现,在org.springframework.boot.autoconfigure.web.embedded.TomcatWebServerFactoryCustomizer#customizeMaxHttpHeaderSize方法中会进行覆盖设置,如果你在配置文件中配置了server.max-http-header-size属性,那么maxHttpHeaderSize默认的8192就会被覆盖。

同时,根据org.apache.coyote.http11.Http11Processor#Http11Processor源码,发现每次请求时也都会创建org.apache.coyote.http11.Http11InputBuffer对象,于是我又在MemoryAnalyzer工具Dominator Tree页面搜索了Http11InputBuffer类,如下:

在这里插入图片描述

此时,我发现为什么Http11InputBuffer对象持有的buffer大小不是2048000而是2056192,整整大了8192呢?

通过debug可以发现,答案可以在org.apache.coyote.http11.Http11InputBuffer#init方法中找到:

在这里插入图片描述

Http11InputBuffer对象中,buffer大小除了设置的size之外,还会加一个wrapper.getSocketBufferHandler().getReadBuffer().capacity(),通过代码调试可以发现,SocketBufferHandler的设置在org.apache.tomcat.util.net.NioEndpoint#setSocketOptions方法中进行的:

在这里插入图片描述

进入org.apache.tomcat.util.net.SocketProperties可以发现,buff的默认大小就是8192:

在这里插入图片描述

此时,问题排查基本结束了,排查中遇到的疑问也基本解决了。

三、原因

通过上面的分析可以发现,由于有人在配置文件中设置了server.max-http-header-size属性,

server:max-http-header-size: 2048000

覆盖了默认的8KB大小,导致每次请求创建的Http11InputBufferHttp11OutputBuffer对象持有的buffer大小增加到2MB,在数据库宕机以后,tomcat还在继续接受请求,由于请求响应阻塞,同时此时会有大量请求进行堆积,但是每次请求都会创建Http11InputBufferHttp11OutputBuffer对象,同时会向JVM申请内存,导致JVM内存使用量急剧增加,从而导致OOM

四、问题解决

找到问题原因以后,有点好奇,为什么要修改server.max-http-header-size属性呢?通过内部排查得知,原来是应用提供的某个接口是GET请求方式,在请求URL中拼接的参数过大的时候会报Request header is too large异常信息。

看到这个异常信息有点奇怪,为什么GET请求会有这个错误呢,为什么修改server.max-http-header-size属性可以解决呢?通过代码debug发现,Http11InputBuffer对象其实处理的是整个请求报文,包括请求头请求行等信息,所以GET方式请求URL大小和请求头大小都会被Http11InputBuffer对象持有的buffer大小限制,因此修改server.max-http-header-size属性确实可以解决GET请求方式由于URL过长导致的Request header is too large异常问题。

最后,将该GET请求方式接口修改成了POST方式请求,参数传递也通过请求体进行,删除配置文件中

server.max-http-header-size属性配置,恢复默认值8192,在测试环境进行测试,发现OOM问题可以解决。不过,虽然程序层面问题解决了,不过数据库稳定性问管理还需要进一步加强。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/313522.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt : 禁用控件默认的鼠标滚轮事件

最近在写一个模拟器,在item中添加了很多的控件,这些控件默认是支持鼠标滚动事件的。在数据量特别大的时候,及容易不小心就把数据给修改了而不自知。所有,我们这里需要禁用掉这些控件的鼠标滚轮事件。 实现的思想很简单&#xff0c…

OceanBase单机版安装体验

前情提要 上周OceanBase开发者大会过后,作为观察员也来体验一下OB的安装。业内有某个国产安装用了两周,这种其实有点劝退了。话说就是10年前,没搞过Oracle的人也不用两周安装一个数据库啊。今天看看OB的(一体化)安装。…

linux学习:线程

目录 线程api 创建一条新线程 获取、设置线程的分离属性 获取、设置线程是否继承创建者的调度策略 获取、设置线程的调度策略 获取、设置线程静态优先级 获取、设置线程动态优先级 获取、设置线程栈大小、警戒区大小 退出线程 接合指定线程 给指定线程发送一个取消请…

鸿蒙开发语言_ArkTS开发语言体验_TypeScript语言环境搭建_TS声明和数据类型---HarmonyOS4.0+鸿蒙NEXT工作笔记003

可以看到我们新建的这个项目,有个 @State message: String =Hello ArkTS 这个就是定义了一个变量,可以看到 message是变量名,String是变量类型. 然后我们可以看看它的结构可以看到 build() 下面有个Row,然后再下面有个Column方法,然后,里面就是具体的内容了,首先就是显示了一…

二、OSPF协议基础

基于SPF算法(Dijkstra算法)的链路状态路由协议OSPF(Open Shortest Path First,开放式最短路径优先) 目录 1.RIP在大型网络中部署所面临的问题 2.Router ID 3.OSPF的报文 4.OSPF邻居建立过程 5.OSPF报文的确认机制…

在 Linux 上把 Vim 配置为默认编辑器

目录 ⛳️推荐 在 Linux 命令行中编辑 将 Vim 设置为其他程序的默认值 在 Alpine 中编辑电子邮件 总结 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站 我使用 Linux 大概有…

3D MINS 多模态影像导航系统

3D MINS多模态影像导航系统(Multimodal Image Navigation System)是SunyaTech研发的建立在DICOM(Digital Imaging and Communications in Medicine)图像基础之上的多模态影像导航系统,集二维影像PACS管理、三维影像层级…

Python函数小知识

目录 一、函数的定义和调用 二、函数参数 三、函数作用域 四、递归函数和匿名函数 一、函数的定义和调用 def 函数名(参数): 自定义函数可以分为有参函数和无参函数 。 函数的作用: 在Python中定义函数可以提高代码的复用率,避免重复的代码,…

Elastic 网络爬虫:为你的网站添加搜索功能

作者:来自 Elastic Lionel Palacin 为了演示如何使用 Elastic 网络爬虫,我们将以一个具体的网站为例,讲解如何在该网站上添加搜索功能。我们将探讨发现网站的方法,并利用 Elastic 网络爬虫提供的功能,以最佳方式准备待…

30 OpenCV 点多边形测试

文章目录 点多边形测试pointPolygonTest示例 点多边形测试 pointPolygonTest pointPolygonTest( InputArray contour,// 输入的轮廓 Point2f pt, // 测试点 bool measureDist // 是否返回距离值,如果是false,1表示在内面,0表示在边界上&a…

Spring Boot中判断轨迹数据是否经过设置的打卡点,且在PGSQL中把点拼接成线,判断某个点是否在线上或在线的50米范围内

问题描述 轨迹数据判断是否经过打卡点,轨迹数据太多,循环判断的话非常消耗内存。解决办法只需要把所有轨迹数据点拼成了一条线,然后只需要循环打卡点即可,打卡点不多,一般不会超过100个,如果多的话&#x…

“一个有趣的C语言代码”分析

“一个有趣的C语言代码” 一个有趣的C语言代码-流浪的海豚-ChinaUnix博客 #include <stdio.h> int print() {printf("hello world!\n");return 0; } int main(void) {long base[0];long* result base3;*(result1) *result;*result (long)print;return 0; …

ARM DMIPS算力说明

ARM DMIPS算力说明 ARM算力参考官网地址 https://en.wikipedia.org/wiki/List_of_ARM_processors Product familyARM architectureProcessorFeatureCache (I / D), MMUTypical MIPS MHzReferenceARM1ARMv1ARM1First implementationNoneARM2ARMv2ARM2ARMv2 added the MUL (mu…

无人零售与传统便利店的竞争优势

无人零售与传统便利店的竞争优势 成本控制 • 无人零售 显著降低了人力成本&#xff0c;无需支付店员薪资和相关福利&#xff0c;且通过智能化管理减少能源消耗与维护费用&#xff0c;尤其在高租金和高人流区域效益突出。 • 传统便利店 则承担较高的人员开支&#xff0c;…

Nginx 四层和七层代理区别、配置

四层&#xff1a;通过报文中的目标地址和端口&#xff0c;加上负载均衡设备设置的服务器选择方式&#xff0c;决定最终选择的内部服务器&#xff0c;使用tcp、udp协议。 七层&#xff1a;"内容交换"&#xff0c;通过报文中真正有意义的应用层内容&#xff0c;加上负…

GPT的全面历史和演变:从GPT-1到GPT-4

人工智能新篇章&#xff1a;GPT-4与人类互动的未来&#xff01; 本文探讨了生成式预训练 Transformer (GPT) 的显着演变&#xff0c;提供了从开创性的 GPT-1 到复杂的 GPT-4 的旅程。 每次迭代都标志着重大的技术飞跃&#xff0c;深刻影响人工智能领域以及我们与技术的互动。 我…

MIS微调SAM模型实时交互UI界面

前言 SAM模型的基本介绍可见SAM&#xff08;Segment Anything Model&#xff09;大模型使用--point prompt_sam大模型-CSDN博客 针对Meta团队去年发布的SAM大模型在医学图像分割领域表现性能较差的情况&#xff0c;笔者收集了一些MIS领域的数据集对SAM的架构进行fine tune&am…

akSmart大带宽服务器基础配置科普

在数字化时代&#xff0c;服务器的性能和网络带宽成为业务发展的关键因素。RakSmart作为知名的服务器提供商&#xff0c;其大带宽服务器备受用户青睐。那么&#xff0c;RakSmart大带宽服务器的基础配置究竟有哪些呢?本文将为您揭开这一神秘面纱。 首先&#xff0c;我们来看看R…

信创需求激增,国产服务器操作系统赋能数字化转型

信创&#xff0c;即信息技术应用创新&#xff0c;是指在关键领域和环节推进信息技术的自主创新&#xff0c;构建安全可控的信息技术体系。随着数字化转型的加速&#xff0c;信创需求激增&#xff0c;国产服务器操作系统在其中扮演着至关重要的角色。国产服务器操作系统如何赋能…

爬虫入门——Request请求

目录 前言 一、Requests是什么&#xff1f; 二、使用步骤 1.引入库 2.请求 3.响应 三.总结 前言 上一篇爬虫我们已经提及到了urllib库的使用&#xff0c;为了方便大家的使用过程&#xff0c;这里为大家介绍新的库来实现请求获取响应的库。 一、Requests是什么&#xff1…