Linux查看磁盘IO问题

系统的cpu负载高

top命令

shell 复制代码
top - 10:56:36 up 51 days, 17:22,  2 users,  load average: 7.43, 7.39, 6.01
Tasks: 431 total,   1 running, 430 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.2 us,  0.5 sy,  0.0 ni, 84.2 id, 15.1 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem : 32525448 total,  5932616 free, 14234380 used, 12358452 buff/cache
KiB Swap: 16383996 total, 16383996 free,        0 used. 17340832 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                     
  8995 root      20   0 3649328 133648  21632 S   6.2  0.4   3853:05 filebeat                                                                    
 70476 root      20   0  162292   2532   1556 R   6.2  0.0   0:00.02 top                                                                         
     1 root      20   0  193364   6168   2372 S   0.0  0.0  13:56.96 systemd                                                                     
     2 root      20   0       0      0      0 S   0.0  0.0   0:01.39 kthreadd                                                                    
     3 root      20   0       0      0      0 S   0.0  0.0   0:18.83 ksoftirqd/0                                                                 
     5 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H                                                                
     8 root      rt   0       0      0      0 S   0.0  0.0   0:00.54 migration/0     

具体的解释如下:

Tasks: 130 total 进程总数

1 running 正在运行的进程数

129 sleeping 睡眠的进程数

0 stopped 停止的进程数

0 zombie 僵尸进程数

Cpu(s):

0.2% us 用户空间占用CPU百分比

0.1% sy 内核空间占用CPU百分比

0.0% ni 用户进程空间内改变过优先级的进程占用CPU百分比

99.2% id 空闲CPU百分比

0.4% wa 等待输入输出的CPU时间百分比

0.0% hi

0.0% si

0.4% wa 的百分比可以大致的体现出当前的磁盘io请求是否频繁。如果 wa的数量比较大,说明等待输入输出的的io比较多

vmstat命令

命令:vmstat 2 5(每两秒执行一次,执行5次)

shell 复制代码
[root@nnzldb ~]#vmstat 2 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0 11      0 5929980   5188 12355884    0    0     0     2    0    0  0  0 100  0  0
 0 12      0 5929768   5188 12355928    0    0     0    20 3806 7651  0  0 74 25  0
 0 12      0 5929760   5188 12356016    0    0     0    85 4029 7861  0  0 72 28  0
 0 13      0 5929692   5188 12356024    0    0     0    43 3876 7906  0  0 72 28  0
 0 14      0 5929628   5188 12356060    0    0     0    12 3629 7410  0  0 70 29  0

vmstat参数解释:

Procs

r: 等待运行的进程数

b: 处在非中断睡眠状态的进程数

Memory

swpd: 虚拟内存使用情况,单位:KB

free: 空闲的内存,单位KB

buff: 被用来做为缓存的内存数,单位:KB

Swap

si: 从磁盘交换到内存的交换页数量,单位:KB/秒

so: 从内存交换到磁盘的交换页数量,单位:KB/秒

IO

bi: 发送到块设备的块数,单位:块/秒

bo: 从块设备接收到的块数,单位:块/秒

System

in: 每秒的中断数,包括时钟中断

cs: 每秒的环境(上下文)切换次数

CPU(按 CPU 的总使用百分比来显示)

us: CPU 使用时间

sy: CPU 系统使用时间

id: 闲置时间

iostat 使用

安装命令: yum install sysstat

使用iostat -d -k 2 查看IO情况:

-k:已kb为单位显示读写信息

-m:已mb为单位显示读写信息


使用iostat -x 5 查看IO情况:

-x:更详细的io设备统计信息

rrqm/s 每秒对该设备的读请求被合并次数,文件系统会对读取同块(block)的请求进行合并

wrqm/s 每秒对该设备的写请求被合并次数

r/s 每秒完成的读次数

w/s 每秒完成的写次数

rkB/s 每秒读数据量(kB为单位)

wkB/s 每秒写数据量(kB为单位)

avgrq-sz 平均每次IO操作的数据量(扇区数为单位)

avgqu-sz 平均等待处理的IO请求队列长度

await 平均每次IO请求等待时间(包括等待时间和处理时间,毫秒为单位)

svctm 平均每次IO请求的处理时间(毫秒为单位)

%util 采用周期内用于IO操作的时间比率,即IO队列非空的时间比率

ps:%util: 一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的。即 delta(use)/s/1000 (因为use的单位为毫秒)
如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。

iotop命令

安装命令:yum install iotop

查看哪个线程耗IO比较高、按 o 只显示有磁盘 IO 活动的进程。

-o, --only只显示正在产生I/O的进程或线程。除了传参,可以在运行过程中按o生效。

-b, --batch非交互模式,一般用来记录日志。

-n NUM, --iter=NUM设置监测的次数,默认无限。在非交互模式下很有用。

-d SEC, --delay=SEC设置每次监测的间隔,默认1秒,接受非整形数据例如1.1。

-p PID, --pid=PID指定监测的进程/线程。

-u USER, --user=USER指定监测某个用户产生的I/O。

-P, --processes仅显示进程,默认iotop显示所有线程。

-a, --accumulated显示累积的I/O,而不是带宽。

-k, --kilobytes使用kB单位,而不是对人友好的单位。在非交互模式下,脚本编程有用。

-t, --time 加上时间戳,非交互非模式。

-q, --quiet 禁止头几行,非交互模式。有三种指定方式。

-q 只在第一次监测时显示列名

-qq 永远不显示列名。

-qqq 永远不显示I/O汇总。

交互按键:

和top命令类似,iotop也支持以下几个交互按键。

left和right方向键:改变排序。

r:反向排序。

o:切换至选项--only。

p:切换至--processes选项。

a:切换至--accumulated选项。

q:退出。

i:改变线程的优先级。

pt-ioprofile命令

安装步骤:

1、安装依赖包:yum install -y perl perl-IO-Socket-SSL perl-DBD-MySQL perl-Time-HiRes perl-Digest-MD5 perl-ExtUtils-MakeMaker

2、下载:wget https://www.percona.com/downloads/percona-toolkit/3.0.13/binary/redhat/7/x86_64/percona-toolkit-3.0.13-1.el7.x86_64.rpm

3、安装rpm包:rpm -ivh percona-toolkit-3.0.13-1.el7.x86_64.rpm

使用方法:

pt-ioprofile --profile-pid=1236 --cell=sizes

pt-ioprofile的原理是对某个pid附加一个strace进程进行IO分析。

对于定位问题更有用的是通过IO的吞吐量来进行定位。使用参数 --cell=sizes,该参数将结果已 B/s 的方式展示出来

从上图可以看出IO负载的主要来源是jetty。

并且压力主要集中在读取上。

相关推荐
2023自学中2 小时前
正点原子 Linux 驱动开发:多点电容触摸屏实验,gt9147 触摸芯片
linux·驱动开发·嵌入式
航Hang*2 小时前
第2章:进阶Linux系统——第10节:Linux 系统编程与 Shell 脚本全解笔记(GCC+Make+Vim+Shell Script)
linux·运维·服务器·学习·vim·apache·vmware
s9123601012 小时前
【docker】Ubuntu22使用skopeo离线推送镜像
运维·docker·容器
CHANG_THE_WORLD2 小时前
PDF结构的清晰图示
java·服务器·pdf
孙同学_2 小时前
【Linux篇】应用层协议HTTP
linux·运维·http
DeadPool loves Star2 小时前
新版VSCode登录Old Linux
linux·ide·vscode
我爱学习好爱好爱2 小时前
Ansible Loop循环 循环遍历的属性 Notify和Handlers
linux·运维·ansible
@insist1232 小时前
网络工程师-因特网与网络互联(二):ARP 与 ICMP,网络层排错双雄
服务器·网络·网络协议·网络工程师·软考·软件水平考试
charlie1145141912 小时前
嵌入式Linux驱动开发——模块参数与内核调试:让模块“活“起来的魔法
linux·驱动开发·学习·c