1. 介绍

原本打算自己总结一下的。但是觉得人家总结的很好,我这里就不浪费笔墨了,给大家推荐一下文章即可。

  1. linux后端诊断与调试技术
  2. PPT-JVM问题定位和排错

下面我对文章中可以重点关注的一些点做一下强调。大家看的时候可以留意下。

2. 查找JAVA进程中消耗CPU最多的线程

这个问题大家可能经常碰到。传统的做法是:

  1. top命令找出有问题Java进程及线程id:
    a. 开启线程显示模式(shift+h)
    b. 按CPU使用率排序(shift+p,如果按照内存排就shift+m)
    c. 记下Java进程id及其CPU高的线程id

  2. 用进程id作为参数,jstack有问题的Java进程

  3. 手动转换线程id成十六进制(可以用printf %x 1234)

  4. 查找十六进制的线程id(可以用grep)

  5. 查看对应的线程栈

如果每次都这么来一趟,难免有点繁琐。有心的小伙伴已经写了个shell脚本完成以上操作,详情见:show-busy-java-threads.sh

3. ss命令代替netstat

一般查看端口占用都会用netstat命令。例如netstat -nat| grep port来查看TCP端口占用。ss命令在显示内容上更加详细快速和高效。

为啥用ss代替netstat可以参考文章:运维小技巧:使用ss命令代替 netstat

关于ss命令的使用方法可以参考文章:

  1. ss命令和Recv-Q和Send-Q状态
  2. Linux网络状态工具ss命令使用详解

重点掌握以下参数即可:

  1. ss -at : 显示TCP连接
  2. ss -s : 显示sockets摘要
  3. ss -lp: 显示进程使用的socket

4. vmstat和sar工具的使用

两个工具都可以按照一定的采样间隔输出监控信息。

此外文中提到的dstat工具也可以关注下。

4.1 vmstat

如果CPU的sy和us值相加的百分比接近100%,或者运行队列(r)中等待 的进程数总是不等于0,且经常大于4,同时id也经常小于40,则该系 统受限于CPU;如果bi、bo的值总是不等于0,则该系统受限于内存。 swpd值过高一般情况由于物理内存不够用.

4.2 sar

输出项说明:

  1. CPU:all 表示统计信息为所有 CPU 的平均值。
  2. %user:显示在用户级别(application)运行使用 CPU 总时间的百分比。
  3. %nice:显示在用户级别,用于nice操作,所占用 CPU 总时间的百分比。
  4. %system:在核心级别(kernel)运行所使用 CPU 总时间的百分比。
  5. %iowait:显示用于等待I/O操作占用 CPU 总时间的百分比。
  6. %steal:管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟 CPU 的百分比。
  7. %idle:显示 CPU 空闲时间占用 CPU 总时间的百分比。

解释:

  1. 若 %iowait 的值过高,表示硬盘存在I/O瓶颈
  2. 若 %idle 的值高但系统响应慢时,有可能是 CPU 等待分配内存,此时应加大内存容量
  3. 若 %idle 的值持续低于1,则系统的 CPU 处理能力相对较低,表明系统中最需要解决的资源是 CPU 。

5. 工具总结

linux后端诊断与调试技术一文中对于工具的总结挺好用的,这里记录下作为参考用。