线上问题排查命令总结
2016-09-27 10:51
330 查看
原文地址:http://blog.csdn.net/liuzhengyang1/article/details/52573764
需要做好监控和报警,打日志要准确规范。
top
vmstat 1
iostat 1
dstat
pidstat 1
sar -n DEV 1
free -m
netstat -anpt
netstat -ntp | grep ‘TIME_WAIT’ | awk ‘{print 5,6}’
| awk -F ‘:’ ‘{print 1,2}’
| awk ‘{print 1,3}’
| sort | uniq -c | sort -k 1 -n -r
netstat -nt | grep 11300 | awk ‘{print 1}’ | sort | uniq -c 查看某个端口号的连接的主机数量统计
lsof -i:8080
lsof -p pid
du -h
jps -l
jps -lv
jinfo -flags pid
jstat -gcutil pid 1s
jstat -gccause pid 1s
查看gc.log
jstack -l
查看某个进行内占用cpu最多的进程
top -Hp pid
找到后,转换成16进行 printf ‘%x\n’ pid,如printf ‘%x\n’ 8241 得到2031
再在jstack 结果中查找这个线程号对应的线程是什么
jstack -l 中查看是否有死锁 #TODO
jmap -histor pid
jmap -histo:live pid
jmap -histo:live pid | less
jmap -heap pid
dump 内存文件 jmap -dump:format=b,file=dump.bin,live 8176
netstat 类 TODO
有root权限时,可以执行tcpdump
tcpdump -i eth0 tcp port 8888
查看TCP参数
less /etc/sysctl.conf
* 调用外部服务、远程方式的参数、结果上打印log
* 一些关键的步骤,打印参数等
* 异常处理的地方,打印参数,异常栈
这样就可以在程序抛出异常的时候,通过异常栈以及我们打印的参数快速的判断是哪里出现了问题。
在循环处理的地方,如果希望其中一个循环出错不影响其他循环的执行时,要在循环内部catch。
防御式拷贝
Defensive copy. 当一个方法返回一个对象时,我们要考虑外部调用方可能会修改这个对象的值,导致其他引用这个对象的地方
观察到状态改变。这种隐含的变化可能带来bug。通过defensive copy,返回一个新的对象,避免了共享对象。但是要注意的是,
copy也有深度copy和浅copy。另一种方式是返回一个不可修改的集合,如
如
* 服务依赖,各个环境的服务配置、服务是否存在
* 端口,是否和已有的程序的端口冲突了
* 权限,写文件或者日志目录是否有权限
另外还有maven引用jar包冲突的,会出现NoSuchMethodError等错误。
这个时候,找到哪个类的版本不一致,在代码中找到对应的依赖的jar包。
通过
maven 采用的是按照声明顺序靠前的使用。
当可以进行一定的调试时,只在staging环境或者有一个jsp页面可以调用java代码, 可以使用Class.forName(“xxx”).getClassLoader XXX.class.getResource(“xxx.yy.ZZZ”)来查看用的是那个地方的class文件。
也可以解压jar包,使用javap -v -p -c 查看class文件内容。
另外还有一些工具,像BTrace、housemd、greys来帮助我们线上调试。
需要做好监控和报警,打日志要准确规范。
性能类
诊断
uptimetop
vmstat 1
iostat 1
dstat
pidstat 1
sar -n DEV 1
free -m
网络
netstat -nltpnetstat -anpt
netstat -ntp | grep ‘TIME_WAIT’ | awk ‘{print 5,6}’
| awk -F ‘:’ ‘{print 1,2}’
| awk ‘{print 1,3}’
| sort | uniq -c | sort -k 1 -n -r
netstat -nt | grep 11300 | awk ‘{print 1}’ | sort | uniq -c 查看某个端口号的连接的主机数量统计
lsof -i:8080
lsof -p pid
load
io
磁盘
df -hdu -h
gc
jpsjps -l
jps -lv
jinfo -flags pid
jstat -gcutil pid 1s
jstat -gccause pid 1s
查看gc.log
jstack -l
查看某个进行内占用cpu最多的进程
top -Hp pid
找到后,转换成16进行 printf ‘%x\n’ pid,如printf ‘%x\n’ 8241 得到2031
再在jstack 结果中查找这个线程号对应的线程是什么
jstack -l 中查看是否有死锁 #TODO
jmap -histor pid
jmap -histo:live pid
jmap -histo:live pid | less
jmap -heap pid
dump 内存文件 jmap -dump:format=b,file=dump.bin,live 8176
tcp
ifconfig查看有哪些网卡和相应的参数,ip,mtu等netstat 类 TODO
有root权限时,可以执行tcpdump
tcpdump -i eth0 tcp port 8888
查看TCP参数
less /etc/sysctl.conf
查看多台机器的工具
polysh代码类
抛异常
编写代码时要在关键的位置* 调用外部服务、远程方式的参数、结果上打印log
* 一些关键的步骤,打印参数等
* 异常处理的地方,打印参数,异常栈
这样就可以在程序抛出异常的时候,通过异常栈以及我们打印的参数快速的判断是哪里出现了问题。
防御式编程
不要对外来的参数做假设,不要假设外部参数不是null或者其中任意一个属性不是null,都要进行判断,可以通过Preconditions类或
StringUtils.isNotEmpty、
CollectionUtils.isNotEmpty等进行防御。
在循环处理的地方,如果希望其中一个循环出错不影响其他循环的执行时,要在循环内部catch。
for (e in loop) { try { do loop } catch (Exception e) { log and exception handle } }
防御式拷贝
Defensive copy. 当一个方法返回一个对象时,我们要考虑外部调用方可能会修改这个对象的值,导致其他引用这个对象的地方
观察到状态改变。这种隐含的变化可能带来bug。通过defensive copy,返回一个新的对象,避免了共享对象。但是要注意的是,
copy也有深度copy和浅copy。另一种方式是返回一个不可修改的集合,如
Collections.unmodifiableCollection等。
启动类
java启动报错
经常出现的情况是,在本地开发没有问题、或是在staging测试也没问题,部署到线上启动就报错了。 这个时候还是需要在编写代码时就提前注意,有哪些用到了依赖于环境的地方。如
* 服务依赖,各个环境的服务配置、服务是否存在
* 端口,是否和已有的程序的端口冲突了
* 权限,写文件或者日志目录是否有权限
另外还有maven引用jar包冲突的,会出现NoSuchMethodError等错误。
这个时候,找到哪个类的版本不一致,在代码中找到对应的依赖的jar包。
通过
mvn dependency:tree| grep 进行查看有哪些地方引入了jar包。
maven 采用的是按照声明顺序靠前的使用。
当可以进行一定的调试时,只在staging环境或者有一个jsp页面可以调用java代码, 可以使用Class.forName(“xxx”).getClassLoader XXX.class.getResource(“xxx.yy.ZZZ”)来查看用的是那个地方的class文件。
也可以解压jar包,使用javap -v -p -c 查看class文件内容。
另外还有一些工具,像BTrace、housemd、greys来帮助我们线上调试。
相关文章推荐
- 线上问题排查命令总结
- 线上问题排查命令----JVM篇
- Java 开发必须掌握的线上问题排查命令
- 线上问题排查命令
- 线上问题排查命令----Shell篇
- 线上问题排查命令----Shell篇
- 排查线上问题常用的几个Linux命令
- Java开发必须掌握的线上问题排查命令
- Java排查问题工具、命令总结
- 线上问题排查命令----JVM篇
- 线上内存溢出问题排查<实践篇>
- adb常用命令及遇到的问题总结
- 【转】线上问题排查的常用工具和方法
- PowerShell中运行CMD命令的技巧总结(解决名称冲突和特殊字符等问题)
- Java线上排查总结
- HBase工程师线上工作经验总结----HBase常见问题及分析
- 线上问题排查(2)——JDK内置工具
- 线上问题解决的自我总结
- 服务器问题排查常用命令
- 线上too many open files问题排查记录