问题记录积累

简介: 日常文件记录

问题描述

下午接到同事反馈文件上传功能不能使用,想了想最近也没改动什么啊,只是加了一个Interceptor记录用户的操作记录,当时也测试过了,没有问题,都能正常记录,应该不会有问题

问题表现

选择一个文件上传,发现过一会就上传失败


一开始觉得是一个偶发现象,尝试了好几次发现都是同样的问题,于是赶紧查问题的原因,首先看一下日志,由于请求是先打到nginx上,因此先去看一下nginx日志,nginx日志如下:

多次尝试发现每次过了15snginx就返回超时,页面也就返回失败,一开始怀疑是不是将nginx的响应超时时间修改一下就可以,于是找到nginx.conf将

`proxy_read_timeout 15s` 改成大一点 60s

重启后发现居然没起作用,还是15s就超时,开始怀疑人生了,是不是改错了,各种百度查是不是还有其他配置要改,各种改,各种重启发现还是15秒就超时,日了狗了,冷静的想了想,是不是没重启成功,于是kill到进程,重启了一下 nginx,发现果然起做了,60s才超时,但是问题还是没有解决。这怎么办呢,啥也不说先看一下代码吧。

业务代码

发现业务代码里面就 打了两个日志

开始上传 - FileUtils.copy - succes

发现还好业务有打日志,那么找一个小文件试一下吧,看看业务处理时间有少,找了一个小文件,发现上传还是很慢,还好走到业务处理的部分了,发现业务处理非常快

那是怎么回事呢?业务代码应该没有问题啊,那只能从头开始了。分一下几个步骤查问题。

客户端到NGINX

只能先看看客户端到nginx是不是慢,一点点排除吧, 看了一下 nginx 会在nginx/cache/proxy 下缓存文件,于是找个大文件上传,看一下改文件夹是否生成临时文件比较慢,实际测试发现,很快就生成了临时文件。那说明其实客户端到NGINX并不慢。

NGINX到TOMCAT

既然客户端到NGINX不慢,那是不是NGINX到TOMCAT比较慢呢,理论上这个假设应该是不成立,NGINX和TOMCAT部署在同一台机器上,不可能慢。要么先把TOMCATMOCK掉,看看不连TOMCAT是不是很快,用 nc -l 命令mock了TOMCAT,发现非常快。那问题可能出现在这里。为了验证这个问题,由于TOMCAT上传文件时,也会先生成一个临时文件,找到这个生成临时文件的目录,发现这个临时文件也生成的很快,我擦,那这个说明 NGINX和TOMCAT之间的传输也没有问题,这个结果页符合预期。

TOMCAT线程问题

经过上面的分析,应该就是TOMCAT本身所在的业务处理线程的问题,但是明明业务代码里面也没做什么啊,而且日志从开始上传到成功上传很快。 这就奇怪了。由于在服务器上,也无法debug了。于是本地试debug一下,奇怪的是本地也很快。 看来在本地还复现不了

线上处理

只能dump一个线程堆栈了,jstack -l pid, dump出来线程堆栈后,原因很明显了:

"http-nio-8881-exec-7" daemon prio=10 tid=0x00007f7af1515000 nid=0x471a runnable [0x000000004291a000]

java.lang.Thread.State: RUNNABLE

at java.util.Arrays.copyOf(Arrays.java:2882)
at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:100)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:390)
at java.lang.StringBuilder.append(StringBuilder.java:119)
at com.**.**.**.interceptor.LogInterceptor.getBodyString(LogInterceptor.java:101)
at LogInterceptor.preHandle(LogInterceptor.java:55)
at org.springframework.web.servlet.HandlerExecutionChain.applyPreHandle(HandlerExecutionChain.java:134)

原来线程一直在copy,看到代码果然是一直在copy。 找到问题修复就容易了

问题总结

  1. 这个问题其实本地就可以发现,只不过自以为最近没什么修改啊,本地其实不是最新的代码,导致线上问题在本地复现不了
  2. 出现问题,不能冷静的思考,总是怀疑组件的问题,觉得不是自己的问题
  3. 出现这个问题应该直接就 jstack -l 看一下,兜了一大圈
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
8天前
|
自然语言处理 Java 索引
BoolQueryBuilder 查询name 为liming的记录 【4月更文挑战第3天】
如果你需要使用Elasticsearch的BoolQueryBuilder来查询name字段精确为"liming"的记录,你可以简单地使用TermQueryBuilder来实现。TermQuery用于精确匹配文档的一个字段。这种查询非常适合用于不分词的字符串字段(例如keyword类型的字段)或者数字、日期等类型的字段。 以下是使用BoolQueryBuilder和TermQueryBuilder查询name字段为"liming"的Java代码示例: java Copy code import org.elasticsearch.index.query.BoolQueryBuilder;
|
2月前
|
数据库
个人日记系统,记录点滴小事,记录生活点点滴滴
个人日记系统,记录点滴小事,记录生活点点滴滴
17 0
|
11月前
|
测试技术 数据处理
【面试题】近期学员被问最多的真实面试题记录(如何分配测试任务?)
【面试题】近期学员被问最多的真实面试题记录(如何分配测试任务?)
|
SQL 弹性计算 运维
《大数据》学习体验记录
本期实战体验内容主要培训大数据技术实战。
76 0
|
SQL 运维 监控
重视失败是让公司成长的几条规则
重视失败是让公司成长的几条规则
183 0
|
存储 人工智能 运维
阿里云存储团队招聘贴(技术岗位)【2020.07.28更新】
我们相信技术的力量,更相信拥有技术力量的人。 我们期待存储的未来,更期待与你一起创造未来。
3831 0
Uma
|
存储 运维 数据库
运维宝典 | 数据千万条,备份第一条,数据找不回,老板两行泪
请带着你的回忆看下文,想想你这些年删过的库,被删过的库。。。
Uma
6141 0
|
C++
VS历程简单记录
当时一开始装VS2015,是用了很长时间了。装了之后是可以用的,打了不少代码的。 后来很长一段时间没用它了,时隔良久,双击快捷方式竟然打开不了,让我“重装”。
874 0
自我简历构建记录
版权声明:转载请注明出处:http://blog.csdn.net/dajitui2024 https://blog.csdn.net/dajitui2024/article/details/79396312 推荐阅读 简历首先应该保证真实,现实存在很多简历造假 首先是基本信息,大家肯定都会写到。
941 0