最近,越来越多的第三方独立机构推出了云服务测试报告,这个现象让我有些喜忧参半。喜的是数据的大爆炸,企业的转型意识,互联网的发展已经让云计算市场迅速进入了红海阶段,人们对云的需求与依赖性越来越高。忧的是也有打着云服务独立测试的旗号让一些并不真实的数据展现在受众面前的事情发生。

七牛进入云服务领域四年了,我们从云存储做切入口,到目前积累了大约几十万用户。在这里,将“如何更好地测试云存储服务性能”分享出来,希望能让更多的在选择云和往云上迁移的企业获益。

首先,普及一个基础知识:我们认为,在互联网的世界里有三类不同的数据:1. 结构化数据,也就是关系型数据。2. 日志类型的数据,即记录用户行为轨迹的数据。3. 非结构化数据,也就是我们经常使用和产生的文件类数据,如图片、音视频数据等。就目前来说,大家所接触到的公有云存储一般是针对第三类也就是非结构化数据的存储,除了存储本身,也会提供数据加速(CDN)以及数据处理等服务,七牛就是这样。 这里面,每一个子服务都会对应相关的独立测试,而本篇文章更多的是探讨如何做好存储本身的性能测试。

了解了基本概念,在测试前,我们先理解下典型的数据使用环境下的三个主要阶段。

第一阶段指数据从客户端到存储的服务端(服务入口),即上行阶段。上行的表现一方面是由用户的网络质量决定的,同时也与云存储服务商上行节点的优化策略有关。这时,最重要的是做好整体的网络优化,以及在软件层面解决由于网络不稳而带来的上行问题。例如,断点续上传,模式是分片并发上传,是能很好地解决网络不稳的方法。因此,我们在为“美拍”服务的时候,对方是非常典型的短视频UGC场景,就充分用到了断点续上传的功能。此外,增加存储节点和反向代理节点也可以优化劣质网络环境下的用户上行问题。上行这个展开了,也是一个独立测试。

第二阶段就主要依赖云存储服务本身的性能表现。例如,在数据达到存储入口之后,需要多久才能落地到磁盘;在取一个数据时,数据要多久才能从磁盘到达存储的出口等。这个阶段的测试也是下文五个关键点中所主要描述的。

第三个阶段指数据的下行阶段。数据一般是由普通用户来使用的,而从存储边缘到达客户端的数据下行表现是由CDN决定的,因此这个阶段的性能评测是典型的CDN性能评测,很多文章中均有详细描述,这边就不做具体描述了。

那么如何针对云存储本身的性能表现做有效评测呢?我们分五个关键点来说。

第一个关键点:保障测试机的性能。

目前绝大多数云存储服务的性能都不弱,因此,在测试时,保障充足的带宽是非常非常必要的,同时,CPU等资源也要确保充足。此外,如果是通过上传小文件来进行测试的话,则尽量从内存生成小文件,而不是从磁盘生成,以免由于磁盘IOPS不够,而影响测试的准确性。而如果上传的是大文件,那么最好不要受到测试机带宽的限制。同理,如果是下载一个小文件,最好不要落磁盘,直接将其扔掉就好了,以避免磁盘成为性能瓶颈。

第二个关键点:将测试机与云存储服务的距离控制在合理的范围内。

机器离云存储的距离是非常关键的,因为如果两者之间的距离太大的话,跳数、丢包率、延迟等都会极大影响测试的效果。一般测试,通常会选择在同一个供应商同机房提供的虚拟机上来做云存储性能测试,这样不仅测试起来会比较方便,而且能确保测试结果准确有效。

这里面要说到七牛的一个特殊情况,七牛目前对外是不提供虚拟机的,虚拟机的使用是要实名申请审批的,因此我们希望第三方独立测试机构在测试七牛时,能够更好地确认这一点。

第三个关键点:根据存储数据的大小,关注相应的测试指标。

通常都会选择Get(下载)和Put(上传)来测试云存储本身的服务性能。这里面会考察响应时间与TPS(平均每秒处理的事务数)。

那么,我们推荐以实际用户为基准来考虑测试数据的大小。对于图片数据来说,可以关注50KB和2MB两个级别,主要因为一般手机拍照的图片大小在1MB到2MB这个级别,这对图片上行和下载原图都比较关键。而50KB是比较常见的缩略图的大小,也就是在网页上展示的绝大部分图片都是这个大小。当然网站上还会有logo、图标等图片,可能会更小,但这类图片基本上都是重复的,这样CDN的缓存效率比较高,一般体验都不会差。而容易造成用户体验差的,反而是那些每次大小都不一样、每个页面都不会重复的图片,它们才是评估的关键。而如果是做短视频产品,如常见的10秒的短视频,文件大小通常是1-2MB,应该关注这个级别的上行和下行。如果是更长的视频,也应该关注相对应的测试大小。

第四个关键点:测试数据的头尾都是不能要的。

在测试时,一般要选取中间的数据,因为最开始的时候,由于程序启动或者其他干扰原因会导致性能不太稳定,一般性能会差一些的。同时,尾部的数据通常也需要去掉,比如使用多线程测试时,各个线程结束的时间不一致,也会导致测试尾部的数据偏差较大。

第五个关键点:推荐对云存储服务做一些高并发的测试,这样可以考验云存储供应商的真实能力,即在处理高并发情况下的成功率。

但做高并发测试时,用比较传统的Java、Python等语言不太合适,因为在线程模型下它们的并发能力受系统能支撑的线程数限制,高并发的写法又比较复杂。而用Go、Erlang、Scala,Node.js等语言则会方便不少。

由于国内还没有特别权威的第三方做独立对比测试的机构,所以最好是自己来做测试,按照上面的方式,也很简单。

此外,选择云存储,除了上面谈到的云存储本身的性能,用户也需要关注存储的可用性以及性价比等方面。关于可用性,自己写一个脚本,放在crontab里边跑一段时间,收集一下数据就可以了。目前,国内有些云服务供应商为了让用户能实时了解服务的可用性,从而更放心地使用云服务,已推出系统健康状态实时监控服务,例如在 status.qiniu.com上就可以看到七牛的完整可用性纪录以及关键性能指标。当然,也要考察覆盖度问题,不过覆盖度问题一般由CDN提供支持,也有听云这类比较易用的测试服务。

当下,AWS、Azure等海外云服务也已经落地国内,他们在国内通常也具备了以上测试条件,因此测试方式并无不同。

最后想说的是,到了今天,越来越多的企业在选择云,基础技术对用户而言也越来越隐形,而以用户的需求为中心,专注云服务的质量才是厂商真正最需要做的。