天天看点

#yyds干货盘点# I/O

更详细的解释:

​​https://blog.csdn.net/Youth_lql/article/details/115524139?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166113469016782390520665%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=166113469016782390520665&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v33_ecpm-2-115524139-null-null.142​​^v42^pc_ran_alice,185^v2^control&utm_term=%E6%A3%80%E6%9F%A5%E7%B3%BB%E7%BB%9Fio&spm=1018.2226.3001.4187

一,查看磁盘io

iostat命令

iostat 主要用于输出磁盘IO 和 CPU的统计信息。属于sysstat软件包。可以用​​yum​​ install sysstat 直接安装。

用法

用法:iostat [选项] [<时间间隔>] [<次数>]

命令参数:

-c: 显示CPU使用情况

-d: 显示磁盘使用情况

-N: 显示​​磁盘阵列​​(LVM) 信息

-n: 显示​​NFS​​ 使用情况

-k: 以 KB 为单位显示

-m: 以 M 为单位显示

-t: 报告每秒向终端读取和写入的字符数和CPU的信息

-V: 显示版本信息

-x: 显示详细信息

-p:[磁盘] 显示磁盘和分区的情况

#yyds干货盘点# I/O

cpu属性值说明:

%user:CPU处在用户模式下的时间百分比。

%nice:CPU处在带NICE值的用户模式下的时间百分比。

%system:CPU处在系统模式下的时间百分比。

%iowait:CPU等待输入输出完成时间的百分比。

%steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比。

%idle:CPU空闲时间百分比。

备注:如果%iowait的值过高,表示硬盘存在I/O瓶颈,%idle值高,表示CPU较空闲,如果%idle值高但系统响应慢时,有可能是CPU等待分配内存,此时应加大内存容量。%idle值如果持续低于10,那么系统的CPU处理能力相对较低,表明系统中最需要解决的资源是CPU。

disk属性值说明:

device:磁盘名称

tps:每秒钟发送到的I/O请求数.

Blk_read/s:每秒读取的block数.

Blk_wrtn/s:每秒写入的block数.

Blk_read:读入的block总数.

Blk_wrtn:写入的block总数.

# iostat -d -x -k 1

输出详解

rrqm/s: 每秒进行 merge 的读操作数目.即 delta(rmerge)/s

wrqm/s: 每秒进行 merge 的写操作数目.即 delta(wmerge)/s

r/s: 每秒完成的读 I/O 设备次数.即 delta(rio)/s

w/s: 每秒完成的写 I/O 设备次数.即 delta(wio)/s

rsec/s: 每秒读扇区数.即 delta(rsect)/s

wsec/s: 每秒写扇区数.即 delta(wsect)/s

rkB/s: 每秒读K字节数.是 rsect/s 的一半,因为每扇区大小为512字节.(需要计算)

wkB/s: 每秒写K字节数.是 wsect/s 的一半.(需要计算)

avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区).delta(rsect+wsect)/delta(rio+wio)

avgqu-sz: 平均I/O队列长度.即 delta(aveq)/s/1000 (因为aveq的单位为毫秒).

await: 平均每次设备I/O操作的等待时间 (毫秒).即 delta(ruse+wuse)/delta(rio+wio)

svctm: 平均每次设备I/O操作的服务时间 (毫秒).即 delta(use)/delta(rio+wio)

%util: 每秒io操作占用的cpu使用时间。即一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的,计算方法:(r/s+w/s)*(svctm/1000)

问题判断:

1,如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈.

2,idle小于70%,IO压力就较大了,一般读取速度有较多的wait。这时可以结合vmstat 查看查看b参数(等待资源的进程数)和wa参数(IO等待所占用的CPU时间的百分比,高过30%时IO压力高)

3,await 的参数也要多和 svctm 来参考.差的过高就一定有 IO 的问题.

4,avgqu-sz 也是个做 IO 调优时需要注意的地方,这个就是直接每次操作的数据的大小,如果次数多,但数据拿的小的话,其实 IO 也会很小.如果数据拿的大,才IO 的数据会高.也可以通过 avgqu-sz × ( r/s or w/s ) = rsec/s or wsec/s.也就是讲,读定速度是这个来决定的.

二,查看进程io占用

iotop根据Linux内核(需要2.6.20及以上)来监测I/O,并且能显示当前进程/线程的I/O使用率。用来显示实时的磁盘活动。Linux下的IO统计工具如iostat,nmon等大多数是只能统计到per设备的读写情况。iotop 监控 Linux 内核输出的 I/O 使用信息,并且显示一个系统中进程或线程的当前 I/O 使用情况。它显示每个进程/线程读写 I/O 带宽。它同样显示当等待换入和等待 I/O 的线程/进程花费的时间的百分比。

参数:

-o:只显示有io操作的进程

-b:批量显示,无交互,主要用作记录到文件。

-n NUM:显示NUM次,主要用于非交互式模式。

-d SEC:间隔SEC秒显示一次。

-p PID:监控的进程pid。

-u USER:监控的进程用户。

快捷键:

左右箭头:改变排序方式,默认是按IO排序。

r:改变排序顺序。

o:只显示有IO输出的进程。

p:进程/线程的显示方式的切换。

a:显示累积使用量。

q:退出。

#yyds干货盘点# I/O

TID:线程或进程id

PRIO:线程io优先级

USER:线程所属用户

DISK READ:线程从磁盘读数据的速度

DISK WRITE:线程写磁盘的速度

SWAPIN:进程使用的数据由swap换入到​​内存​​的时间占进程io总时间的百分比

IO:进程等待进行io操作的时间占进程io总时间的百分比

Total DISK READ 和 Total DISK WRITE

的值一方面表示了进程和内核线程之间的总的读写带宽,另一方面也表示内核块设备子系统的。

Actual DISK READ 和 Actual DISK WRITE 的值表示在内核块设备子系统和下面硬件(HDD、SSD

等等)对应的实际磁盘 I/O 带宽。

三,查看网络io占用

1,使用nload命令

下载地址:​​http://sourceforge.net/projects/nload/​​

# nload eth0

监控eth0网卡的总流量,非常直观的现实

2,使用iptraf命令

下载地址:​​http://iptraf.seul.org/​​

# iptraf

会进入一个图形界面,设置要抓取的网卡之后,能够更为详细的现实ip+port之间的数据报通信,根据通信数据报的接受速率和大小,可以判断哪个应用程序占用网卡io较大

3,使用sar命令

查看网卡设备的历史流量数据

# sar -n DEV

查看某天的流量数据

# sar -f /var/log/sa/sa28 -n DEV

四,查看系统内存占用

vmstat命令

vmstat命令是最常见的Linux/Unix监控工具,属于sysstat包。可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,​​内存​​使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令,一个是Linux/Unix都支持,二是相比top,我可以看到整个机器的CPU,内存,IO的使用情况,而不是单单看到各个进程的CPU使用率和内存使用率(使用场景不一样)。

用法:

一般vmstat工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数,如:

root@local:~# vmstat 2 1      
#yyds干货盘点# I/O

输出解释:

r: 表示运行和等待cpu时间片的进程数,如果长期大于CPU的数目,说明cpu不足,需要增加cpu。

b: 表示在等待资源的进程数,比如正在等待I/O、或者内存交换等。

swpd: 表示swap内存的使用量,单位是KB

free:表示系统的空闲内存

buff:buff空间的使用大小。buffers是用来缓冲块设备做的,它只记录文件系统的元数据(metadata)以及 tracking in-flight pages等。

cache:cache空间的使用大小。用来给系统或程序打开的文件内容做缓冲。

si:即swap in操作,告诉我们每秒有多大内存被从磁盘swap分区中换入真实内存中。

so:即swap out操作,告诉我们每秒有多大内存被从真实内存换出到磁盘swap分区中。(注:一旦,swap in和swap out比较频繁,就非常影响程序的性能)

bi:每秒从块设备接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte

bo:每秒写入块设备的块数量

in:列显示了系统每秒被中断的数量,包括之间中断。如果中断比较多,可能会导致cpu繁忙。

cs:列显示了系统为了处理所以任务而上下文切换的数量。例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。

us:cpu在用户态消耗的时间

sy:cpu在内核态消耗的时间,如果太高,表示系统调用时间长,例如是IO操作频繁。

id:cpu处于空闲的时间

wa:cpu等待IO操作完成的时间。如果,wait时间较长,有可能是等待cpu处理的io操作较多。

st:Time stolen from a virtual machine.(这个值应该只有在虚拟机里才有意义,表示被物理机给窃取走的时间,不太明白)

常见问题及解决方法:

如果r经常大于4,且id经常少于40,表示cpu的负荷很重。

如果pi,po长期不等于0,表示内存不足。

如果disk经常不等于0,且在b中的队列大于3,表示io性能不好。

1.)如果在processes中运行的序列(process r)是连续的大于在系统中的CPU的个数表示系统现在运行比较慢,有多数的进程等待CPU。

2.)如果r的输出数大于系统中可用CPU个数的4倍的话,则系统面临着CPU短缺的问题,或者是CPU的速率过低,系统中有多数的进程在等待CPU,造成系统中进程运行过慢。

3.)如果空闲时间(cpu id)持续为0并且系统时间(cpu sy)是用户时间的两倍(cpu us)系统则面临着CPU资源的短缺。

当发生以上问题的时候请先调整应用程序对CPU的占用情况.使得应用程序能够更有效的使用CPU.同时可以考虑增加更多的CPU. 关于CPU的使用情况还可以结合mpstat, ps aux top prstat –a等等一些相应的命令来综合考虑关于具体的CPU的使用情况,和那些进程在占用大量的CPU时间.一般情况下,应用程序的问题会比较大一些.比如一些sql语句不合理等等都会造成这样的现象.

内存问题现象:

内存的瓶颈是由scan rate (sr)来决定的.scan rate是通过每秒的始终算法来进行页扫描的.如果scan rate(sr)连续的大于每秒200页则表示可能存在内存缺陷.同样的如果page项中的pi和po这两栏表示每秒页面的调入的页数和每秒调出的页数.如果该值经常为非零值,也有可能存在内存的瓶颈,当然,如果个别的时候不为0的话,属于正常的页面调度这个是​​虚拟内存​​的主要原理.

解决办法:

1.调节applications & servers使得对内存和cache的使用更加有效.

2.增加系统的内存.

3. Implement priority paging in s in pre solaris 8 versions by adding line "set priority paging=1" in /etc/system. Remove this line if upgrading from Solaris 7 to 8 & retaining old /etc/system file.

关于内存的使用情况还可以结ps aux top prstat –a等等一些相应的命令来综合考虑关于具体的内存的使用情况,和那些进程在占用大量的内存.一般情况下,如果内存的占用率比较高,但是,CPU的占用很低的时候,可以考虑是有很多的应用程序占用了内存没有释放,但是,并没有占用CPU时间,可以考虑应用程序,对于未占用CPU时间和一些后台的程序,释放内存的占用。

r 表示运行队列(就是说多少个进程真的分配到CPU),我测试的服务器目前CPU比较空闲,没什么程序在跑,当这个值超过了CPU数目,就会出现CPU瓶颈了。这个也和top的负载有关系,一般负载超过了3就比较高,超过了5就高,超过了10就不正常了,服务器的状态很危险。top的负载类似每秒的运行队列。如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高。

常见性能问题分析

IO/CPU/men连锁反应

1.free急剧下降

2.buff和cache被回收下降,但也无济于事

3.依旧需要使用大量swap交换分区swpd

4.等待进程数,b增多

5.读写IO,bi bo增多

6.si so大于0开始从硬盘中读取

7.cpu等待时间用于 IO等待,wa增加

内存不足

1.开始使用swpd,swpd不为0

2.si so大于0开始从硬盘中读取

io瓶颈

1.读写IO,bi bo增多超过2000

2.cpu等待时间用于 IO等待,wa增加 超过20

3.sy 系统调用时间长,IO操作频繁会导致增加 >30%

4.wa io等待时间长

iowait% <20% 良好

iowait% <35% 一般

iowait% >50%

5.进一步使用iostat观察

CPU瓶颈:load,vmstat中r列

1.反应为CPU队列长度

2.一段时间内,CPU正在处理和等待CPU处理的进程数之和,直接反应了CPU的使用和申请情况。

3.理想的load average:核数*CPU数*0.7

CPU个数:grep 'physical id' /proc/cpuinfo | sort -u

核数:grep 'core id' /proc/cpuinfo | sort -u | wc -l

4.超过这个值就说明已经是CPU瓶颈了

CPU瓶颈

1.us 用户CPU时间高超过90%

涉及到web服务器,cs 每秒上下文切换次数

例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。

1.cs可以对apache和nginx线程和进程数限制起到一定的参考作用

2.我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了

较好的趋势:主要是 swap使用少,swpd数值低。si so分页读取写入数值趋近于零

其他说明:

b 表示阻塞的进程,这个不多说,进程阻塞,大家懂的。

swpd 虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。

free 空闲的物理内存的大小,我的机器内存总共8G,剩余3415M。

buff Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存,我本机大概占用300多M

cache cache直接用来记忆我们打开的文件,给文件做缓冲,我本机大概占用300多M(这里是Linux/Unix的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。)

si 每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。我的机器内存充裕,一切正常。

so 每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。

bi 块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte,我本机上没什么IO操作,所以一直是0,但是我曾在处理拷贝大量数据(2-3T)的机器上看过可以达到140000/s,磁盘写入速度差不多140M每秒

bo 块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。

in 每秒CPU的中断次数,包括时间中断

cs 每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。

us 用户CPU时间,我曾经在一个做加密解密很频繁的服务器上,可以看到us接近100,r运行队列达到80(机器在做压力测试,性能表现不佳)。