Cloud环境下简单度量主机I/O性能-由拆机联想到的


前言

昨天,使用了差不多5年的T580,在使用过程中,CPU都不到70%的时候,都不用手触摸,发现键盘都发烫。一般这种本也只有3年保修期,如果因此烧了主板,基本上也就不再保修了。基本上,很多人都在同一时期,要么选择换机器,要么,机器的主板可能被烧掉了,无法再用,被迫更换。

话不多说,又像当年拆X60, X61, X220, T60, T400, R400系列一样,直接拆吧,把风扇好好的清一下灰,然后给CPU上边的散热脂重新抹一遍(家里基本上备着这个,也没扔掉),重新再安装复位。基本上就没再那么烫了。

说这么多元聊的东西,什么意思呢? 大概是想说,对一个“系统”,有一个手感,或者说建立起一个手感,如同中医的“把脉”,大体知道它能不能正常工作。发现,它实在太烫了,应该是里边堵的太厉害了。疏通一下就可以恢复正常使用。

我们再回到Cloud上来,一个vm,它也有一些系统参数,包括CPU、内存、DISK,但是它跟完全的物理机还是有区别的。有的时候甚至会出现虚标、超卖的现象。所以,针对具体的系统,你不妨逐步建立起自己的手感。这个东西很重要,而且往往被开发人员所忽视,大多数开发人员往往只重视功能的实现,而忽略了实际的运行性能基本指标。

实例

这里就以CloudFoundry为例,看看一台vm下边的"disk"  I/O性能如何?再看看从远端另一台机器访问它的文件,network I/O大致性能如何?

1、vm上本地磁盘I/O

我们先用cf ssh 直接登到主机上:

vcap@9d71050c-94c4-480a-59b9-1d03:~$ time dd if=/dev/zero of=file1 bs=8k count=20480
20480+0 records in
20480+0 records out
167772160 bytes (168 MB, 160 MiB) copied, 0.131078 s, 1.3 GB/s

real    0m0.134s
user    0m0.012s
sys     0m0.121s

直接以8k块大小,写入生成168M的文件,大概能达到1.3GB/秒。基本上是SSD级别。

如果你找一台自己本地的vm(接近于物理机):

[23:36:54-postgres@sean-rh1:/iihero]$ time dd if=/dev/zero of=file1 bs=32k count=20480
20480+0 records in
20480+0 records out
671088640 bytes (671 MB) copied, 0.505215 s, 1.3 GB/s

real    0m0.507s
user    0m0.002s
sys     0m0.504s

差不多也是这个速度。

可是,如果你进到同一个vm里头不同的文件系统或加载的分区,比如访问另一个FileStorage提供的网络服务目录,结果就相差非常多:

vcap@9d71050c-94c4-480a-59b9-1d03:/var/vcap/data/89391862-c420-4459-a0b0-ef3f442356ca$ ls
dev-4a5e51a3  
vcap@9d71050c-94c4-480a-59b9-1d03:/var/vcap/data/89391862-c420-4459-a0b0-ef3f442356ca$ time dd if=/dev/zero of=file1 bs=8k count=20480
20480+0 records in
20480+0 records out
167772160 bytes (168 MB, 160 MiB) copied, 2.13312 s, 78.7 MB/s

real    0m2.169s
user    0m0.019s
sys     0m0.548s
vcap@9d71050c-94c4-480a-59b9-1d03:/var/vcap/data/89391862-c420-4459-a0b0-ef3f442356ca$

看看,这里测出来的速度只有78.7MB/s。远低于访问本地目录的1.3GB/s。有了这个印象,你在写代码的时候就会充分考虑这两者之间的差异。

这里的主机同样适合于PostgreSQL DB主机上的度量。

2、近似网络速度

如果你要模拟数据库中心某范围内的一台主机访问CF上的那台vm,看看网络速度如何?

我们借用 cf ssh传输文件的命令:

time cf ssh service-offline-mobile-dev -c "cat /home/vcap/file1" > file1.out

sean@ubuntu-sean:~/log$ time cf ssh service-offline-mobile-dev -c "cat /home/vcap/file1" > file1.out
real    0m2.313s
user    0m0.666s
sys     0m0.696s

sean@ubuntu-sean:~/log$ ls -la file1.out
-rw-rw-r-- 1 sean sean 167772160 Jun  6 21:27 file1.out

从上边看出来:167772160,花了2.313秒.  如果去掉本地的0.505,  那么网速基本上可以为100MB/s的级别。

你换用不同网段的客户端主机,测到的结果肯定不一样。但是都能很快得出结论。

当然,你还可以用一个简单的webapp, 放入一个文件,使用http去请求,然后来模拟测速。

3、文件数量度量

经常有同学问,PostgreSQL同一个数据库(database)下边,最多支持多少张表? 这个也是可以通过简单的实验来建立起手感的。一张表最多可以有8个文件,一般3到8个之间。而且都在同一个目录下边。因为受制于访问文件系统的元数据,性能肯定随着表数量上升而受到影响。基本上达到一万级别以后,性能下降会非常明显。

我们下边就快速生成10000个文件,每个文件8k大小。看看是啥样的。

sean@ubuntu-sean:~/log/tmp$ time for n in {1..10000}; do dd if=/dev/urandom of=file-l-$( printf %04"$n" ).bin bs=8k count=1; done >/dev/null 2>&1

real    0m46.371s
user    0m24.596s
sys     0m23.009s

总计花了46秒。基于此,再写此代码去随机访问其中一些文件的性能如何。实际度量中,你可以把文件数量提高到8万。

小结:

性能度量,在软件或服务中是非常重要的。三个要素(维度):功能上可复用性、性能、安全,都达到一个基本指标,才算是一个合格的系统。



请使用浏览器的分享功能分享到微信等