经常在各社区论坛里看到有用户以dd值来评论某主机或者某主机商的硬盘性能,但几乎从未见过有用户能认识到IO wait这个值的重要性。
dd命令原本是用来拷贝文件的,但是能同时显示所用的时间与速度,所以经常被用来测试主机的硬盘读写性能。
而IO wait的值则代表CPU在处理任务时有多少百分比的时间是在等待硬盘读写。理论上来说,当IO wait值为0时,硬盘的读写速度,1MB/s和100MB/s对于程序的处理时间是没有影响的。
如果你不懂技术也不愿意探讨技术,那么可能转换成简单点的逻辑问题。
dd速度是别人能给你多少。
IO wait是别人给你的东西有没有满足你的需求。
个人愚见,如果能满足自己的需求,不必在意别人给了多少,因为给的多了你也用不上,给你一个1秒读写1TB的硬盘,你又能如何呢,能当饭吃?当IO wait很小时,磁盘读写再快,它对程序执行时间的影响也是微乎其微的。
而现在存在的一个普遍的问题是,很多人只看给了多少(dd速度值),而不(会)看有没有达到自己的需求。
在Linux系统下,执行top命令,可以看到运行界面:
圈住的值,就是IO wait值。
但是我们要看的不是这个,而是按下字母q上面的数字1键(不是数字键盘上的1),然后得到的运行界面:
这样我们可以看到每个CPU的运行状态,wait值也是相对于每个CPU的。而第一张图中的则是计算的平均wait值,举个例子,当有一个CPU核心的wait值达到100%时,那么按8核CPU计算,平均值只有12.5%,如果这样看的话,这个值是不高的,无法发现问题,而当一个核心wait达到100%时,其实问题已经非常严重。(也就是说,平均值小,不一定没问题,但是平均值都已经很高了,就一定有问题)
所以,后面所说的wait值,都是指每个CPU的值,而不是平均值。(如果主机只有1颗CPU,这两个值是相同的)
IO wait值并不能独立出来看,它还涉及到另外一个量,就是数据的读写量,当一个硬盘的性能是固定的,读写的数据量越大,wait值越高。
执行vmstat 1命令,可以看到下面的执行结果:
命令中的1,代表的含意就是每秒输出1行。如果想中止,按ctrl+c。
bo是写入到磁盘,bi是从硬盘读取。b=block,在目前流行的版本中,1 block= 1024 bytes = 1KB。
vmstat命令也会显示wait的值,这个值仍然是平均值,并不精确。
如果硬盘的读写量非常少,但是vmstat值很高(举个例子比如bi和bo只有几十到几百,而wait在50以上),那么一定是硬盘问题,要么是硬盘性能,要么是其他的虚拟机或者母机上有影响到磁盘性能的操作(比如fsck)。怎么判断是硬盘问题还是受操作影响?如果只持续了几小时,一般是操作影响,如果持续时间长,比如几天,或者一直都一样,那肯定是硬盘的问题了。
从个人经验来看,如果wait值在10以下,受IO性能的影响很小,在20以下,可以接受,30就应该考虑解决问题了。
在这里只是说解决问题,而不是明确的说换主机,是因为,IO性能问题,并不一定是硬盘的性能问题,还有可能是程序的性能问题,比如最常见的MySQL的ORDER BY RAND()查询。
所以解决IO问题也就是从两方面下手,一是加强磁盘性能,比如用SSD,第二就是优化程序。
再给大家看一个硬盘性能的例子:
可以看到,读写量只有几十到几百KB,但是wait值经常的达到50%左右(注意这个值是平均值),这样的硬盘可以说已经达到了无法使用的地步了。
(强调下,这台主机并不是阿里云的)
很多人一提到阿里云,可能都会有一个硬盘IO差的印象,甚至某些主机商的客服也用这一点来攻击阿里云,而事实的情况是,阿里云的IO性能对绝大多数的网站应用都不会有问题。
另一点事实就是,有些IDC(包括知名和不知名的),性能其实要比阿里云的差非常多,比如前面提的这个例子,也是一家很有名的IDC,是有自己运营的机房的。只是因为阿里云的用户规模太大,所以评论也就多了。
看完这篇文章,希望大家都能对硬盘的IO性能有正确的认识,至少能做到:没有性能问题的时候,不要盲目的追求dd速度,有问题的时候,能正确的分析到问题。
原文链接:http://www.yundaiwei.com/post/442.html
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。