磁盘IO
1、磁盘IO性能五个指标是衡量磁盘性能的基本指标:
使用率(Utilization):是指磁盘处理 I/O 的时间百分比。过高的使用率(如超过 80%),通常意味着磁盘 I/O 的性能瓶颈。对应指标%util
饱和度(Saturation):磁盘处理 I/O 的繁忙程度,过高的饱和度,意味着磁盘存在严重的性能瓶颈。当达到 100% 时,磁盘就无法接受新的 I/O 请求。
IOPS(Input/Output Per Second):每秒的 I/O 请求数。对应指标r/s w/s
吞吐量(Throughput):每秒的 I/O 请求大小。对应指标rkB/s wkB/s
响应时间(Response time):从发出请求到收到响应的时间间隔。对应指标r_await w_await
使用率只考虑有没有 I/O,而不考虑 I/O 大小,即使达到 100%,也有可能接受新的 I/O 请求。在数据库、大量小文件等这类随机读写比较多的场景中,IOPS 更能反应系统整体性能。在多媒体等顺序读写较多的场景中,吞吐量更能反应系统整体性能
2、常见的IO监控工具
2.1、iostat
参数详解:
-c:仅显示CPU统计信息,与-d选项互斥.
-d:仅显示磁盘统计信息,与-c选项互斥.
-k:以K为单位显示每秒的磁盘请求数,默认单位块.
-m:以M为单位显示每秒的磁盘请求数
-p:device | ALL,与-x选项互斥,用于显示块设备及系统分区的统计信息,也可以在-p后指定一个设备名,如:# iostat -p hda 或显示所有设备# iostat -p ALL
-t :在输出数据时,打印搜集数据的时间
-x :输出扩展信息
[test@docker ~]$ iostat
avg-cpu: %user %nice %system %iowait %steal %idle
0.19 0.00 0.21 0.01 0.00 99.59
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 1.07 206.22 39.42 99463292 19011512avg-cpu段:
%user:在用户级行所使别运用的CPU的百分比. <60%
%nice:nice操作所使用的CPU的百分比.
%system:在系统级别(kernel)运行所使用CPU的百分比. sy+us <80%
%iowait:IO等待所占用的cup时间(重要) <30% (不同功能的服务器不同)
%steal:丢失时间占用cpu 作为一个参考
%idle:CPU处于中断(空闲)状态的时间
注:一般来说%idie持续游走在20%以下,瓶颈出现在cpu的性能层面。%iowait高而%idle在70%以上,瓶颈出现在i/o设备层面。
Device段:
设备名 dm是disk mapper(磁盘映射)的缩写 可以写成在/dev/mapper下查对应谁。
参数 -N 可以将dm 转换成相应的LVM名
tps:设备每秒接受的i/o传输请求 每秒I/O吞吐量=TPS * I/O传输大小
kb_read /s:设备每秒读取的block数. -m 可以换成 MB
kb_wrtn/s:每秒写入的block数.
kb_read:读入的block总数.
kb_wrtn:写入的block总数.
注:如果%iowait的值过高,表示硬盘存在I/O瓶颈,%idle值高,表示CPU较空闲,如果%idle值高但系统响应慢时,有可能是CPU等待分配内存,此时应加大内存容量。%idle值如果持续低于10,那么系统的CPU处理能力相对较低,表明系统中最需要解决的资源是CPU。
常用命令
iostat -xm 1 : 每秒输出一次cpu&device信息
iostat -c 1 2 : 每秒输出一次cpu信息,总共输出2次
iostat -d 2 : 间隔2秒输出一次device信息
iostat -xm 1 /dev/sdb : 每秒输出1次sdb的device信息和cpu信息
iostat -p /dev/sdb -d 1 2 : 每秒输出一次sdb的分区的设备信息,总共输出2次
注意事项
util代表磁盘使用率,对于hdd,使用率达到100%代表已经达到磁盘瓶颈,但对于ssd并不代表已经达到瓶颈,因为util是按照(svctm*(r/s+w/s))/1000,对于ssd因为有并发,所以达到100%只能说明单通道达到了100%
2、 sar
参数详解:
sar [options] [-A] [-o file] t [n]
在命令行中,n 和t 两个参数组合起来定义采样间隔和次数,t为采样间隔,是必须有的参数,n为采样次数,是可选的,默认值是1,-o file表示将命令结果以二进制格式存放在文件中,file 在此处不是关键字,是文件名。options 为命令行选项
-A:所有报告的总和。
-u:CPU利用率
-v:进程、I节点、文件和锁表状态。
-d:硬盘使用报告。
-r:没有使用的内存页面和硬盘块。
-g:串口I/O的情况。
-b:缓冲区使用情况。
-a:文件读写情况。
-c:系统调用情况。
-R:进程的活动情况。
-y:终端设备活动情况
-w:系统交换活动。
-p: 打印出设备名称,不加输出的是设备节点,如dev8-0
-n: 某个端口设备的网络状态
输出:



DEV: 网卡/EDEV: 网卡(错误)
NFS/NFSD/SOCK/IP/EIP/ICMP/EICMP/TCP/ETCP/UDP/SOCK6/IP6/EIP6/ICMP6/EICMP6/UDP6

常用命令:
sar -d 1 : 间隔1s输出一次设备情况
sar -u 1 10 : 间隔1s输出一次cpu使用情况,总共输出10次
sar -d -f /var/log/sa/sa03 -p|grep -E “DEV|sd” : 从文件sa03中过滤出磁盘信息(sa03代表3号,最多保存一个月的日志)
sar -r 1 10 -o mem.log : 将内存信息每秒打印一次,总共打印10s,并将结果输出到mem.log中
sar -v 1 3 : 监控目前系统中的资源使用情况
参考链接:
3 、iotop
参数:
-o:只显示有io操作的进程
-b:批量显示,无交互,主要用作记录到文件。
-n NUM:显示NUM次,主要用于非交互式模式。
-d SEC:间隔SEC秒显示一次。
-p PID:监控的进程pid。
-u USER:监控的进程用户
-P :只显示进程,不显示线程
-a :显示累计的io(从iotop启动)
-k : 以KB为单位显示
-t : 非交互模式下,显示时间
-q: 只在第一次监测时显示列名. 去除头部一些行:这个参数可以设置最多3次来移除头部行:-q列头部只在最初交互显示一次;-qq列头部不显示;-qqq,I/O的总结不显示
输出:

常用命令:
iotop -o -P : 显示有io操作的进程
参考链接:
5、 vmstat
参数:
- vmstat [-a] [-n] [-S unit] [delay [ count]} : -a显示活跃和非活跃内存 -n只在开始时显示列名称 dealy刷新的时间间隔 count输出的次数 -S:使用制定单位显示(k/K/m/M等)
- vmstat [-s] [-n] [-S unit] : -s显示系统相关信息(如内存/cpu等)
- vmstat [-m] [-n] [delay [ count]] : -m 显示slab信息
- vmstat [-d] [-n] [delay [ count]] : -d显示磁盘相关统计
- vmstat [-p disk partition] [-n] [delay [ count]] : -p显示磁盘分区统计信息
- vmstat [-f] : -f从系统启动至今的fork数量
- vmstat [-V] : -v显示版本信息
- 输出:
- swpd: 使用虚拟内存大小
- free: 可用内存大小
- buff: 用作缓冲的内存大小
- cache: 用作缓存的内存大小
- si: 每秒从交换区写到内存的大小
- so: 每秒写入交换区的内存大小
- bi: 每秒读取的块数
- bo: 每秒写入的块数
- in: 代表每秒的中断数目
- 常用命令:
- vmstat 1 5: 每隔1s输出一次,共输出5次
- vmstat -f : 查看系统已经fork了多少次
- vmstat -a : 查看active和非active内存情况【注:inact和active的数据来自于/proc/meminfo】
- vmstat -s : 查看内存占用总体情况
- vmstat -d 1 5 : 查看5次磁盘io情况 【注:这些信息主要来自于/proc/diskstats】
- vmstat -p /dev/sdb1 : 查看分区sdb1的情况,只能用来查看分区
- 参考链接:
6、 pidstat
参数:
pidstat [ 选项 ] [ <时间间隔> ] [ <次数> ]
-u:默认的参数,显示各个进程的cpu使用统计
-r:显示各个进程的内存使用统计
-d:显示各个进程的IO使用情况
-p:指定进程号
-w:显示每个进程的上下文切换情况
-t:显示选择任务的线程的统计信息外的额外信息
-T { TASK | CHILD | ALL } 这个选项指定了pidstat监控的。TASK表示报告独立的task,CHILD关键字表示报告进程下所有线程统计信息。ALL表示报告独立的task和task下面的所有线程。注意:task和子线程的全局的统计信息和pidstat选项无关。这些统计信息不会对应到当前的统计间隔,这些统计信息只有在子线程kill或者完成的时候才会被收集。
-V:版本号
-h:在一行上显示了所有活动,这样其他程序可以容易解析。
-I:在SMP环境,表示任务的CPU使用率/内核数量
-l:显示命令名和所有参数
输出:


常用命令:
pidstat -d 1 -l: 显示磁盘io使用情况,并显示详细指令
pidstat -r : 显示内存占用情况
pidstat -u : 显示cpu占用情况
参考链接:
8、 lsof
- 简介:lsof(list open files),一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能
- 参数:
- lsof [option] filename
- -c: 显示command列中包含string的进程所打开的文件
- -u: 显示某个用户打开的文件
- -a: 显示满足后续所有条件的文件
- -p: 列出进程号所打开的文件
- -h: 显示帮助信息
- -v: 显示版本信息
- -n:列出使用nfs的文件
- +D: 递归打开目录下的所有文件
- +d:列出目录下被打开的文件
- -d:列出占用该文件号的进程
- -g:列出gid(groupid)号进程详情
- -t:仅列出进程
- -r: 循环列出文件直到被中断,后面数字代表循环的频率,
- 输出:
- Command: 进程名称
- PID: 进程号
- USER: 用户名
- FD: 文件描述符,如cwd(某个进程运行时所在的目录) 、txt(程序代码,如应用程序的二进制库或者是共享库)、rtd(根目录)、mem(内存映射文件)、mmap(内存映射设备)、数字大头的(0|1|2U|R|W)
- TYPE: 类型,REG(文件)、DIR(目录)、CHR(字符)、BLK(块设备)、UNIX(套接字)、FIFO(先进先出队列)、IPV4(网际协议套接字)
- DEVICE: 指定磁盘的名称
- SIZE: 文件的大小
- NODE:索引节点,文件在磁盘上的标识
- NAME:打开文件的确切名称
- 常用命令
- lsof filename : 打开filename的所有进程
- lsof -c string: 显示command列中包含string的进程所打开的文件
- lsof -u user: 显示所属user进程打开的文件
- lsof -a -c string -u user :同时满足-c&-u两个属性的被打开的文件
- lsof -u ^baihh : 显示不属于baihh进程的文件
- lsof -i : 显示所有打开的端口
- lsof -i :80 : 显示所有打开80端口的进程
- lsof /dev/sda[1234] : 显示打开sda1 sda2 sda3 sda4中任意一个的设备的文件
- lsof -p 300,400,500 : 列出进程300、400、500打开的所有文件
- lsof -t -i: 列出使用某个端口的进程pid
- 参考链接: