磁盘瓶颈
磁盘子系统通常是服务器性能的最重要方面,是瓶颈问题的高发部件。但是,磁盘问题表现的有时候并不是那么直接,比如说可能是内存不足。如果CPU周期浪费在等待I/O任务完成,应用程序可能被认为是I/O密集型。
最常见的磁盘问题是磁盘太少。大多数磁盘配置是基于容量需求,而非性能。最廉价的办法可能是购买大空间磁盘。然后,这样每张盘上都存放了更多的用户数据,磁盘上会产生更大的I/O速度和风险。
第二常见的问题是在一个整列中划分太多的罗辑分区,会增加寻道时间,降低性能。
找到磁盘瓶颈
服务器表现出如下的症状,可能是磁盘出现了瓶颈:
磁盘慢的表现:
内存缓冲中填满了写数据(或者在等待读数据),因为没有可用的空闲内存缓冲供写(或者是在等待磁盘队列中的读数据响应),拖慢了所有请求。
内存不足,在没有可以为网络请求分配足够内存缓冲的时候,会产生同步磁盘I/O。
磁盘或者控制器使用率变高。
大多数网络传输都是在磁盘I/O完成之后。表现形式为极长的响应时间和非常低的网络利用率。
磁盘I/O花费相当长的时间,并且磁盘队列变满,因为处理请求时间变长,所以CPU利用率变得很低。
磁盘子系统可能是最难配置的子系统。除了查看磁盘接口速度和磁盘容量,还要理解磁盘负载。访问磁盘是随机的还是顺序的?I/O是大还是小?为了充分利用磁盘,需要回答上面的这些问题。
厂商会一般会给你展示它们设备的吞吐量上限。但是,花时间来了解你的工作负载吞吐量将会帮你找到你所需要的磁盘子系统。
下表展示不同驱动在8KB I/Os下的真实吞吐。
磁盘速度 | 延时 | 寻道时间 | 完全随机访问时间 | 单盘每秒I/O | 8 KB I/O的吞吐 |
---|---|---|---|---|---|
15000 RPM | 2.0 ms | 3.8 ms | 6.8 ms | 147 | 1.15 Mbps |
10000 RPM | 3.0 ms | 4.9 ms | 8.9 ms | 112 | 900 KBps |
7200 RPM | 4.2 ms | 9 ms | 13.2 ms | 75 | 600 KBps |
- a. 如果处理命令 + 传输数据 < 1ms,完全随机访问 = 延时 + 寻道时间 + 1ms
- b. 以1/随机访问时间为吞吐量。
随机读写负载通常需要多个磁盘决定。SCSI或者光纤的带宽不太要关注。大量随机访问负载的数据库最好有多块磁盘。大的SMP服务器最好配置多块磁盘。通常磁盘可以简单的平均划分为70%的读和30%的写,RAID10的性能比RAID5要高出50%到60%。
顺序读写需要看重磁盘子系统的总线带宽。需要最大吞吐量的时候,需要特别关注SCSI总线或者光纤控制器的数量。在阵列中,为每个盘指定相同的数量,RAID-10、RAID-0和RAID-5的读写吞吐流很相似。
分析磁盘瓶颈的办法:实时监控和跟踪.
在问题发生的时候一定要做实时监控。在动态系统负载和问题不可重现的情况下,这可能是不实际的。然而,如果问题是可重现的,通过这个办法就可以增加对象和计数器使问题更清晰。
跟踪是通过收集一段时间的性能数据来诊断问题。这是远程性能分析的好办法。缺点是在问题不可重现的时候,需要分析大量的文件,如果没有跟踪到所有的关键对象和参数,必须等待下一次问题出现来获取额外的数据。
vmstat命令
跟踪磁盘的一种办法是使用vmstat工具。vmstat中关于I/O最重要的列是bi和bo。这两个字段监控了各个时刻进出磁盘的块。设置了基线就可以找到随着时间的变化。
iostat命令
在反复同时打开、读、写、关闭太多文件的时候可能遇到性能问题。这可能会以寻道时间(把磁头移动到数据存储位置的时间)变长的现象表现出来。使用iostat工具,可以监控I/O设备的实时负载。不同的选项可以帮你挖掘到更深更多有用的数据。
下图展示了在/dev/sdb1设备上潜在的I/O瓶颈。输出显示平均等待时间(await)是2.7秒,服务时间(svctm)是270ms。
更多字段的详细信息,参考iostat(1)的man手册。
下一章中会有如何修改elevator算法和avgrq-sz(average size of request,平均请求大小),以及qvgqu-sz(average queue length,平均队列长度)的内容。修改elevator设置使得延时变低,avgrq-sz会变小。 通过监控rrqm/s和wrqm/s的变化,可以看出调优对磁盘能管理的读写合并数产生的影响。
性能调优选项
在确定磁盘子系统瓶颈之后,有如下可能的解决方法:
如果负载是顺序的,压力在控制器带宽上,办法就是添加更快的磁盘控制器。然而,如果负载是随机的,瓶颈可能在磁盘上,增加更多多的磁盘可以帮助增加性能。
在RAID中添加更多的磁盘,把数据分散到多块物理磁盘,可以同时增强读和写的性能。增加磁盘会提升每秒的读写I/O数。另外,请使用硬件RAID而不是Linux提供的RAID软件。如果是硬件RAID,RAID级别对操作系统是不可见的。
考虑使用Linux逻辑卷分区,而不是没有分区的单块大磁盘或者逻辑卷。
把处理负载转移到网络中的其它系统(用户,应用程序或者服务)。
添加RAM。添加内存会提升系统磁盘缓冲,增强磁盘响应速度。