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 领取,更多内容陆续奉上。

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

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

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

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