Linux系统之运行状态分析及问题排查思路


〇、一件事儿

以下分析是站在Java工程师的角度来分析的。

top命令:第1部分。

  1. 怎么看load average的值?
    通常先看15分钟的load值,如果load很高,再看1分钟和5分钟的load值,查看是否有下降趋势。短时间内load值高,无须太担心;但是如果长时间内load值持续过高,那么就要赶紧看看发生了什么。

  2. 需要警惕的load average的值(以单核CPU为例):

    • load值持续大于0.7,必须开始找问题出在哪里,防止情况恶化;
    • load值持续大于1.0,解决问题已迫在眉睫;
    • load值持续大升高达到5.0,表示各种请求几乎得不到响应,机器几近崩溃;

    对于多核机器,则需要根据CPU个数来判断系统负载是否过高。如,若认为0.7算是单核机器负载的安全线的话,则四核机器的负载最好保持在3(4*0.7 = 2.8)以下。

2、CPU利用率分析

  1. 看CPU的空闲率,用户进程CPU使用率和系统进程CPU使用率。
  2. 看个别进程的CPU利用率是否明显高于其他进程:
    • 死循环?
    • 复杂计算?
    • 超大对象耗时读写?

查看CPU利用率,见top命令:第3部分和第5部分。

3、综合两个分析

  1. CPU利用率高,系统负载低
    • 死循环?
    • 复杂计算?
    • 超大对象耗时读写?
  2. 系统负载高,CPU利用率低
    • 大量进程执行IO操作 -> 中断和上下文切换
      • 磁盘IO -> 使用阻塞IO时,进程状态为D
      • 网络IO -> 使用阻塞IO时,进程状态为D
    • 频繁中断,上下文切换
  3. 系统负载高,CPU利用率高
    • 大量进程出现死循环?
    • 大量进程进行复杂计算?
    • 大量进程对超大对象耗时读写?
    • 内存不足,频繁GC? -> 硬件无法支撑应用,升级机器?

free命令和top命令:第5部分。

pidstat命令找到I/O读写高的进程;

查看I/O读写状况,见iostat命令。

netstat命令和tcpdump命令。

六、磁盘分析

就是线上机器磁盘快满了,看看是否有无用的文件占用磁盘空间。

  1. df -h,看看磁盘的使用情况
  2. 看看日志目录,是不是有不需要的
  3. find / -size +100M | xargs ls -lh,找找大于100M的大文件
  4. du -h > xx.log,看看各个目录占用磁盘的大小,看看是不是哪个目录有大量的小文件

七、排查思路

  1. 系统负载、CPU利用率、内存、I/O、网络、磁盘等因素综合考虑,才是解决问题的关键。
  2. 先整体分析哪块问题,再定位特征进程(例如CPU利用率明显高于其他进程的进程),进而结合jstack定位到线程和代码。