点击上方【蓝字】关注博主
“ 文件IO性能的监控与优化是确保系统高效运行的重要环节。通过对文件读写速度、传输次数、等待时间等关键性能指标的监测,能够全面了解系统的I/O状况,从而识别潜在的瓶颈和问题。”
简介
文件IO主要考虑以下几个点:
文件写入速度。
文件读取速度。
写入扇区的次数。
读取扇区的次数。
IO 等待时间:时间越大说明文件操作频繁。
tps
:该设备每秒的传输次数(Indicate the number of transfers per second that were issued to the device.)。“一次传输"意思是"一次I/O请求”。多个逻辑请求可能会被合并为"一次I/O请求"。"一次传输"请求的大小是未知的。kB_read/s
:每秒从设备(drive expressed)读取的数据量;kB_wrtn/s
:每秒向设备(drive expressed)写入的数据量;kB_read
:读取的总数据量;kB_wrtn
:写入的总数量数据量;这些单位都为Kilobytes
。
系统调用、VFS、缓存、文件系统以及块存储之间的关系如下图所示:
从图上可以看到,Buffer 是离磁盘更近的缓冲区,而 Cache 则是跟接近用户空间。
Linux 内核在用户进程和文件系统的中间,又引入了一个抽象层,也就是虚拟文件系统 VFS(Virtual File System)。
I/O 的两种方式
2.1、缓存 I/O
读操作:根据局部性原理,操作系统检查内核空间的缓冲区有没有需要的数据,如果已经缓存了,那么就直接从缓存中返回,也就是将数据复制到应用程序的用户空间;否则从磁盘中读取数据至内核空间的缓冲区,再将内核空间缓冲区的数据返回。
写操作:将数据从用户空间复制到内核空间的缓冲区,这时对用户程序来说写操作就已经完成。至于什么时候将数据从内核空间写到磁盘中,这步由操作系统决定,除非显示地调用了 sync 同步命令。
在一定程度上分离了内核空间和用户空间,保护系统本身的运行安全;
可以减少读盘的次数,从而提高性能。
2.2、直接 I/O
直接IO的方式非常适合做文件高性能传输。,比如分布式文件存储。
监控磁盘I/O的命令
3.1、iostat 监控IO状态
iostat [ -c ] [ -d ] [ -h ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ] [ device [...] | ALL ] [ -p [ device [,...] | ALL ] ] [ interval [ count ] ]
选项 | 描述 |
---|---|
-c | 输出 CPU 统计信息 |
-d | 输出磁盘统计信息。注:默认是两个都输出 |
-k、-m | 以 KB/s 或 MB/s 代替原来的块/s |
-t | 输出时打印收集信息时刻的时间。注:时间的打印格式和系统变量 S_TIME_FORMAT 相关 |
-x | 输出详细的拓展统计数据,比如各种等待时间、队列、利用率等信息 |
interval [count] | interval是统计的时间间隔,单位是 s,count 则是统计次数 |
[root@VM_0_ubuntu ~]# iostat -x
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 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sda 0.00 80.00 5.00 1152.00 20.00 935160.00 1616.56 2.74 2.96 1.60 2.97 0.74 85.20
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 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sda 0.00 80.00 15.00 1137.00 852.00 1049236.00 1823.07 2.30 2.59 1.07 2.61 0.72 82.80
输出消息 | 含义 |
---|---|
rrqm/s | 每秒对该设备的读请求被合并次数,文件系统会对读取同块(block)的请求进行合并 |
wrqm/s | 每秒对该设备的写请求被合并次数 |
r/s | 每秒完成的读次数 |
w/s | 每秒完成的写次数 |
rkB/s | 每秒读数据量 (以 kB 为单位) |
wkB/s | 每秒写数据量 (以 kB 为单位) |
avgrq-sz | 平均每次 IO 操作的数据量 (扇区数为单位),例如 1616.56 |
avgqu-sz | 平均等待处理的 IO 请求队列长度,例如 2.74 |
await | 平均每次 IO 请求等待时间 (包括等待时间和处理时间,毫秒为单位),例如 w_await 2.97 |
svctm | 平均每次 IO 请求的处理时间 (毫秒为单位),例如 0.72 |
%util | 采用周期内用于 IO 操作的时间比率,即 IO 队列非空的时间比率,表示设备的繁忙程度,例如 82.80。例如,如果统计间隔 1 秒,该设备有 0.5 秒在处理 IO,而 0.5 秒闲置,则该设备的 %util = 0.5/1 = 50%。一般地,如果该参数是 100% 表示设备已经接近满负荷运行。 |
输出消息 | 含义 |
---|---|
%user | 用户进程消耗 CPU 的比例 |
%nice | 用户进程优先级调整消耗的 CPU 比例 |
%sys | 系统内核消耗的 CPU 比例 |
%iowait | 等待磁盘 IO 所消耗的 CPU 比例 |
%idle | 闲置 CPU 的比例(不包括等待磁盘 I/O) |
# kb/s显示磁盘信息,每2s刷新一次
iostat -d -k 2
# kb/s显示磁盘统计信息及扩展信息,每1s刷新 ,刷新10次结束
iostat -dkx 1 10
3.2、swapon 查看分区使用情况
swapon [OPTIONS] [FILE | DEVICE...]
选项 | 含义 |
---|---|
-a , --all | 启用在 /etc/fstab 文件中标记为交换空间的所有交换分区和文件。 |
-e , --show-header | 在输出时显示标题行。 |
-h , --help | 显示帮助信息并退出。 |
-s , --summary | 显示当前交换空间的摘要信息。 |
-p , --priority PRIO | 设置交换空间的优先级。优先级越高,系统更倾向于使用优先级高的交换空间。优先级值范围通常为 -1 至 32767。 |
启用交换文件或分区
sudo swapon /dev/sdX
启用多个交换设备
sudo swapon /dev/sdX /dev/sdY
启用所有在 fstab 中配置的交换空间
sudo swapon -a
查看当前的交换空间状态
[root@VM_0_ubuntu ~]# swapon -s
Filename Type Size Used Priority
/var/swap file 8191996 473856 -2查看详细的内存与交换信息:free 命令显示系统内存的使用情况,包括交换空间信息。
free -h
注意:
通常在系统启动时,交换空间会自动启用,因此一般用户不会频繁使用
swapon
命令。在使用
swapon
启用交换空间前,确保交换分区或文件已经创建并格式化。使用
swapoff
命令可以禁用交换空间。
一般来讲,swap 分区容量应大于物理内存大小,建议是内存的两倍,但不超过 2GB。
3.3、df 查看硬盘使用情况
选项 | 含义 |
---|---|
-a , --all | 显示所有文件系统,包括 0 字节的文件系统。 |
-h , --human-readable | 以人类可读的格式显示大小(例如:KB、MB、GB)。 |
-i , --inodes | 显示 inode 使用情况,而不是磁盘块使用情况。 |
-k | 以 KiB(千字节)为单位显示大小。 |
-m | 以 MiB(兆字节)为单位显示大小。 |
--output | 自定义输出格式,可以指定要显示的字段。 |
-t , --type=TYPE | 仅显示指定类型的文件系统(例如:ext4、ntfs 等)。 |
-x , --exclude-type=TYPE | 不显示指定类型的文件系统。 |
-l , --local | 仅显示本地文件系统,忽略网络文件系统。 |
--sync | 显示时对文件系统进行同步。 |
-P , --portability | 以一种适合于脚本的方式输出信息,所有输出都在一行内显示。 |
--help | 显示帮助信息并退出。 |
--version | 显示版本信息并退出。 |
fly@LAPTOP-V34UPA81:~$ df -h
Filesystem Size Used Avail Use% Mounted on
drivers 246G 170G 76G 70% /usr/lib/wsl/drivers
/dev/sdc 1007G 4.9G 951G 1% /
rootfs 1.9G 2.2M 1.9G 1% /init
tmpfs 4.0M 0 4.0M 0% /sys/fs/cgroup
3.4、du 查看目录文件大小
选项 | 含义 |
---|---|
-a , --all | 显示所有文件和目录的磁盘空间使用情况,包含普通文件。还要显示其下目录和文件占用磁盘空间的大小 |
-h , --human-readable | 以人类可读的格式显示大小(例如:KB、MB、GB)。 |
-s , --summarize | 仅显示每个参数的总计信息,不显示子目录的信息。 |
-c , --total | 显示所有指定文件和目录的总计信息。还要统计它们的总和。 |
-d , --max-depth=N | 限制输出的目录深度,仅显示 N 层目录。 |
-k | 以 KiB(千字节)为单位显示大小。 |
-m | 以 MiB(兆字节)为单位显示大小。 |
-L , --dereference | 计算符号链接所指向的文件或目录的大小,而不是链接本身。 |
-0 | 以 null 字符分隔输出,适合与其他程序结合使用(如 find )。 |
--exclude=PATTERN | 排除匹配指定模式的文件或目录。 |
--help | 显示帮助信息并退出。 |
--version | 显示版本信息并退出。 |
# 查看当前目录及其子目录的使用情况:
du
# 仅查看当前目录的总使用情况:
du -sh
# 查看指定目录的详细使用情况:
du -h /path/to/directory
# 限制输出的目录深度为 1:
du -h --max-depth=1
# 计算符号链接所指向的文件的大小:
du -hL
[root@VM]$ du -lh --max-depth=1
6.1M ./php
11M ./ios
146M ./server
6.6M ./pb
723M ./auto_setup
29M ./android
133M ./win-client
18M ./mac
8.0K ./tutorial
28K ./doc
99M ./.git
1.2G .
文件IO写入频繁案例
iostat -dkx 1 30
cd /data/disktest
sysbench --num-threads=4 --max-time=60 --test=fileio --file-num=10 --file-total-size=10G --file-test-mode=rndrw prepare
sysbench --num-threads=4 --max-time=60 --test=fileio --file-num=10 --file-total-size=10G --file-test-mode=rndrw run
sysbench --num-threads=4 --max-time=60 --test=fileio --file-num=10 --file-total-size=10G --file-test-mode=rndrw cleanup
fly@ubuntu:~$ iostat -dkx 1 30
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 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sda 0.00 80.00 5.00 1152.00 20.00 935160.00 1616.56 2.74 2.96 1.60 2.97 0.74 85.20
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 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sda 0.00 80.00 15.00 1137.00 852.00 1049236.00 1823.07 2.30 2.59 1.07 2.61 0.72 82.80
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 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sda 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
总结
公众号: Lion 莱恩呀
微信号: 关注获取
扫码关注 了解更多内容
点个 在看 你最好看