您现在的位置是:首页 >其他 >Linux性能学习(3.2):IO_磁盘IO网站首页其他

Linux性能学习(3.2):IO_磁盘IO

Stoneshen1211 2024-10-04 12:01:05
简介Linux性能学习(3.2):IO_磁盘IO


参考资料:
1. Linux I/O模型
2. 判断磁盘I/O是否饱和与%util指标的意义
3. 磁盘利用率和饱和度
4. 辩证看待 I/Ostat

1 简介

在上一篇中,大致了解了文件系统的一些知识,了解了不同的文件系统以及VFS的概念,其实在存储介质上也是有这个情况,在嵌入式开发中,会根据不同的项目使用不同的存储介质:spi flash、emmc flash、nor flash、nand falsh等等,不同的存储介质在系统中则会有不同的设备驱动程序。

因此,系统会类似于VFS的做法,抽象一层(通用块层)在块设备驱动和文件系统之间,这样用户直接访问标准接口即可,不用关心不同驱动程序的差异。通用块层也会将文件系统的I/O请求根据自身算法进行处理,用于提高磁盘的吞吐量以及效率。

2 性能参数

磁盘的性能主要有3个参数:IOPS、吞吐量、响应时间。另外还有几个其它参数:使用率、饱和度、平均I/O、等待队列长度。

2.1 IOPS

每秒的I/O请求数,即每秒磁盘连续读次数和连续写次数之和。
随机读写频繁的应用,如传输小块不连续数据等情况,此参数有重要的参考意义。

2.2 吞吐量

每秒的I/O请求大小,即每秒读出数据和写入数据之和。
顺序读写频繁的应用,如传输大量连续数据等情况,此参数有重要的参考意义。

2.3 响应时间

指I/O请求从发出到收到响应的间隔时间。

2.4 使用率

即磁盘处理I/O的时间百分比,或者说是磁盘处于活动时间的百分比。

2.5 饱和度

磁盘处理I/O的繁忙程度。如果饱和度为100%,则无法接受新的I/O请求。

2.6 平均I/O

吞吐量除以IOPS,用于表示磁盘的使用模式。一般情况下,如果平均I/O小于32K,可以认为磁盘以随机存取为主,否则则是以顺序存取为主。

2.7 等待队列长度

指待处理的I/O请求数目,如果I/O请求压力超出磁盘的处理能力,该值将增加。

3 磁盘I/O命令查看

可以使用指令# cat /proc/diskstats或iostat来查看磁盘I/O相关参数:

# cat /proc/diskstats 
   7       0 loop0 10 0 32 0 0 0 0 0 0 0 0
   7       1 loop1 0 0 0 0 0 0 0 0 0 0 0
   7       2 loop2 0 0 0 0 0 0 0 0 0 0 0
   7       3 loop3 0 0 0 0 0 0 0 0 0 0 0
   7       4 loop4 0 0 0 0 0 0 0 0 0 0 0
   7       5 loop5 0 0 0 0 0 0 0 0 0 0 0
   7       6 loop6 0 0 0 0 0 0 0 0 0 0 0
   7       7 loop7 0 0 0 0 0 0 0 0 0 0 0
  11       0 sr0 0 0 0 0 0 0 0 0 0 0 0
   2       0 fd0 1 0 8 76 0 0 0 0 0 76 76
   8       0 sda 190663 87763 5283924 2983996 40694 92425 4478994 3434064 0 880296 6422176
   8       1 sda1 134 27 10514 1744 10 5 42 948 0 1924 2692
   8       2 sda2 81 7 6664 956 208 1636 14752 3476 0 4304 4432
   8       3 sda3 190369 87729 5262610 2981088 40476 90784 4464200 3429640 0 876900 6414852

#iostat -d -x
Linux 4.15.0-142-generic (st) 	2022年12月06日 	_x86_64_	(2 CPU)

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
loop0             0.00     0.00    0.00    0.00     0.00     0.00     3.20     0.00    0.00    0.00    0.00   0.00   0.00
fd0               0.00     0.00    0.00    0.00     0.00     0.00     8.00     0.00   76.00   76.00    0.00  76.00   0.00
sda               0.42     0.45    0.92    0.20    12.74    10.80    42.20     0.03   27.74   15.65   84.36   3.81   0.42
rrqm/s:每秒合并的读请求数;
wrqm/s:每秒合并的写请求数;
r/s:每秒发送给磁盘的读请求数;
w/s:每秒发送给磁盘的写请求数;
rkB/s:每秒从磁盘读取的数据量;
wkB/s:每秒向磁盘写入的数据量;
avgrq-sz:I/O请求的平均大小(以扇区为单位);
avgqu-sz:I/O请求的平均队列长度;
await:响应时间
r_await:读请求响应时间;
w_await:写请求响应时间;
svctm:处理I/O请求的平均时间;
%uti:使用率。

4 进程I/O命令查看

使用pidstat指令可以查看每个进程I/O的使用情况:

# pidstat -d 
24时32分17秒   UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s iodelay  Command
24时32分17秒     0         1      8.78      8.84      0.12     813  systemd
kB_rd/s:表示每秒读取的数据大小;
kB_wr/s:表示每秒写请求大小;
kB_ccwr/s:表示每秒取消的写请求数据大小;
iodelay :块I/O延迟,包括等待同步块I/O和换入块I/O结束的时间,单位是时钟周期。
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。