Linux性能优化-iostat命令
一、文件系统、虚拟文件系统、IO栈介绍
1.1文件系统
文件系统是对存储设备上的文件,进行组织管理的机制。组织方式不同,就会形成不同的文件系统。
为了方便管理,Linux 文件系统为每个文件都分配两个数据结构,索引节点(index node)和目录项(directory entry)。它们主要用来记录文件的元信息和目录结构。索引节点是每个文件的唯一标志,而目录项维护的正是文件系统的树状结构。
- *索引节点
索引节点,简称为 inode,用来记录文件的元数据,比如 inode编号、文件大小、访问权限、修改日期、数据的位置等。索引节点和文件一一对应,它跟文件内容一样,都会被持久化存储到磁盘中。
- 目录项
目录项,简称为 dentry,用来记录文件的名字、索引节点指针以及与其他目录项的关联关系。多个关联的目录项,就构成了文件系统的目录结构。不过,不同于索引节点,目录项是由内核维护的一个内存数据结构,所以通常也被叫做目录项缓存。
1.2虚拟机文件系统介绍
磁盘内的三类数据:
1、超级块,存储整个文件系统的状态。
2、索引节点区,用来存储索引节点。
3、数据块区,则用来存储文件数据。
目录项、索引节点、逻辑块以及超级块,构成了 Linux 文件系统的四大基本要素。
为了支持各种不同的文件系统,Linux 内核在用户进程和文件系统的中间,又引入了一个抽象层,也就是虚拟文件系统 VFS(Virtual File System)。
VFS 定义了一组所有文件系统都支持的数据结构和标准接口。这样,用户进程和内核中的其他子系统,就只需要跟 VFS 提供的统一接口进行交互。
Linux 文件系统的架构图
1.3IO栈
Linux 存储系统的 I/O 栈,由上到下分为三个层次,分别是文件系统层、通用块层和设备层。
文件系统层,包括虚拟文件系统和其他各种文件系统的具体实现。它为上层的应用程序,提供标准的文件访问接口;对下会通过通用块层,来存储和管理磁盘数据。
通用块层,包括块设备 I/O 队列和 I/O 调度器。它会对文件系统的 I/O 请求进行排队,再通过重新排序和请求合并,然后才要发送给下一级的设备层。
设备层,包括存储设备和相应的驱动程序,负责最终物理设备的 I/O 操作。
通用块层是 Linux 磁盘 I/O的核心。
向上,它为文件系统和应用程序,提供访问了块设备的标准接口;
向下,把各种异构的磁盘设备,抽象为统一的块设备,并会对文件系统和应用程序发来的I/O 请求进行重新排序、请求合并等,提高了磁盘访问的效率。
二、iostat命令介绍
常用命令
iostat -x -t 3 5
iostat的选项解释
-c: 仅显示CPU利用率相关信息;
-d: 仅显示磁盘I/O相关信息;
-k: 显示输出的数据单位为KB/s而不是默认的字节/s;
-t: 在输出中显示时间戳(时间戳格式YYYY-MM-DD HH:MM:SS)。
-m:显示状态以兆字节每秒为单位;
-p:仅显示块设备和所有被使用的其他分区的状态;
-V:显示版号并退出;
-x:显示扩展状态。
iostat的参数解释
间隔时间:每次报告的间隔时间(秒);
次数:显示报告的次数。
[root@rc-zabbix ~]# iostat -x -t 3 5
Linux 3.10.0-1160.el7.x86_64 (parc-zabbix) 10/13/2024 _x86_64_ (16 CPU)
10/13/2024 09:54:03 AM
avg-cpu: %user %nice %system %iowait %steal %idle
7.25 0.00 1.99 3.06 0.00 87.69
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
fd0 0.00 0.00 0.00 0.00 0.00 0.00 8.00 0.00 31.83 31.83 0.00 31.83 0.00
sda 0.04 0.10 3.23 222.05 329.98 9466.72 86.97 0.03 0.11 17.37 0.20 0.14 3.16
sdb 0.00 0.02 2.40 137.98 325.88 2772.29 44.14 0.03 0.22 22.75 0.38 0.18 2.55
scd0 0.00 0.00 0.00 0.00 0.00 0.00 21.56 0.00 2.22 2.22 0.00 2.03 0.00
dm-0 0.00 0.00 0.07 1.24 5.18 13.93 29.21 0.03 26.15 23.62 26.29 4.37 0.57
dm-1 0.00 0.00 0.06 0.07 0.23 0.29 8.00 0.00 35.81 10.13 55.78 5.36 0.07
dm-2 0.00 0.00 5.55 358.83 650.46 12224.79 70.67 0.03 0.07 6.12 0.18 0.05 1.76
10/13/2024 09:54:06 AM
avg-cpu: %user %nice %system %iowait %steal %idle
9.70 0.00 3.68 6.14 0.00 80.48
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
fd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sda 0.00 0.00 3.67 221.00 128.00 9518.67 85.88 15.14 66.48 14.55 67.34 3.73 83.87
sdb 0.00 0.00 1.33 111.67 21.33 2421.33 43.23 6.61 57.30 7.50 57.90 5.17 58.47
scd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
dm-0 0.00 0.00 0.00 0.33 0.00 6.67 40.00 0.01 0.00 0.00 0.00 35.00 1.17
dm-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
dm-2 0.00 0.00 5.00 340.33 149.33 11454.00 67.20 21.74 62.03 12.67 62.76 2.71 93.47
三、指标解释
对iostat 输出结果参数的解释
cpu部分
%user:表示用户空间程序执行的CPU时间百分比。
%nice:表示以较高的优先级运行的用户进程的CPU时间百分比。
%system:表示内核空间程序执行的CPU时间百分比。
%iowait:表示CPU等待I/O操作完成的时间百分比。
%steal:表示由于运行虚拟机等原因被其他虚拟机占用的CPU时间百分比。
%idle:表示CPU空闲时间的百分比。
io部分
Device 监测设备名称
rrqm/s 每秒需要读取需求的数量
wrqm/s 每秒需要写入需求的数量
r/s 每秒实际读取需求的数量
w/s 每秒实际写入需求的数量
rsec/s 每秒读取区段的数量
wsec/s 每秒写入区段的数量
rkB/s 每秒实际读取的大小,单位为KB
wkB/s 每秒实际写入的大小,单位为KB
avgrq-sz 需求的平均大小区段
avgqu-sz 需求的平均队列长度
await 等待I/O平均的时间(milliseconds)
svctm I/O需求完成的平均时间
%util 被I/O需求消耗的CPU百分比
指标解释
%util ,磁盘 I/O 使用率;
r/s+ w/s ,就是 IOPS(每秒的读写次数);
rkB/s+wkB/s ,就是吞吐量(单位时间内成功地传送数据的数量);
r_await+w_await ,就是响应时间。
四、指标分析
CPU模块分析
通过监控以上指标,可以识别CPU的瓶颈位置,例如:
如果%user和%system较高,说明CPU的负载较大,可能需要考虑升级CPU或增加CPU核心数;
如果%iowait较高,说明CPU等待IO完成的时间较长,可能需要优化磁盘性能或者减少磁盘IO操作;
如果%idle值高,表示CPU较空闲,系统处于空闲状态,无太多处理任务;
如果%idle值高但系统响应慢时,有可能是CPU等待分配内存,此时应加大内存容量。
如果%idle较低,说明CPU负载较大,可能需要考虑优化应用程序或增加CPU资源等。
IO模块分析
如果r/s和w/s较高,说明磁盘IO压力较大,需要考虑更换更高性能的硬盘;
如果await和svctm较高,说明磁盘处理I/O请求的能力不足,可能需要更换磁盘控制器或升级磁盘阵列等。