iostat、netstat与jstat:系统资源监控与性能优化工具详解

iostat是Linux系统下的一个命令行工具,用于监控系统的磁盘I/O活动情况和CPU使用情况。

以下是iostat命令的示例用法及输出结果:

  1. 查看磁盘I/O活动情况:
iostat -d -k -x 5 1

输出结果示例:

Device:  rrqm/s wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda        0.09   2.04    0.19    0.95     3.14    17.89    36.19     0.01    7.30    4.56    8.20   0.38   0.05

它的输出参数包括:

  1. Device:这是磁盘设备的名称。
  2. tps:这是每秒钟传输的I/O请求次数。如果这个数值很高,可能说明磁盘I/O成为了系统的瓶颈。
  3. kB_read/s:这是每秒钟读取的数据量,以KB/s为单位。如果这个数值很高,可能说明读操作是系统的瓶颈。
  4. kB_wrtn/s:这是每秒钟写入的数据量,以KB/s为单位。如果这个数值很高,可能说明写操作是系统的瓶颈。
  5. kB_read:这是读取的总数据量,以KB为单位。
  6. kB_wrtn:这是写入的总数据量,以KB为单位。
  7. %util这是设备的利用率,即设备正在工作的时间所占总时间的百分比。如果这个数值接近100%,说明设备几乎一直在工作,可能需要优化磁盘I/O。
  8. %iowait这是等待I/O完成的时间所占CPU时间的百分比。如果这个数值很高,可能说明磁盘I/O是系统的瓶颈。
  9. rrqm/s:这是每秒钟从硬盘读取的请求次数。
  10. wrqm/s:这是每秒钟向硬盘写入的请求次数。
  11. r/s:这是每秒钟从硬盘读取的数据块数。
  12. w/s:这是每秒钟向硬盘写入的数据块数。
  13. rsec/s:这是每秒钟从硬盘读取的扇区数。
  14. wsec/s:这是每秒钟向硬盘写入的扇区数。
  15. avgrq-sz:这是平均每次I/O操作的数据大小。
  16. avgqu-sz这是平均I/O操作队列的长度。如果这个数值很高,可能说明磁盘I/O是系统的瓶颈。
  17. await这是平均每次I/O操作的等待时间。如果这个数值很高,可能说明磁盘I/O是系统的瓶颈。
  18. svctm:这是平均每次I/O操作的服务时间。
  19. r_await:这是读取操作的平均等待时间。如果这个数值很高,可能说明读操作是系统的瓶颈。
  20. w_await:这是写入操作的平均等待时间。如果这个数值很高,可能说明写操作是系统的瓶颈。

在问题分析过程中,iostat命令可以帮助我们找出系统瓶颈。例如,如果%util和%iowait都很高,说明磁盘I/O可能是系统的瓶颈。我们可以通过优化磁盘I/O,例如增加磁盘队列长度或更换更快的磁盘,来提高系统性能。同时,iostat命令还可以帮助我们了解应用程序的I/O模式,例如读操作多还是写操作多,从而帮助我们优化应用程序的I/O使用。

在iostat的输出参数中,r_await和w_await分别表示读取和写入操作的平均等待时间。如果这两个数值很高,可能说明读或写操作是系统的瓶颈。我们可以通过优化应用程序的I/O使用或者增加磁盘I/O带宽来降低这两个数值,从而提高系统性能。

  1. 查看CPU使用情况:
iostat -c 5 1

输出结果示例:

Linux 3.10.0-123.el7.x86_64 (localhost)   05/12/2023      _x86_64_        (1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.09    0.00    0.89    0.02    0.00   99.00

上述输出中,avg-cpu表示平均CPU使用情况,%user表示用户态CPU使用率,%nice表示优先级调整的CPU使用率,%system表示系统态CPU使用率,%iowait表示等待I/O完成的CPU使用率,%steal表示被其他虚拟机或进程占用的CPU使用率,%idle表示空闲CPU使用率。

jstat是Java虚拟机(JVM)提供的一个命令行工具,用于监控JVM的性能和垃圾回收(GC)情况。它可以提供有关堆内存使用、GC次数、GC时间等信息。

以下是jstat命令的示例用法及输出结果:

  1. 查看GC次数和时间:
jstat -gcutil <进程ID> <间隔时间> <重复次数>

输出结果示例:

S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
0.00   0.00   0.00   0.00   0.00   0.00      0    0.000     0    0.000    0.000

上述输出中,S0、S1、E、O、M和CCS分别表示Survivor空间0、Survivor空间1、Eden区、老年代、元空间和压缩类空间的使用率。YGC和YGCT分别表示年轻代GC次数和总耗时,FGC和FGCT分别表示Full GC次数和总耗时,GCT表示总GC耗时。

  1. 查看堆内存使用情况:
jstat -heap <进程ID>

输出结果示例:

Compiled Theap Size  (max)      123456 Kbytes
Heap Size      (used)       12345 Kbytes
Heap Size      (free)       11111 Kbytes
Heap Size      (max)       123456 Kbytes
Heap Size      (committed) 123456 Kbytes

上述输出中,Compiled Theap Size (max)表示最大堆大小,Heap Size (used)表示已使用的堆大小,Heap Size (free)表示空闲的堆大小,Heap Size (max)表示最大可用堆大小,Heap Size (committed)表示已提交的堆大小。

  1. 查看垃圾回收情况:
jstat -gc <进程ID> <间隔时间> <重复次数>

输出结果示例:

S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
1234   1234   1234   1234   123456   123456   1234567   1234567   123456 123456 1234 1234     15    0.123     2    0.234    0.357

上述输出中,S0C、S1C、S0U、S1U、EC、EU、OC、OU、MC和MU分别表示不同区域的容量和使用量。CCSC和CCSU分别表示压缩类空间的容量和使用量。YGC和YGCT分别表示年轻代GC次数和总耗时,FGC和FGCT分别表示Full GC次数和总耗时,GCT表示总GC耗时。

你可能感兴趣的:(性能优化,java,jvm,mysql,spring,后端)