平台人生
作者平台人生2016-12-01 16:04
软件开发工程师, 平台人生

Linux之IO性能分析

字数 4034阅读 5267评论 0赞 1

作者:范涛滔
文章来自微信公众号:平台人生


日常运维中经常会碰到主机性能下降的问题,我们一般从CPU、内存、I0、网络等几个方面分析原因。本文就IO方面进行些分析,看下I/O是什么、怎么去监测以及我们应该怎么通过哪些指标去衡量I/O是否会成为系统的瓶颈。

I/O是什么

I/O(input/output),顾名思义即输入/输出端口,每个设备都会有一个专用的I/O地址,用来处理自己的输入和输出信息。CPU与外部设备,存储器的连接和数据交换都需要通过接口设备来实现,IO接口的功能就是负责实现CPU通过系统总线把IO电路和外围设备联系在一起。

LINUX 磁盘I/O

磁盘I/O是Linux 系统中最慢的部分。这个主要是因为CPU到物理操作磁盘之间存在距离,如果把内存的速度按秒级别算的话那么磁盘速度就相当于分钟级别。因此本质上,Linux 内核就是要最低程度的降低I/O 数。我们可以用到工具top,vmstat,iostat,sar等,每一个工具的输出都从不同的方面反映出系统的性能情况,其中iostat可以提供更丰富的IO性能状态数据。

IOSTAT命令使用

1.基本使用
iostat -d -k 1 10

参数 -d 表示,显示设备(磁盘)使用状态;-k某些使用block为单位的列强制使用Kilobytes为单位;1 10表示,数据显示每隔1秒刷新一次,共显示10次,其中第一条是系统从启动到现在为止的统计数据,后续的每条都是iostat执行间隔时间内的统计数据。
tps:该设备每秒的传输次数。“一次传输”意思是“一次I/O请求”。多个逻辑请求可能会被合并为“一次I/O请求”。“一次传输”请求的大小是未知的。
kB_read/s:每秒从设备读取的数据量;
kB_wrtn/s:每秒向设备写入的数据量;
kB_read:读取的总数据量;
kB_wrtn:写入的总数量数据量;
2. -x 参数扩展
使用-x参数我们可以获得更多统计信息。
iostat -d -x -k 1 10

rrqm/s:每秒这个设备相关的读取请求有多少被Merge了(当系统调用需要读取数据的时候,VFS将请求发到各个FS,如果FS发现不同的读取请求读取的是相同Block的数据,FS会将这个请求合并Merge);
wrqm/s:每秒这个设备相关的写入请求有多少被Merge了。
rsec/s:每秒读取的扇区数;
wsec/:每秒写入的扇区数。
r/s:每秒读请求数。
w/s:每秒写请求数。
await:每一个IO请求的处理的平均时间(单位是毫秒)。这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了。
%util:在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度。一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util0是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。
3. -c 参数
iostat还可以用来获取cpu部分状态值:
iostat -c 1 10

%user:用户态所占用的CPU使用率百分比(应用程序)。
%nice:用户态执行nice优先级所占用的CPU使用率百分比。
%system:内核态所占用的CPU使用率百分比(内核)
%iowait:CPU处于idle状态等待磁盘IO请求所占用的百分比。
%steal:当hypervisor服务另一个(虚拟)CPU时,(虚拟)CPU强制等待的时间占比。
%idle:没有磁盘请求时,CPU的空闲时间占比。

一块物理硬盘能提供多少IOPS ?

从磁盘上进行数据读取时,比较重要的几个时间是:寻址时间(找到数据块的起始位置),旋转时间(等待磁盘旋转到数据块的起始位置),传输时间(读取数据的时间和返回的时间)。其中寻址时间是固定的(磁头定位到数据的存储的扇区即可),旋转时间受磁盘转速的影响,传输时间受数据量大小的影响和接口类型的影响(不同硬盘接口速度不同),但是在随机访问类业务中,他的时间也很少。因此,在硬盘接口相同的情况下,IOPS主要受限于寻址时间和传输时间。以一个15K的硬盘为例,寻址时间固定为4ms,传输时间为60s/15000*1/2=2ms,忽略传输时间。1000ms/6ms=167个IOPS。对单块磁盘的IOPS的计算没有问题,但是当系统后面接的是一个存储系统时、考虑不同读写比例,IOPS则很难计算,而需要根据实际情况进行测试。主要的因素有:

  • 存储系统本身有自己的缓存。缓存大小直接影响IOPS,理论上说,缓存越大能cache的东西越多,在cache命中率保持的情况下,IOPS会越高。
  • RAID级别。不同的RAID级别影响了物理IO的效率。
  • 读写混合比例。对读操作,一般只要cache能足够大,可以大大减少物理IO,而都在cache中进行;对写操作,不论cache有多大,最终的写还是会落到磁盘上。因此,100%写的IOPS要小于100%读的IOPS。同时,100%写的IOPS大致等同于存储设备能提供的物理的IOPS。
  • 一次IO请求数据量的多少。一次读写1KB和一次读写1MB,显而易见,结果是完全不同的。
    当时上面N多因素混合在一起以后,IOPS的值就变得扑朔迷离了。所以,一般需要通过实际应用的测试才能获得。

随机IO和顺序I/O

对于系统而言有两种不同种类的I/O压力,顺序I/O和随机I/O。
顺序I/O常常出现在有大文件存取这样的应用中,它请求的数据在磁盘的位置是连续的。当系统发起N个非常小的IO请求(如:1K)时,因为一次IO是有代价的,系统会取完整的一块数据(如4K、8K),所以当第一次IO完成时,后续IO请求的数据可能已经有了。这样可以减少IO请求的次数。这也就是所谓的预取。这种系统的性能依靠它读取和移动数据的大小和快慢。我们用iostat来监控,会发现rKB/s,wKB/s会很高。 #iostat -x 1

Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
/dev/sda 0.00 12891.43 0.00 105.71 0.00 106080.00 0.00 53040.00 1003.46 1099.43 3442.43 26.49 280.00
从输出我们看到w/s=105,wKB/s=53040.所以53040/105=505KB per I/O。
而对于随机I/O的系统来说性能的关注点不在传输数据的大小和速度,而是在磁盘的IOPS。这类系统每次IO请求的数据在磁盘上的位置跨度很大(如:分布在不同的扇区),因此N个非常小的IO请求(如:1K),必须以N次IO请求才能获取到相应的数据。如Web服务器和Mail服务器。他们的性能主要依赖每秒钟可处理的请求数:#iostat -x 1
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
/dev/sda 0.00 633.67 3.06 102.31 24.49 5281.63 12.24 2640.82 288.89 73.67 113.89 27.22 50.00
从输出我们看到w/s=102,wKB/s=2640.所以2640/102=23KB per I/O。
因此对于连续I/O系统来说我们要关注系统读取大量数据的能力即KB per request。对于随机I/O系统我们应关注IOPS值。

IO Response Time

即IO的响应时间。IO响应时间是从操作系统内核发出一个IO请求到接收到IO响应的时间。因此,IO Response time除了包括磁盘获取数据的时间,还包括了操作系统以及在存储系统内部IO等待的时间。一般看,随IOPS增加,因为IO出现等待,IO响应时间也会随之增加。对于一个面向交易的处理系统,10ms以内的响应时间,是比较合理的。
• 一个8K的IO会比一个64K的IO速度快,因为数据读取的少些。
• 一个64K的IO会比8个8K的IO速度快,因为前者只请求了一个IO而后者是8个IO。
• 串行IO会比随机IO快,因为串行IO相对随机IO说,即便没有Cache,串行IO在磁盘处理上也会少些操作。
需要注意,IOPS与IO Response Time有着密切的联系。一般情况下,IOPS增加,说明IO请求多了,IO Response Time会相应增加。但是会出现IOPS一直增加,但是IO Response Time变得非常慢,超过20ms甚至几十ms,这时候的IOPS虽然还在提高,但是意义已经不大,因为整个IO系统的服务时间已经不可取。

Throughput

为吞吐量。这个指标衡量标识了最大的数据传输量。如上说明,这个值在顺序访问或者大数据量访问的情况下会比较重要。尤其在大数据量写的时候。
吞吐量不像IOPS影响因素很多,吞吐量一般受限于一些比较固定的因素,如:网络带宽、IO传输接口的带宽、硬盘接口带宽等。一般他的值就等于上面几个地方中某一个的瓶颈。

小结:

在IO性能分析时我们要选取合理的观察指标:
不用的应用场景需要观察不同的指标,因为应用场景不同,有些指标甚至是没有意义的。
随机访问和IOPS: 在随机访问场景下,IOPS往往会到达瓶颈,而这个时候去观察吞吐量,则往往远低于理论值。
顺序访问和吞吐量:在顺序访问的场景下,吞吐量往往会达到瓶颈(磁盘限制或者带宽),而这时候去观察IOPS,往往很小。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

1

添加新评论0 条评论

Ctrl+Enter 发表

本文隶属于专栏

作者其他文章

相关文章

相关问题

相关资料

X社区推广