文章内容为学习整理笔记,绝大部分来源于 倪朋飞 老师的 Linux性能优化实战
一、磁盘性能指标
说到磁盘性能的衡量标准,必须要提到五个常见指标,也就是我们经常用到的,使用率、饱和度、IOPS、吞吐量以及响应时间等。这五个指标,是衡量磁盘性能的基本指标。
• 使用率:是指磁盘处理 I/O 的时间百分比。过高的使用率(比如超过 80%),通常意味着磁盘 I/O 存在性能瓶颈。
• 饱和度:是指磁盘处理 I/O 的繁忙程度。过高的饱和度,意味着磁盘存在严重的性能瓶颈。当饱和度为 100% 时,磁盘无法接受新的 I/O 请求。
• IOPS(Input/Output Per Second):是指每秒的 I/O 请求数。
• 吞吐量:是指每秒的 I/O 请求大小。
• 响应时间:是指 I/O 请求从发出到收到响应的间隔时间。
这里要注意的是,使用率只考虑有没有 I/O,而不考虑 I/O 的大小。换句话说,当使用率是 100% 的时候,磁盘依然有可能接受新的 I/O 请求。
这些指标,很可能是你经常挂在嘴边的,一讨论磁盘性能必定提起的对象。不过我还是要强调一点,不要孤立地去比较某一指标,而要结合读写比例、I/O 类型(随机还是连续)以及 I/O 的大小,综合来分析。
举个例子,在数据库、大量小文件等这类随机读写比较多的场景中,IOPS 更能反映系统的整体性能;而在多媒体等顺序读写较多的场景中,吞吐量才更能反映系统的整体性能。
一般来说,我们在为应用程序的服务器选型时,要先对磁盘的 I/O 性能进行基准测试,以便可以准确评估,磁盘性能是否可以满足应用程序的需求。
这一方面,我推荐用性能测试工具 fio ,来测试磁盘的 IOPS、吞吐量以及响应时间等核心指标。但还是那句话,因地制宜,灵活选取。在基准测试时,一定要注意根据应用程序 I/O 的特点,来具体评估指标。
当然,这就需要你测试出,不同 I/O 大小(一般是 512B 至 1MB 中间的若干值)分别在随机读、顺序读、随机写、顺序写等各种场景下的性能情况。用性能工具得到的这些指标,可以作为后续分析应用程序性能的依据。一旦发生性能问题,你就可以把它们作为磁盘性能的极限值,进而评估磁盘 I/O 的使用情况。
了解磁盘的性能指标,只是我们 I/O 性能测试的第一步。接下来,又该用什么方法来观测它们呢?这里,我给你介绍几个常用的 I/O 性能观测方法。
二、观测工具
1、iostat
第一个要观测的,是每块磁盘的使用情况,即观测磁盘 I/O。iostat 是最常用的磁盘 I/O 性能观测工具,它提供了每个磁盘的使用率、IOPS、吞吐量等各种常见的性能指标,当然,这些指标实际上来自 /proc/diskstats。
iostat更多用法请阅读:https://www.cpweb.top/2145
# -d -x表示显示所有磁盘I/O的指标
[root@test ~]# iostat -d -x 1
Linux 3.10.0-1160.el7.x86_64 (zabbix) 2021年05月24日 _x86_64_ (8 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
sda 5.45 0.09 11.17 156.12 540.34 5423.33 71.30 3.42 20.47 99.36 14.82 5.92 99.06
scd0 0.00 0.00 0.00 0.00 0.00 0.00 114.22 0.00 0.28 0.28 0.00 0.28 0.00
dm-0 0.00 0.00 1.34 0.11 5.37 0.43 8.00 0.07 48.06 45.41 81.12 39.14 5.68
dm-1 0.00 0.00 15.27 156.11 534.93 5422.89 69.53 4.10 23.86 116.16 14.83 5.69 97.44
dm-2 0.00 0.00 15.27 156.11 534.93 5422.89 69.53 4.10 23.86 116.16 14.83 5.69 97.47
dm-3 0.00 0.00 0.12 0.67 4.19 17.02 53.58 3.38 4265.11 159.02 5022.38 28.51 2.26
dm-4 0.00 0.00 0.00 0.00 0.00 0.00 53.36 0.00 3.38 3.38 0.00 3.15 0.00
dm-6 0.00 0.00 15.15 164.77 530.75 5405.52 65.99 4.20 23.24 120.86 14.26 5.52 99.26
新版本:
[root@test ~]# iostat -V
sysstat 版本 12.2.0
(C) Sebastien Godard (sysstat <at> orange.fr)
[root@test ~]# iostat -h -xd 1 1 sda
Linux 3.10.0-1160.el7.x86_64 (zabbix) 2021年05月24日 _x86_64_ (8 CPU)
r/s rkB/s rrqm/s %rrqm r_await rareq-sz Device
11.21 542.3k 5.47 32.8% 99.45 48.4k sda
w/s wkB/s wrqm/s %wrqm w_await wareq-sz Device
156.42 5.3M 0.09 0.1% 16.04 34.7k sda
d/s dkB/s drqm/s %drqm d_await dareq-sz Device
0.00 0.0k 0.00 0.0% 0.00 0.0k sda
aqu-sz %util Device
3.62 99.1% sda
输出信息含义:
指标 | 含义 |
---|---|
rrqm/s | 每秒合并读请求,%rrqm表示合并读请求的百分比 |
wrqm/s | 每秒合并写请求,%wrqm表示合并读请求的百分比 |
r/s | 每秒发送给磁盘的读请求。相当于合并后请求数 |
w/s | 每秒发送给磁盘的写请求。相当于合并后请求数 |
rkB/s | 每秒从磁盘读取的数据量,单位为KB |
wkB/s | 每秒向磁盘写入的数据量,单位为KB |
rareq-sz | 平均读请求大小,单位为kB |
wareq-sz | 平均写请求大小,单位为kB |
avgrq-sz | 平均请求的大小(以扇区为单位) |
avgqu-sz(aqu-sz) | 平均请求队列长度 |
await | 处理 I/0 请求的平均时间,这包括队列中的等待时间和设备实际处理时间,以毫秒为单位。 |
r_await | 处理读取请求的平均时间,这包括队列中的等待时间和设备实际处理时间,以毫秒为单位。 |
w_await | 处理写入请求的平均时间,这包括队列中的等待时间和设备实际处理时间,以毫秒为单位。 |
svctm | 处理I/O请求所需的平均时间(不包括等待时间),单位为毫秒,这个字段是不可靠的,将在之后版本删除 |
%util | 磁盘处理I/O的时间百分比 |
这些指标中,我们要注意:
• %util:就是我们前面提到的磁盘 I/O 使用率。由于可能存在并行I/O,100%并不一定表明磁盘I/O饱和。
• r/s+ w/s:就是 IOPS。
• rkB/s+wkB/s:就是吞吐量。
• r_await+w_await:就是响应时间,相同时间间隔。
在观测指标时,也别忘了结合请求的大小( rareq-sz 和 wareq-sz)一起分析。你可能注意到,从 iostat 并不能直接得到磁盘饱和度。事实上,饱和度通常也没有其他简单的观测方法,不过,你可以把观测到的,平均请求队列长度或者读写请求完成的等待时间,跟基准测试的结果(比如通过 fio)进行对比,综合评估磁盘的饱和情况。
2、pidstat
第二个要观测的是,是每个进程的 I/O 情况。这里要用到 pidstat 命令,它可以用来观测进程的cpu、内存、线程、IO及上下文切换等系统资源的占用情况。
[root@test ~]# pidstat -d 1
Linux 3.10.0-1160.el7.x86_64 (zabbix) 2021年05月24日 _x86_64_ (8 CPU)
14时31分50秒 UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command
14时31分51秒 1000 2387 1345.79 4000.00 0.00 0 mysqld
输出信息含义:
指标 | 含义 |
---|---|
kB_rd/s | 进程每秒从磁盘读取的数据量,以KB为单位 |
kB_wr/s | 进程每秒向磁盘写入的数据量,以KB为单位 |
kB_ccwr/s | 任务写入磁盘被取消的速率,以KB为单位 |
iodelay | 块 I/O 延迟,以时钟周期为单位,包括等待同步块 I/O 和换入块 I/O 结束的时间。 |
3、iotop
iotop。它是一个类似于 top 的工具,你可以按照 I/O 大小对进程排序,然后找到 I/O 较大的那些进程。
[root@zabbix ~]# iotop
Total DISK READ : 11.23 K/s | Total DISK WRITE : 5.59 M/s
Actual DISK READ: 11.23 K/s | Actual DISK WRITE: 7.17 M/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND
2397 be/4 mysql 0.00 B/s 0.00 B/s 0.00 % 40.63 % mysqld --defaults-file=/etc/my.cnf
输出信息含义:
指标 | 含义 |
---|---|
Total DISK READ | 进程对磁盘读的大小总数 |
Total DISK WRITE | 进程对磁盘写的大小总数 |
Actual DISK READ | 进程对磁盘真实读的大小总数 |
Actual DISK WRITE | 进程对磁盘真实写的大小总数 |
TID | 线程 ID |
PRIO | I/O 优先级 |
USER | 运行用户 |
DISK READ | 每秒读磁盘的大小 |
DISK WRITE | 每秒写磁盘的大小 |
SWAPIN | 换入时间百分比 |
IO | 等待 I/O 的时间百分比 |
COMMAND | 程序运行指令,[ ] 属于内核态的进程,没有 [ ] 的是用户态进程。 |
总的来说,前两行分别表示,进程的磁盘读写大小总数和磁盘真实的读写大小总数。因为缓存、缓冲区、I/O 合并等因素的影响,它们可能并不相等。剩下的部分,则是从各个角度来分别表示进程的 I/O 情况,包括线程 ID、I/O 优先级、每秒读磁盘的大小、每秒写磁盘的大小、换入和等待 I/O 的时钟百分比等