[Spring/SpringWeb] spring-cloud-gateway|spring-web|ynchronossPartHttpMessageReader 应用程序在/tmp/文件夹下生成海量的以"synchronoss-file-upload"开头的空文件夹,导致磁盘inode索引耗尽、报“No space left on device”

1 问题描述

  • 环境信息
  • spring-cloud-gateway : 2.2.9.RELEASE
  • spring-boot : 2.3.12.RELEASE
  • spring : 5.2.15.RELEASE
  • java : 1.8
  • deploy on k8s
  • 调用方微服务的异常日志

打印了被调用方(Spring-Cloud-Gateway:2.2.9.RELEASE)的完整响应信息

Caused by: feign.FeignException$InternalServerError: [500 Internal Server Error] during [POST] to [ http://Xxxx-gateway-parent-backend-service.namespace:80/xxxx/api/xxxxxxxxx/v1.0?nonce&timestamp=174xxxx948560&appKey&sign] [XxxxApi#getYyyy(JSONObject,String,Long,String,String)]: [{"timestamp":174xxxx948568,"path":"/xxxx/api/xxxxxxxxx/v1.0","status":500,"error":"Internal Server Error","message":"","requestId":"3f60ad19-7924209"}]
  • 调用方

[TID: N/A] [Xxxx-gateway] [system] [2025/04/18 18:42:29.594] [ERROR] [boundedElastic-94818] [CompositeLog] error:122 |N/A| [3f60ad19-7924214] 500 Server Error for HTTP POST "/xxx/api/xxxxxxx/v1.0?nonce&timestamp=174xxxx949580&appKey&sign"
java.io.UncheckedIOException: java.nio.file.FileSystemException: /tmp/synchronoss-file-upload-4247860018208359052: No space left on device

2 问题分析

磁盘占用情况

  • 网关 Pod 所在物理节点的磁盘:未满

  • 网关 Pod 索引节点的消耗情况:

环境中 4 个 Pod 容器 都是 100% 或 99%

说明:不是磁盘空间不足,而是小文件太多或者空目录太多。

  • 进一步查看/tmp/synchronoss-file-upload-*这类目录,结果均为空目录
# ls -la /tmp/synchronoss-file-upload-4247860018208359052
..
.

源代码

spring-web:5.2.15.RELEASE (问题所在)

  • spring-web:org.springframework.http.codec.multipart.SynchronossPartHttpMessageReader

https://github.com/spring-projects/spring-framework/blob/v5.2.15.RELEASE/spring-web/src/main/java/org/springframework/http/codec/multipart/SynchronossPartHttpMessageReader.java

  • org.springframework.http.codec.multipart.SynchronossPartHttpMessageReader#read

结论

  • spring-cloud-gateway的底层组件 spring-web : 5.2.15.RELEASE 有 bug: 针对每次用户的HTTP请求都会创建一个空目录

  • 其导致了 docker pod 容器的操作系统 inode 索引【完全耗尽】的异常(No space left on device)。

  • spring-web : 5.2.16.RELEASE 做了优化————不再是每个请求都生成空目录了。

https://github.com/spring-projects/spring-framework/blob/v5.2.16.RELEASE/spring-web/src/main/java/org/springframework/http/codec/multipart/SynchronossPartHttpMessageReader.java

3 解决方法

  • 1)临时方法:重新部署微服务

  • 2)永久方法: 更新源码 spring-web 组件的版本

  • a. 升级 spring-web 组件至 5.2.16.RELEASE

spring-web / spring-webmvc / spring-webflux

  • b. 整体升级 spring-cloud 2.2.9.RELEASE 至 spring-cloud 3.x (此大版本将不再使用该问题组件)

Y 推荐文献

  • spring-frmework

Linux 操作系统 inode 索引完全耗尽的异常(No space left on device

df -i /

X 参考文献

posted @ 2025-04-21 21:17  千千寰宇  阅读(46)  评论(0)    收藏  举报