线上问题排查,一不小心踩到阿里的 arthas坑了
最近帮新来的校招同学排查一个线上问题,问题本身不是很难,但是过程中踩到了一个arthas的坑,挺有意思的。
同时,也分享下在排查过程中使用的一些比较实用的工具,包括tcpdump、arthas、simpleHTTPServer等,希望能对大家有所帮助。
1.问题描述
新开发的一个功能,简单来说,就是读取数据库的数据展示在前台。
本地启动服务调试,用postman调用api,返回数据显示正常,数据中的中文也正常。
但是部署到线上环境后,通过chrome浏览器调用和postman调用接口,返回的非中文数据正常,但是中文显示乱码。
2.排查思路
这个问题的第一反应是请求的content-type有问题。
不过在chrome浏览器中确认了请求的request和response的content-type都是application/json;charset=UTF-8,没有问题。
然后又google了一番乱码问题,基本上都是说的spring的HttpMessageConverter问题或者content-type,都无法解决。
只能深入排查一番了。
排查的主要思路就是先确定乱码是哪一步产生的。
- 一个就是数据库里查出来地方,需要用抓个包确认下,不过我们本地服务调用是正确的,那么这一步应该没有问题。
- 一个是应用服务返回的地方,需要用抓个包确认下。在线上部署环境里,用tcpdump把对应的应用服务返回数据是抓个包。
- 一个就是代码逻辑中存在数据转换,这个需要通过arthas看看线上应用的运行时数据情况。
3.用tcpdump抓包看服务端响应
3.1 什么是tcpdump呢?
tcpdump是linux下的网络数据包截获分析工具。在linux的日常网络管理中,tcpdump的使用频率很高,熟练掌握对提高工作效率很有帮助。
3.2 报文抓取
为了获取对应服务的请求报文,需要登录对应的服务器(或者k8s的pod)使用tcpdump进行抓取。
作为一个暖男,我把从安装到使用都一步步记下来给你 :)
1)安装工具
如果你的服务器上没有安装过tcpdump,可以先执行以下命令安装
yum -y install net-tools
2)查看网络状态
如果服务上有多个网卡,可以通过以下命令查看
Netstat -i
3)部署抓包
tcpdump -i eth0 tcp -w xxx.cap
- en0表示监听的网卡
- tcp表示报文类型
- -w 指定输出文件名
还有很多其他选项可以过滤使用,大家可以网上搜一下,这里就不展开了。
4)调用请求
部署了tcpdump后,对服务器发起api请求。这时候相关的tcp报文都会被输出到 xxx.cap文件中了。
3.3 报文解析
1)把xxx.cap文件发送本地
一般可以使用scp命令,直接发送
scp xxxx.cap admin@10.xxx.xxx.xxx:/path
在传输服务器的文件到本地时,如果scp不方便使用,比如一些防火墙限制。
也可以使用 python 在服务器上开启一个 web 服务(端口可自定义)。
python -m SimpleHTTPServer 18888 &
然后在本地使用 wget 下载文件即可。
2)解析cap文件
本地得到cap文件后,可以通过wireshark软件对cap文件进行解析,得到如下结果。
对api的报文进行解析后,发现返回对中文已经是乱码了,确认了在服务端发出的响应内容中,已经是乱码了。
所以,只能继续排查应用本身的问题。
4.用arthas排查线上运行代码
Arthas 是Alibaba开源的Java诊断工具,当你遇到以下类似问题而束手无策时,都可以尝试使用Arthas(更详细的用法参考官方文档:https://arthas.aliyun.com/doc/quick-start.html):
- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
- 遇到问题无法在线上 debug,又不想频繁加日志再重新发布
- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
4.1快速安装、启动
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
4.2 运行代码返回排查
本次排查,就使用了arthas的watch功能(更详细的用法参考官方文档:https://arthas.aliyun.com/doc/watch.html),能方便的观察到指定方法的调用情况。能观察到的范围为:返回值、抛出异常、入参。
我们先看看线上运行应用controller层对于请求的响应,无需添加日志重新部署,我们马上就能看到线上代码的返回结果。
watch xxx.xxx.controller method "{params,returnObj}" -x 2
然后发起api调用,在arthas中显示结果如下:
我们可以看到,这个controller方法返回的内容就是乱码了。
因此,说明是代码逻辑中存在转换的问题了。
5.问题定位
根据业务逻辑,基本能猜测是从业务中的 byte[] 转string的时候出现问题了。
找到对应代码如下,new string()时没有指定字符集:
因此会在转换过程中,默认读取系统变量的file.encoding作为字符集。
然后我们用arthas直接查看系统变量,果然不是utf8。
所以,解决方案有两个。
第一种是在new string(bytes) 时指定字符集。
第二种就是设置系统变量file.encoding=utf-8。
6.进一步踩坑
我们一开始选择了代码修复,在代码中转换时指定字符集。
重新发布后,再用arthas观察一下,发现竟然还是乱码?!!
然后重新回头在代码中看了很久,一直找不到原因,陷入了僵局。。。
突然,随手看了下线上,发现线上已经显示正常了,纳尼?是arthas有问题?
然后google了一下,发现很多人碰到arthas显示中文乱码的问题。。。
解决方式也比较简单,启动arthas的时候,也指定一下字符集。
java -jar -Dfile.encoding=UTF-8 arthas-boot.jar
然后问题解决了。。。呵呵。。。
这时候再观察arthas的结果已经显示正常。
这说明了什么?!!!!
Arthas输出界面的时候,肯定在字符串转换的时候,也没有指定字符集。。。。
一脚踩了个连环坑。。。
7.总结
其实整个问题是比较粗浅的,就是最后这个arthas的中文乱码让人有点脑壳疼。。。
当然,最主要还是简单分享下tcpdump、arthas、simpleHTTPServer这些小工具,希望能有所帮助吧。
都看到最后了,原创不易,点个关注,点个赞吧~
文章持续更新,可以微信搜索「阿丸笔记 」第一时间阅读,回复关键字【学习】有我准备的一线大厂面试资料。
知识碎片重新梳理,构建Java知识图谱:github.com/saigu/JavaK…(历史文章查阅非常方便)
线上问题排查,一不小心踩到阿里的 arthas坑了的更多相关文章
- Java架构师线上问题排查,这些命令程序员一定用得到!
Java架构师线上问题排查,这些命令程序员一定用得到! 线上问题排查,以下场景,你遇到过吗? 一.了解机器连接数情况 问题:1.2.3.4的sshd的监听端口是22,如何统计1.2.3.4的sshd服 ...
- Java线上问题排查神器Arthas快速上手与原理浅谈
前言 当你兴冲冲地开始运行自己的Java项目时,你是否遇到过如下问题: 程序在稳定运行了,可是实现的功能点了没反应. 为了修复Bug而上线的新版本,上线后发现Bug依然在,却想不通哪里有问题? 想到可 ...
- BTrace:线上问题排查工具
BTrace简介 GitHub地址:BTrace 下载地址:v1.3.11.3 官方使用教程:Btrace使用教程 使用场景 BTrace 是一个事后工具,所谓事后工具就是在服务已经上线了,但是发现存 ...
- 记一次线上bug排查-quartz线程调度相关
记一次线上bug排查,与各位共同探讨. 概述:使用quartz做的定时任务,正式生产环境有个任务延迟了1小时之久才触发.在这一小时里各种排查找不出问题,直到延迟时间结束了,该任务才珊珊触发.原因主要就 ...
- Java线上问题排查思路及Linux常用问题分析命令学习
前言 之前线上有过一两次OOM的问题,但是每次定位问题都有点手足无措的感觉,刚好利用星期天,以测试环境为模版来学习一下Linux常用的几个排查问题的命令. 也可以帮助自己在以后的工作中快速的排查线上问 ...
- 【转】又一次线上 OOM 排查经过
又一次线上OOM排查经过 最近线上一个服务又出现了频繁Full GC的情况,导致提供的业务经常超时.问题出现非常不稳定,经过两周的时候,终于又捕捉到了一次Full GC,于是联系运维做Heap Dum ...
- 线上问题排查神器 Arthas
线上问题排查神器 Arthas 之前介绍过 BTrace,线上问题排查神器 BTrace 的使用,也说它是线上问题排查神器.都是神器,但今天这个也很厉害,是不是更厉害不好说,但是使用起来非常简单.如果 ...
- JVM 线上故障排查基本操作--CPU飙高
JVM 线上故障排查基本操作 CPU 飚高 线上 CPU 飚高问题大家应该都遇到过,那么如何定位问题呢? 思路:首先找到 CPU 飚高的那个 Java 进程,因为你的服务器会有多个 JVM 进程.然后 ...
- java:线上问题排查常用手段(转)
出处:java:线上问题排查常用手段 一.jmap找出占用内存较大的实例 先给个示例代码: import java.util.ArrayList; import java.util.List; imp ...
随机推荐
- 【JAVA】JAVA相关知识点收集
下面这些链接都是我这段时间(7月-9月)看过的.感觉自己现在处于一个疯狂吸收知识的阶段,如果是文字的方式一点一点搬运到自己的博客既重复又费时间,只有等自己积累到一定程度后才能进行原创性高质量的产出吧. ...
- Redis可视化工具推荐
前言 Redis可视化工具目前好用的免费的几乎难以寻迹,百度能搜索到的推荐比较多的是Redis Desktop Manager 官网地址:https://redisdesktop.com/pricin ...
- C#实现创建、编辑NX表达式
在NX8.5中使用C#编辑表达式中有个坑,part.Expressions.Edit该方法鲁棒性很差,当表达式有错时也能编辑成功(手动在NX中增加错误表达式会有弹框,无法创建,而该方法却可以,疑是bu ...
- 获取NX一组属性
NX中的属性是可以分组的,有时我们想获取某一个组下的所有属性,但是NX封装的接口不够好用,因此在此基础上,我封装了一个,供大家参考: 1 //属性值是字符串类型,obj对象tag,category组名 ...
- Java随谈(二)对空指针异常的碎碎念
本文适合对 Java 空指针痛彻心扉的人阅读,推荐阅读时间25分钟. 若有一些Java8 函数式编程的基础可以当成对基础知识的巩固. 一.万恶的null 今天,我们简单谈谈null的问题.因为null ...
- Xmind 2020 破解教程
前言: 今天用xmind试用版记了会笔记,发现哎哟还真好用,于是乎我脑子一热,点击激活,发现年费好尼玛贵,瞬间我就冷静下来了. 于是乎,脑海里立马浮现出两个字:破解!好了废话不多说,直接上傻瓜教程.( ...
- Linux服务器内存监控—每小时检查&超出发送邮件&重启占用最高的Java程式
简介与优点 使用该脚本能自行判断系统内存使用情况是否超出设定百分比 能在超出预警值时执行重启程式的操作 能记录重启过程,并将具体LOG邮件发送给指定收信人 可以设定Crontab排程,达成每隔一段时间 ...
- centos 启动 elasticsearch 失败集
环境: elasticsearch 6.5.2, java 连接失败 启动后当你 使用 curl http://localhost:9200 测试时,得到如下结果 Curl: (7) Failed c ...
- win10 配置 maven | 下载与配置
<!-- 阿里云仓库 --> <mirrors> <mirror> <id>nexus-aliyun</id> <mirrorOf&g ...
- OneWire总线的Arduino库函数
OneWire总线基本点 One-wire总线是DALLAS公司研制开发的一种协议,采用单根信号线,既传输时钟,又传输数据而且数据传输是双向的.它具有节省I/O 口线资源.结构简单.成本低廉.便于总线 ...