线上服务挂了 3 分钟

news2024/9/23 11:24:12

在一个风和日丽的下午,刚打算饮茶,线上就开始报警了,一看情况网关报 500 了。。

网关(用的是Spring Cloud Gateway)挂了可还行,这可是对外的们,门没了岂不是所有请求都进不来了!

说好的动态调度扩缩容负载均衡呢??怎么没支棱起来?

及时处理

话不多说,直接重启。

然后看起来好了,重启大法!yyds!

问题排查

感觉有点突然,最近网关并没有发版,上一个版本还是在 4 月份,挂的有点莫名其妙。

不过这两天在执行一个动态迁移服务,有大量的请求,预估两天的请求量有 300 w,我一开始以为是被这个打挂了。

但是有关的接口我都加了限流,且请求一直是匀速的,也已经正常处理一天一夜了,服务的各项指标也没任何异常,咋就突然这样了呢?

仔细看了看,网关的服务没挂,但是请求都返回了 500。

上去一查日志:

图片

我擦,这是什么玩意?

看起来是要创建临时目录,然后失败了,因为空间不足,但是实际上我看磁盘空间还很多,这时候我已经有点感觉了。

可以看到是 Spring 的 SynchronossPartHttpMessageReader 类触发的这个报错,网关代码确实有用到 HttpMessageReader 相关的解析。

然后进行一波源码分析:

图片

点进源码粗略了看了下,每个请求的解析都会创建一个临时目录,往里跟了几步看了看,这个临时目录的作用是到时候用来给解析 Multipart 存储临时文件用的。

图片

但最近的请求也都跟 Multipart 没关系了,咱也不懂为啥要这样先预创建。

看到这反正问题已经定位到了:因为网关要用到 HttpMessageReader 相关的解析,而这个解析实现类,每次都会预创建一个临时目录,用来到时候给 Multipart 用(即使实际没这玩意),因此每个经过网关的请求,都会在网关本地服务器上创建一个临时目录。

而由于这两天请求非常多,创建了很多目录,把操作系统的文件 inode 占满了,使得后续的所有请求在执行到创建临时目录的方法时就报错了,因此所有请求都返回了 500。

inode

这边先介绍下 inode。

在类Unix文件系统中,文件的元数据存储的地方叫 inode,也就是文件元数据和文件的数据是分开存储的。

所谓的元数据指的是:文件的大小、创建时间、修改时间、权限等等,它也会占用磁盘空间。

因此操作系统分配给 inode 存储空间也是有限的,超过了限制就申请不了。

所以有时候磁盘空间够的,但是文件还是无法创建,一种可能就是 inode 满了。

对了,对 Linux 这类系统而言,目录也是文件,一样的。

tmp

tmp 目录其实是有讲究的,临时目录。

理论上这个目录默认操作系统会有个叫 tmpwatch 的玩意去清理长时间无用的文件,一般会定时去清理。

图片

而且重启系统的话,这里面的文件也会被清空。

至此,产生问题的原因应该非常清晰了。那如何解决?

解决

  1. 利用 tmpwatch 勤快点去清理,比如近几个小时没用的就直接干了。

  2. 不用 HttpMessageReader

  3. 定时重启

  4. 修改源码

  5. 看看后续版本

第一点不太好,因为有几率误删有用的文件。第二点理论上用了  Spring 体系,这玩意好像不太好避免,先暂定。第三点,太骚了,还是算了。第四点,改起来不难,但是后面升级版本啥的不太方便

先试试第五点。

然后我就去 spring-cloud github 搜一搜,果然有 issue。

图片

点进去一看,关联到另一个 issue,一看巧了,一模一样的错:

图片

然后他圈了好几个老哥,有个叫 poutsma 老哥回答了他的问题:

图片

我简单翻译下:这样的实现是为了解决一个安全问题,为了不创建一个固定的临时目录,如果使用固定目录会带来严重的安全隐患,然后也不能在退出后删除,因为这样会删除所有上传的文件。

简单来说:不是bug。

而且目录本身占用的磁盘空间可以忽略不计,只有当大量上传的文件存储在那里时,目录才会开始占用空间。

通常,操作系统会在一段时间后清理临时文件。

咳咳,老哥看起来说的没毛病,但是它这个实现确实没有考虑到大量的目录会撑爆 inode 的情况!

然后有个叫 RekaDowney 的老哥也在下面说到:

图片

不论请求的 content-type 是不是 multipart/form-data 都会创建临时目录(这跟我前面说的一样,我这几天的几百万请求压根不是 multipart 相关的)。

然后 poutsma 老哥觉得没啥毛病:

图片

你不用 multipart 创建这个目录也没影响,这目录里面又不会有文件,一个目录才占几 bytes,洒洒水啦。

额,把我洒哭了(3分钟线上服务不可用这是P几事故?)

图片

不过后面马上 poutsma 老哥意识到这样好像也不好,因此他回复到:

图片

对,他稍微妥协了下:我改我改,目录只在解析 multipart 数据的才会创建。

一天后 RekaDowney 老哥已经等不及了,他说:我已经算不清到底创建了多少个目录了,至少有 200 多w,然后我修改了源码,就调整了几行,只有在解析 multipart 的时候才创建,并且老哥还说要不要他提个 pr 贡献一波代码!

图片

这位 RekaDowney 老哥的执行力还是强啊,自己动手丰衣足食,毕竟鬼知道这修复啥时候能发版。

好了,吃瓜暂时吃到这,最终我跟踪看到这个玩意是在 5.2.16 版本修复:

图片

具体的替换方式是不无脑创建了,就创建一个随机的目录,然后保存这个引用,这样即使有很多 multipart 的请求,也不会创建很多目录了,整挺好:

图片

图片

然后我翻阅了一下 5.2.16 那个版本的 release,咳咳:

图片

上面写着这玩意是 feat,不是 bug。

你们觉得呢?

程序员的倔强之,这不是bug:)

最终我的解决方案是:升级了 gateway 的版本到 5.2.16。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 系统编程 开篇/ 文件的打开/创建

从本节开始学习关于Linux系统编程的知识! 学习Linux的系统编程有非常多的知识点,在应用层面,很重要的一点就是学习如何“用代码操作文件来实现文件创建,打开,编辑等自动化执行” 那如何自动化实现对文件的创建&#…

成本控制策略:加强企业安全

我们生活在一个不确定的时代。大多数经济学家预测,今年全球经济将继续放缓,亚太地区当然也不会逆势而上。 在供应链问题、大规模裁员、高通胀和高利率之间,我们毫不奇怪地看到大多数公司和行业采取谨慎态度,战略、增长计划和预算…

使用docker安装wordpress详细教程及出现数据库无法连接问题解决方法

1.获取wordpress镜像 docker pull wordpress 2.创建wordpress 的容器 a.创建wordpress的文件镜像卷文件夹 mkdir wordpress b.创建wordpress镜像 docker run --name wp -p8080:80 -v /home/wordpress/:/var/www/html -d wordpress c.查看容器运行情况 3.在本地或者其他服务器创…

AutoDL从0到1搭建stable-diffusion-webui

前言 AI绘画当前非常的火爆,随着Stable diffusion,Midjourney的出现将AI绘画推到顶端,各大行业均受其影响,离我们最近的AI绘画当属Stable diffusion,可本地化部署,只需电脑配备显卡即可完成AI绘画工作&…

Go语言并发编程(千锋教育)

Go语言并发编程(千锋教育) 视频地址:https://www.bilibili.com/video/BV1t541147Bc?p14 作者B站:https://space.bilibili.com/353694001 源代码:https://github.com/rubyhan1314/go_goroutine 1、基本概念 1.1、…

宋老板教我做人--背后少说别人

宋老板教我做人——背后少说别人 2000年~2004年间发生的事 让我很难忘,让我长记性 趣讲大白话:是不是传说中的,发自内心的善良? 【趣讲信息科技246期】 **************************** 真实故事1: 2000年5月…

Embedding入门介绍以及为什么Embedding在大语言模型中很重要

Embeddings技术简介及其历史概要 在机器学习和自然语言处理中,embedding是指将高维度的数据(例如文字、图片、音频)映射到低维度空间的过程。embedding向量通常是一个由实数构成的向量,它将输入的数据表示成一个连续的数值空间中…

【python】绘图代码模板

【python】绘图代码模板 pandas.DataFrame.plot( )画图函数Seaborn绘图 -数据可视化必备导入数据集可视化统计关系使用Seaborn绘制散点图抖动图箱线图小提琴图Pointplot群图 可视化数据集的分布绘制单变量分布柱状图直方图 绘制双变量分布Hex图KDE 图可视化数据集中的成对关系 …

【数据结构与算法】线索化二叉树

线索化二叉树 n 个节点的二叉链表中含有 n 1 【公式 2n - (n - 1) n 1】个空指针域。利用二叉链表中的空指针域,存放指向该节点在某种遍历次序下的前驱和后继节点的指针(这种附加的指针称为“线索”)。这种加上了线索的二叉链表称为线索链…

Anteater/食蚁兽 V1.0.0 (帮助开发者快速找到项目中敏感信息)

Github>https://github.com/MartinxMax/Anteater 首页 Anteater/食蚁兽 V1.0.0 帮助开发者快速找到项目中存在敏感信息的文件,并且以时间戳为文件名保存日志 Anteater/食蚁兽 使用方法 #python3 anteater.py -h ps:当前目录下存在Windows_install.bat,Linux_install.sh请…

爆肝整理,Postman接口测试-参数关联实战(详细步骤)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 接口测试什么时候…

忘掉MacType吧,TtfAutoHint手工删除ttc、ttf字体的hinting,微软雅黑字体更显平滑

Windows的ClearType渲染字体方式,结合臭名昭著的hinting技术使微软雅黑字体备受争议,正所谓:成也hinting,败也hinting。 首先什么是hinting? Hinting 这个词一直都没有中文名称,我用粤语将它音译为“牵挺”…

javascript 7种继承-- class继承(7)

文章目录 概要继承的进化史class继承1. 类声明与严格模式2. 类的实现3. 类的静态方法4. get,set 存取器5. 类中的公有继承以及私有继承6. 使用 super 调用超类7. Mix-ins / 混入 源码: 类的继承效果图小结 概要 这阵子在整理JS的7种继承方式,发现很多文…

【2023 华数杯全国大学生数学建模竞赛】 B题 不透明制品最优配色方案设计 详细建模方案解析及参考文献

【2023 华数杯全国大学生数学建模竞赛】 B题 不透明制品最优配色方案设计 详细建模方案解析及参考文献 1 题目 B 题 不透明制品最优配色方案设计 日常生活中五彩缤纷的不透明有色制品是由着色剂染色而成。因此,不透明制品的配色对其外观美观度和市场竞争力起着重要…

GD32F103VE定时器0

本测试程序,配置GD32F103VE定时器0每500ms中断一次,中断时,开关LED灯。 只讲定时器,多了,有点乱。有的人喜欢汇总,Timer的功能太多,放在一起,会搞混,不好移植。即使放一…

【雕爷学编程】MicroPython动手做(31)——物联网之Easy IoT 2

1、物联网的诞生 美国计算机巨头微软(Microsoft)创办人、世界首富比尔盖茨,在1995年出版的《未来之路》一书中,提及“物物互联”。1998年麻省理工学院提出,当时被称作EPC系统的物联网构想。2005年11月,国际电信联盟发布《ITU互联网…

哪些情况下需要使用爬虫IP

不知道小伙伴们有没有遇到过这种场景:上网闲逛,看一些搞笑的视频或者想下载一些酷炫的文件,正点击呢,结果却发现被网站限制了,无法访问或者下载? 别急,今天我来告诉大家,如何借助使…

IE浏览器,和Edge浏览器

目录 一.IE浏览器(前世今生) 1.什么是IE浏览器? 2.IE浏览器发展历程 3.IE浏览器在早些年为什么这么流行 4.ie浏览器为什么被停用? 5.IE浏览器无法适应如今的Web发展原因 二.Edge(发展) 1.什么是Edge浏览器&…

2023年人工智能技术与智慧城市发展白皮书

人工智能与智慧城市是当前热门的话题和概念,通过将人工智能技术应用在城市管理和服务中,利用自动化、智能化和数据化的方式提高城市运行效率和人民生活质量,最终实现城市发展的智慧化,提升城市居民的幸福感。 AI技术在城市中的应…

【修正-高斯拉普拉斯滤波器-用于平滑和去噪】基于修正高斯滤波拉普拉斯地震到达时间自动检测研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…