问题现象:docker上运行的微服务显示no space left on device
先上结论:此微服务的主体功能是上传文件到华为云服务obs进行保存。上传方法是使用multipartFile,磁盘空间一直上涨是使用InputStream stream = multipartFile.getInputStream()后,没有调用stream的close()方法导致的。
定位阶段1
(1)首先登录进docker,使用命令 df -h 进行查询显示挂载/的磁盘已满
(2)进根目录长度,使用du -sh *命令查询查询,想要确认是什么路径下的文件把磁盘空间耗尽。结果显示只占用了几百M空间
疑问:linux文件系统磁盘空间占满,df与du查询不一致
百度了一下df和du不一致原因。删除文件时,如果还有进程占用着此文件,磁盘是不会释放这部分的空间。详细原因可以看这个链接:https://cloud.tencent.com/developer/article/1857432?from=15425
通过lsof命令查询是什么进程占用文件,导致文件系统删除失败,查询到是微服务的java进程。那就是代码存在问题,查看文件存储的路径是:Temp\tomcat.8443.4503940563026842881\work\Tomcat\localhost\ROOT\temp。
定位结论:是文件上传时,会将文件缓存到这个路径下。
定位阶段2:
(1)本地起这个java微服务,查看本地临时路径,上述的Temp\tomcat.8443.4503940563026842881\work\Tomcat\localhost\ROOT\temp路径,文件是否残留未删除。此路径上传完成会进行删除。微服务自己写的代码不涉及缓存本地以及删除操作,可以确认是框架自身实现的。
初步结论:代码是使用MultiPartFile进行上传的,初步怀疑是文件上传后,未调用这个MultiPartFile类的close或者delete方法导致的。
定位阶段3:
(1)查看MultiPartFile类的方法,查看是否有上述提到的MultiPartFile相关方法,没有找到类似方法。这个怀疑点被排除。又怀疑是不是少加了配置项导致的。通过对上传代码进行注释,空方法执行多次,不会出现df和du不一致问题。
(2)那就是自身代码问题。查看multipartFile类使用的getInputStream()方法可能导致此问题。经过试验确认确实这个导致的,InputStream未调用close()方法导致。

总结:如果不关闭文件流,则该文件被占用,就无法删除

微服务报错:no space left on device问题定位与解决相关推荐

  1. UMOUNT NAS报错No space left on device和was not found in /proc/mounts

    UMOUNT NAS报错No space left on device和was not found in /proc/mounts NAS_IP:/sysidc 表示NAS的存储设备. [root@m ...

  2. ubuntu安装xinetd服务报错 invoke-rc.d: policy-rc.d denied execution of restart解决

    ubuntu安装telnet服务报错 invoke-rc.d: policy-rc.d denied execution of restart解决 1.下载xinetd安装包 wget http:// ...

  3. Es微服务报错:type=action_request_validation_exception, reason=Validation Failed: 1: type is missing2: typ

    在搭建Elasticsearch微服务时报错 大概意思就是封装的数据中少了个type属性 但是在实体类上我添加了type属性 这里type已经显示过时了,我猜可能是过时的属性的数据就不会生效把 然后我 ...

  4. feign调用其他微服务报错未找到(实质是注入)

    刚开始代码报错: 换了一种写法: 可以看到不在报错,并且已经开始心跳检测, 再次简化写法: springBootApplication会扫描你的基础包,默认会扫描子包,结构不是太奇怪都不用特地去扫描 ...

  5. 初次搭建微服务报错java.Net.UnknownHostException

    按照教程一步一步往下走,感觉走的挺顺利的: (1)先搭建好集群版的两台服务中心:首先引入Eureka-server的相关的依赖,其次yml文件中添加以下配置: 注册中心1: server: port: ...

  6. Go微服务报错protoc-gen-go: unable to determine Go import path for

    问题 $ protoc --go_out=./ hello.proto protoc-gen-go: unable to determine Go import path for "hell ...

  7. 迅速解决!!!!!启动Tomcat报错PermGen space

    启动Tomcat报错   PermGen space    内存溢出 解决方法:扩大tomcat内存 修改参数:set JAVA_OPTS=-Xms1024m -Xmx1024m -XX:PermSi ...

  8. cmd 顺序启动服务_window下启动redis步骤和服务报错解决办法

    window下启动redis的步骤: 打开一个 cmd 窗口 使用 cd 命令切换目录到 C:redis 运行: redis-server.exe redis.windows.conf 如果想方便的话 ...

  9. Ambari删除服务报错之CSRF protection is turned on

    Ambari安装组件失败后执行 curl 删除服务报错 CSRF protection is turned on X-Requested_By HTTP Header is required 解决方案 ...

最新文章

  1. Django error信息邮件通知功能配置部署
  2. chrome 不支持12px以下字体为题的解决
  3. 互联网架构阶段 数据库读写分离 Amoeba
  4. Android RotateAnimation详解
  5. hadoop设置java环境_hadoop安装(3)_Linux配置JDK环境
  6. SAP License:关于MRP产生的采购申请检查、与采购部的衔接处理
  7. 在应用中集成科大讯飞的语音识别技术
  8. 连接Oracle9i,因字符集造成乱码的解决方法
  9. docker elasticsearch安装
  10. 竞品分析2020——铁路售票系统
  11. 网页中打开msn窗口方法
  12. 轴系ansys命令流建模
  13. 《系统集成项目管理工程师》必背81-100题
  14. Conflux人物志 | 柠檬树上柠檬果,柠檬树下他和他
  15. Android知识梳理:点击事件分发机制
  16. Winfrom 常用控件(二)
  17. 时统ptp_IEEE1588 PTP对时系统原理及特点
  18. checkio Evenly Spaced Trees
  19. 京东云服务器搭建php开发环境
  20. python 制作刷题程序

热门文章

  1. Qt自定义控件------SwitchButton
  2. python抓取动态数据 A股上市公司基本信息
  3. 硬盘安装到计算机里面读不出来的,新买的硬盘怎么使用?安装到电脑上系统里不显示怎么办?...
  4. 我的左脚疼,你的右脚会疼吗?
  5. STM32串口调试,调试助手没有打印信息?
  6. 个人项目需求和分析------日程管理APP
  7. 控制器-----controller
  8. 4G AI 智能模块 - MT8788 (I500P)
  9. 独立站网红营销怎么做
  10. R语言datacamp搬运日记