问题记录积累

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 日常文件记录

问题描述

下午接到同事反馈文件上传功能不能使用,想了想最近也没改动什么啊,只是加了一个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日志并进行多维度分析。
目录
相关文章
|
5月前
|
存储 监控 安全
【实战经验】记录项目开发常见的8个难题
风沙席地起,战马踏风归!
293 23
|
5月前
|
搜索推荐
总是拿不下大客户 不妨从它的企业全历史行为数据里找找思路
在ToB领域,攻克大客户是一项复杂战役,需要综合团队能力、销售技巧及多方面因素。新工具——企业全历史行为数据,类似企业时间轴,但更庞大复杂,包含全面的行为记录。这种数据能帮助销售人员深入理解客户偏好,提供全场景接触点,甚至比客户自己更了解他们,从而提升营销策略的精准度和效果。利用这种数据可以打破传统沟通限制,创造更多机会。尝试运用企业全历史行为数据,或能为大客户营销打开新思路。
|
4月前
|
前端开发 JavaScript 容器
记录我的小厂一面,请准备好水 (一)
记录我的小厂一面,请准备好水 (一)
|
6月前
|
机器学习/深度学习 数据采集 人工智能
技术心得记录:对比学习(contrastivelearning)
技术心得记录:对比学习(contrastivelearning)
36 0
|
7月前
|
数据库
个人日记系统,记录点滴小事,记录生活点点滴滴
个人日记系统,记录点滴小事,记录生活点点滴滴
52 0
|
7月前
|
Java
DashVector实践记录
DashVector内测期间,在业务场景中实践落地了向量检索。
|
SQL 缓存 数据库
记录一次批量插入的优化历程
一、前言     测试妹子反馈了一个bug,说后台报了个服务器异常——保存一个数量比较大的值时,比如 9999,一直在转圈圈,直到最后报了一个服务器异常。我接过了这个bug,经过仔细查看代码后发现,代码卡在了一个批量插入的SQL语句上,就是比如前端保存 9999 的时候,后端的业务逻辑要进行 9999 次的批量插入。
2139 0
|
消息中间件 运维 监控
200张表,单表记录过亿,10多年核心老系统的重构之旅
200张表,单表记录过亿,10多年核心老系统的重构之旅
476 0
200张表,单表记录过亿,10多年核心老系统的重构之旅
|
SQL 运维 监控
重视失败是让公司成长的几条规则
重视失败是让公司成长的几条规则
232 0
|
Linux
技术生涯记录
版权声明:本文为半吊子子全栈工匠(wireless_com,同公众号)原创文章,未经允许不得转载。
675 1