Redian新闻
>
寄了,线上服务挂了 3 分钟!

寄了,线上服务挂了 3 分钟!

公众号新闻

点击上方“芋道源码”,选择“设为星标

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 10:33 更新文章,每天掉亿点点头发...

源码精品专栏

 
来源:yes的练级攻略


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

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

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

及时处理

话不多说,直接重启。

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

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 视频教程:https://doc.iocoder.cn/video/

问题排查

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

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

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

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

上去一查日志:

我擦,这是什么玩意?

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

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

然后进行一波源码分析:

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

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

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

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

inode

这边先介绍下 inode。

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

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

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

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

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

tmp

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

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

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

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

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud
  • 视频教程:https://doc.iocoder.cn/video/

解决

  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。



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢

已在知识星球更新源码解析如下:

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。

谢谢支持哟 (*^__^*)

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
中国卖家为清库存,给一美国女子疯狂寄了100多个amazon包裹…第一百章 转战回国花絮-20万大洋买国内奢侈品牌衣服学员OFFER | 面试挂了,Meta HR居然主动打电话加面!华人亲历屠杀40分钟!母女躲进试衣间,妈妈用身体死死堵住门!外面突传脚步声...入 土 为 安[世相]加拿大女子天天收到亚马逊“神秘”包裹!有50多双鞋!跪求:别再寄了线上服务挂了 3 分钟开挂了!奥莱月末疯狂大促,真是开挂了!安德UA玛,Burberry,CK史前疯折开打极度缺人:800元/天,在家可做!无需经验,线上长期稳定安省打911要等5-10分钟!根本无法紧急援助!多个市民因此死亡华人偷寄900万个包裹被抓!你的包裹也许被偷寄了!湾区攻略!旧衣服能换钱,线上线下旧衣处理5大妙招暑期招募影视后期人员:300r/单,线上可做,无经验要求!“家里钱都被骗光,还借了几百万外债!”上海80后女子20天被骗走400万,房子也抵押了,一切从网上挂了一条售房信息开始...现场视频曝光:18分钟!OPPO 3000人芯片公司就地解散,高管哽咽落泪至少提前15分钟!美铁在芝加哥与圣路易市开绿灯 快速列车开动单品三个月破亿,两年成为头部品牌,线上白牌如何快速破局?校招提前批挂了,会影响秋招吗?在小红书工作的朋友给我寄了本书女演员失足被挂在半空20分钟!回应来了天热宅家逛超市?达拉斯这家超市下单就减免,7.5折,$35减$10,线上下单,生鲜好物急速到家天天收到亚马逊“神秘”包裹!有50多双鞋!跪求:别再寄了研究发现:午睡不宜超过30分钟!否则增加肥胖、高血压、高血糖风险大事件!纽约社委会遭入侵,线上会议惊现男子自慰线下增长乏力,线上媒体冲击,影院该如何突出重围?点一下详情系统挂了,CPU100%[吓人]大温亚裔地产经纪开车被泼热咖啡!遭种族歧视辱骂,被围堵十分钟!第九十九章 破案面试经历 | 面试挂了,Meta HR居然主动打电话加面!从天涯社区到小红书:“附近”消失后,线上社区如何变迁每天只需6分钟!这项运动帮助延缓阿尔茨海默患病北美Top1科技夏令营!斯坦福,MIT,纽大,线上线下均可参加日本一小哥连续15年每天只睡30分钟!真实作息被曝光后...网友:活着是奇迹抗原代替核酸检,尚未恢复落地签
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。