Linux性能调优 再谈磁盘性能指标和进程级IO

我们在上一章中谈了磁盘的工作流程以及评价磁盘性能的几个典型指标,以及对这些指标做了简单的介绍和获取指标的工具。

今天我们对这些指标再重点谈一下,因为这些指标并不是孤立存在的,他们往往互相关联,而且同一种现象有时也需要好几种指标放在一起共同来判断。而且,除了这些表现整体性能的指标外,有时候我们还需要分析进程级别的I/O请求,来进一步分析问题产生的原因。

1、磁盘性能指标

简要回顾一下这几种指标:

使用率: 表示磁盘的繁忙程度,在一个采集周期处理I/O请求的时间百分比。
饱和度: 衡量的是磁盘队列的长度,即正在等待处理的I/O请求数量。
IOPS: 每秒的I/O操作次数,一般用来衡量磁盘处理请求的速度,特别对于大量小文件请求的业务时,这个值往往要求比较高。
吞吐量: 每秒的数据传输量,这个指标往往跟带宽存在着很大的关联。
响应时间: 一个I/O请求从发出到完成的时间,一般包含队列传输时间、队列等待时间还有磁盘处理时间。

这些指标的数值可以通过iostat工具来获取,那这些指标到底都有什么关联关系呢,我们分别来拆解一下。

  1. 使用率与饱和度: 当磁盘的使用率持续上升,甚至达到了100%,已经表明此时磁盘非常忙碌。这时再来新的请求,就有可能会进入排队状态,那饱和度的值就会急剧上升。但是反过来,如果磁盘处理能力比较弱或有故障了,出现突发的请求异常导致队列阻塞,使用率缺并一定非常高。

  2. 使用率与IOPS、吞吐量: 在磁盘的性能峰值极限之内,随着业务负载的升高,IOPS和吞吐量的值也会升高,伴随着使用率也会升高。当到达极限时,如果负载还在增加,IOPS和吞吐量的值不升反而可能会下降,因为请求产生排队或者发生不断重试,饱和度增加了。

  3. 响应时间与使用率、饱和度: 决定一个请求处理的足够快,必须满足网速足够快(传输时间短)、不需要排队(饱和度趋近0)、磁盘处理快(物理特性,固态盘>机械盘)。根据前文,如果使用率超过一定阈值,饱和度也会增加,从而导致响应时间急剧上升,业务直接表现就是变得非常卡顿。

  4. IOPS与吞吐量: 对于单个I/O请求比较小,例如4K,可能会达到磁盘的IOPS极限,吞吐量并不高。同样,如果单个I/O请求比较大,到了吞吐量的极限,可能最大的限制因素就是带宽了。

所以,我们在看待这几个指标时,需要综合的判断,根据业务使用再总结一下:

当负载(IOPS和吞吐量)慢慢增加时,使用率平稳增加,饱和度基本不变;但当负载到达一定高度时,响应时间就有增加,饱和度也开始增加了;负载到达100%时,饱和度就会快速增加,响应时间急剧上升。

了解清楚整体的性能指标后,我们再来看一下进程级别的I/O,以及用哪些工具来查看。

2、进程级别I/O

一般查看进程I/O主要使用pidstat、iotop、/proc文件系统等。

bash 复制代码
#Ubuntu系统安装pidstat、iotop  
sudo apt install iotop  
sudo apt install sysstat  
  
#/proc是系统自带  

1、使用 iotop -o -d 1 来实时观察线程的读写速度、IO等待时间百分比。

bash 复制代码
Total DISK READ :       0.00 B/s | Total DISK WRITE :     499.55 K/s  
Actual DISK READ:       0.00 B/s | Actual DISK WRITE:     436.22 K/s  
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND                                                                        
27464 be/4 root        0.00 B/s    3.52 K/s  0.00 %  0.76 % qemu-system-x86_64 -name guest=i-oxxx5~ci.0,addr=0xd -msg timestamp=on [worker]  
 1792 be/3 root        0.00 B/s   66.84 K/s  0.00 %  0.01 % [jbd2/sda3-8]  
  913 be/4 root        0.00 B/s  182.93 K/s  0.00 %  0.00 % systemd-journald

** DISK READ/DISK WRITE: ** 进程的实时读写速度,单位可能是 B/s、K/s、M/s

** IO>: ** IO等待时间百分比,也就是等待 IO 完成的时间占总运行时间的百分比,这个值越低越好。

** SWAPIN: ** 从swap交换到物理内存的时间百分比

** TID: ** 线程ID号

** PRIO: ** IO优先级

2、使用 pidstat -d 1 来不间断观察进程的IO统计,包括每秒读取(kB_rd/s)、每秒写入(kB_wr/s)。

bash 复制代码
root@node:~# pidstat  -d 1  
Linux 4.15.0-58-generic (cs1ahyper01n07)        11/13/2025      _x86_64_        (64 CPU)  
  
10:12:05 PM   UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s iodelay  Command  
10:12:06 PM     0       913      0.00      3.70      0.00       0  systemd-journal  
10:12:06 PM     0      2598      0.00    155.56      3.70       0  cron  
10:12:06 PM     0      4855      0.00     29.63      0.00       0  bkunifylogbeat  
10:12:06 PM   104     11940      0.00      3.70      0.00       0  rsyslogd  
10:12:06 PM     0     24244      0.00      7.41      0.00       0  qemu-system-x86  
10:12:06 PM     0     48974      0.00    485.19      0.00       0  qemu-system-x86  

PID:进程ID

kB_rd/s:每秒读取数据量(KB)

kB_wr/s:每秒写入数据量(KB)

kB_ccwr/s:每秒被取消的写入数据量(KB)

3、还可以看一下文件系统/proc,在 /proc/ /io 中查看。

bash 复制代码
#例如:  
cat /proc/123/io  
  
# 输出说明:  
rchar: 145678        # 读取的字符数(包括缓存)  
wchar: 234567        # 写入的字符数(包括缓存)  
syscr: 1234           # 读系统调用次数  
syscw: 5678           # 写系统调用次数  
read_bytes: 45678    # 实际物理读取的字节数  
write_bytes: 123456  # 实际物理写入的字节数  
cancelled_write_bytes: 12345  # 取消的写入字节数  

需要注意的是这个数据统计的是从进程启动之后累计的值,重启会重新计数。

有了这些观测数据,我们才能更好的针对从磁盘I/O整体到更细化的进程级I/O局部,清晰的观察性能的变化。

🔥运维干货分享




__

外链图片转存中...(img-wuvuEw3i-1764470444595)

相关推荐
虚伪的空想家1 小时前
云镜像,虚拟机镜像怎么转换成容器镜像
服务器·docker·容器·k8s·镜像·云镜像·虚机
wdfk_prog1 小时前
[Linux]学习笔记系列 -- [block][mq-deadline]
linux·笔记·学习
不过普通话一乙不改名2 小时前
Linux 网络收包的进阶之路:从普通 socket 到 AF_XDP 零拷贝
linux·运维·网络
Zeku2 小时前
20251125 - 韦东山Linux第三篇笔记【中】
linux·驱动开发
在路上@Amos2 小时前
Linux 命令行查看 串口hex数据
linux·运维·服务器
人工智能训练2 小时前
Linux 系统核心快捷键表(可打印版)
linux·运维·服务器·人工智能·ubuntu·容器·openeuler
大聪明-PLUS2 小时前
C++ 中的引用和引用类型
linux·嵌入式·arm·smarc
Vanranrr3 小时前
C++临时对象与悬空指针:一个导致资源加载失败的隐藏陷阱
服务器·c++·算法