java性能分析--基于操作系统的分析之磁盘

315 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情

上一篇提到CPU的一些监控操作,本篇来看下关于磁盘的内容。监控磁盘的使用率非常关键,无论是应系统的系统日志,还是各种数据库,甚至中间件的持久化操作,都会涉及到磁盘IO。

其实多数情况下我们要考虑的还是应用本省。如果应用的业务是做磁盘的大量IO,那么磁盘的IO性能, 就可能称为系统的瓶颈。

Linux的磁盘监控

我们可以通过iostat查看系统的磁盘IO。iostat 主要用于输出磁盘IO 和 CPU的统计信息。

首次使用需要我们安装一下,它是属于sysstat软件包,安装如下:

 yum install sysstat

使用帮助如下:

[root@hecs-402944 ~]# iostat -help
用法: iostat [ 选项 ] [ <时间间隔> [ <次数> ] ]
选项:
[ -c ] [ -d ] [ -h ] [ -k | -m ] [ -N ] [ -t ] [ -V ] [ -x ] [ -y ] [ -z ]
[ -j { ID | LABEL | PATH | UUID | ... } ]
[ [ -T ] -g <用户组名> ] [ -p [ <设备> [,...] | ALL ] ]
[ <设备> [...] | ALL ]

其中选项的含义如下:

  • -c:  显示CPU使用情况
  • -d:  显示磁盘使用情况
  • -N:  显示磁盘阵列(LVM) 信息
  • -n:  显示NFS使用情况
  • -k: 以 KB 为单位显示
  • -m: 以 M 为单位显示
  • -t:  报告每秒向终端读取和写入的字符数和CPU的信息
  • -V: 显示版本信息
  • -x:  显示详细信息
  • -p: 磁盘显示磁盘和分区的情况

使用方式如下:

[root@hecs-402944 ~]# iostat -xm  
Linux 3.10.0-1160.15.2.el7.x86_64 (hecs-402944)         2022年05月30日  _x86_64_        (2 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.32    0.00    0.12    0.01    0.00   99.55

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
vda               0.00     0.48    0.00    0.68     0.00     0.01    16.94     0.00    1.29    4.03    1.28   0.93   0.06

上面分别展示了cpu和磁盘的信息,-xm表示以M为单位的详细信息,其含义如下:

  • rrqm/s:  每秒进行 merge 的读操作数目。
  • wrqm/s  每秒进行 merge 的写操作数目。
  • r/s  每秒完成的读 I/O 设备次数。
  • w/s  每秒完成的写 I/O 设备次数。
  • rMB/s  每秒读M字节数。
  • wMB/s  每秒写M字节数。
  • avgrq-sz  平均每次设备I/O操作的数据大小 (扇区)。
  • avgqu-sz  平均I/O队列长度。
  • rsec/s  每秒读扇区数。
  • wsec/s  每秒写扇区数。
  • await  平均每次设备I/O操作的等待时间 (毫秒)。
  • r_await 每个读操作平均所需的时间,不仅包括硬盘设备读操作的时间,还包括了在内核队列中等待的时间。
  • w_await 每个写操作平均所需的时间。不仅包括硬盘设备写操作的时间,还包括了在内核队列中等待的时间。
  • svctm  平均每次设备I/O操作的服务时间 (毫秒)。
  • util  一秒中有百分之多少的时间用于 I/O 操作,即被io消耗的cpu百分比

通过上面的参数返回值,我们可以发现当前磁盘存在的问题。

比如当util达到100%,那说明磁盘已经满负载了。同时iowait的百分比很高,说明有线程正在等待磁盘IO。

除此之外,监控磁盘还能够监控系统是否在进行内存交换

计算机的内存是固定大小的,但是可以使用更大的磁盘作为虚拟内存来运行应用,操作系统可以将暂时不用的内存保存在磁盘上,在需要时换页到物理内存当中。

通常来说,这种虚拟内存的方式更加适用于我们的笔记本,对于服务器来说,效果并不是很好。比如我们运行在虚拟机上的java程序。

正在进行内存交换的应用,无论是数据从内存到磁盘,还是磁盘到内存,性能都比较差。

我们前面使用的命令vmstat,其中的si,so就分别反映了内存交换式时,是换进,还是换出。