2010年,在创新工场创业时,便开始使用国外的AWS云服务,部署了公司的官网和游戏后台服务

2013年,在小米工作期间,便免费使用了国内新浪云的SAE,部署了自己的第一个网站:米扑博客

2014年,从小米辞职创业,便花钱购买了国内的阿里云,部署了米扑科技,成为一名付费的云服务用户

 

米扑科技产品,全部搭建在云服务器上,采用了腾讯云、阿里云、AWS等,可供大家参考

米扑科技官网: http://mimvp.com

 

 

本文采用的云服务器 Ubuntu 操作系统,并且用户默认为 root 用户。

根据本文所述指南,对腾讯云和阿里云的三个云计算基础产品进行了评测,产品类别包括云服务器、云数据库、对象存储。

运用云计算产品性能测试指南,进行云服务器厂商评测的实例,请参考米扑博客的两篇文章:

用户使用评测:阿里云腾讯云谁性价比更高  (推荐

国内外公有云对比:功能介绍、性能测试  (推荐

 

云服务器

在开始测试云服务器之前,推荐按量计费方式购买实例。同时确保用于对比的云服务器配置规格相同或具有可比性。

通过服务商提供的账户名和密码登陆云服务器之后,请先更新系统(本文所有操作均针对 Debian 系统)。

sudo apt-get -y update

在云服务器的测试过程,将先通过 UnixBench 和 GeekBench 这两个常用的基准测试工具,获得对主机的一个总体评分。

然后再从 CPU、内存、磁盘 I/O 等方面进行单项测试。

 

1. UnixBench

UnixBench 官网: https://github.com/kdlucas/byte-unixbench

UnixBench 是测试类 Unix 系统性能的老牌工具,也是常用的基准测试工具。

它会执行 11 个单项测试,包括字符串处理、浮点运算效率、 文件数据传输、管道吞吐等,然后将结果与一个基准系统进行比较,得到一个指数值。指数值越高,性能越好。

最终的得分比单个测试的结果根据参考价值,而且也方便对服务器进行比较。

在安装 UnixBench 之前,要先准备好相关的依赖。请执行:

sudo apt-get -y install libx11-dev libgl1-mesa-dev libxext-dev perl perl-modules make gcc

下载安装包,然后按下面的提示操作。官方的源在 googlecode 上,国内访问不便,我已经将文件上传到对象存储服务。

wget https://github.com/kdlucas/byte-unixbench/archive/master.zip 
unzip master.zip
cd UnixBench 
make

运行 make 之前,确保将 Makefile 文件中 GRAPHICS_TEST = defined 行被注释掉,因为我们是在服务器端进行测试,不需要做 2D/3D 图形测试。

最后,执行:

./Run

如果一切正常,应该会出现类似下面的文字:

yun-ji-suan-chan-pin-xing-neng-ce-shi-zhi-nan-01

UnixBench 测试的运行时间比较长,期间可以离开去干别的事情。

运行 ./Run 即可开始测试,等待十几分钟即可

1) 运行输出的部分结果:

Benchmark Run: Mon Sep 04 2017 20:22:53 - 20:51:13
1 CPU in system; running 1 parallel copy of tests
 
Dhrystone 2 using register variables       23736936.0 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     3556.3 MWIPS (10.1 s, 7 samples)
Execl Throughput                               3570.1 lps   (29.9 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        565755.4 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          177397.0 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       1337004.0 KBps  (30.0 s, 2 samples)
Pipe Throughput                             1145152.0 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                 254288.8 lps   (10.0 s, 7 samples)
Process Creation                              11098.7 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   4001.7 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                    547.7 lpm   (60.1 s, 2 samples)
System Call Overhead                        1846761.4 lps   (10.0 s, 7 samples)
 
System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   23736936.0   2034.0
Double-Precision Whetstone                       55.0       3556.3    646.6
Execl Throughput                                 43.0       3570.1    830.2
File Copy 1024 bufsize 2000 maxblocks          3960.0     565755.4   1428.7
File Copy 256 bufsize 500 maxblocks            1655.0     177397.0   1071.9
File Copy 4096 bufsize 8000 maxblocks          5800.0    1337004.0   2305.2
Pipe Throughput                               12440.0    1145152.0    920.5
Pipe-based Context Switching                   4000.0     254288.8    635.7
Process Creation                                126.0      11098.7    880.9
Shell Scripts (1 concurrent)                     42.4       4001.7    943.8
Shell Scripts (8 concurrent)                      6.0        547.7    912.9
System Call Overhead                          15000.0    1846761.4   1231.2
                                                                   ========
System Benchmarks Index Score                                        1064.1

 

2)运行后的目录结构

# ll
total 144
-rw-r--r-- 1 root root 10133 Jun 30 08:19 Makefile
drwxr-xr-x 2 root root  4096 Sep  4 20:22 pgms
-rw-r--r-- 1 root root 17753 Jun 30 08:19 README
drwxr-xr-x 2 root root  4096 Sep  4 20:22 results
-rwxr-xr-x 1 root root 60436 Jun 30 08:19 Run
drwxr-xr-x 2 root root  4096 Jun 30 08:19 src
drwxr-xr-x 2 root root  4096 Sep  4 20:51 testdir
drwxr-xr-x 2 root root  4096 Sep  4 20:36 tmp
-rw-r--r-- 1 root root 17890 Jun 30 08:19 USAGE
-rw-r--r-- 1 root root  4622 Jun 30 08:19 WRITING_TESTS

 

3) 查看 results/ 目录下的html结果

http://demo.mimvp.com/unixbench/

 

domestic-public-cloud-contrast-function-performance-testing-50

上图测试的腾讯云,企业免费版(米扑科技),试用6个月,1核1GB,系统盘20GB的最低配版

一般来说,得分在 1000 以上的云服务器就算还不错的,

 

2. GeekBench

GeekBench 官网: http://www.geekbench.com

GeekBench 是另一款知名的性能测试工具,目前的最新版本为 GeekBench 4

相较于 GeekBench 3,最新版对测试标准进行了调整,能够更好地模拟真实任务和应用。

它支持测试单核和多核性能,不过由于我们选择的虚拟机只有 1 核,在测试时请忽略多核的测试得分。

还要注意的是,GeekBench 是一款收费的商业软件,可供免费使用的只有 32 位。

yun-ji-suan-chan-pin-xing-neng-ce-shi-zhi-nan-02

如果你想在 64 位服务器上使用该工具,则需先添加必备的运行时库。

dpkg --add-architecture i386
sudo
apt-get -y update
sudo
apt-get -y install libc6:i386 libstdc++6:i386

然后下载安装包

# 官方地址下载较慢,替换为国内源。
wget http://codingpy-1252715393.cosgz.myqcloud.com/archive/Geekbench-4.0.0-Linux.tar.gz

解压缩并执行测试:

tar -zxvf Geekbench-4.0.0-Linux.tar.gz 
cd build.pulse/dist/Geekbench-4.0.0-Linux/
./geekbench_x86_64      
// CentOS 下测试

测试结束后,GeekBench 会将结果上传到其官网的网站,并返回一个访问链接给我们,打开链接查看评测结果。

1)运行后,输出的部分结果

# ./geekbench_x86_64 
Geekbench 4.0.0 Tryout : http://www.primatelabs.com/geekbench/

Geekbench 4 is in tryout mode.

Geekbench 4 requires an active Internet connection when in tryout mode, and 
automatically uploads test results to the Geekbench Browser. Other features 
are unavailable in tryout mode.

Buy a Geekbench 4 license to enable offline use and remove the limitations of 
tryout mode.

If you would like to purchase Geekbench you can do so online:

  https://store.primatelabs.com/

If you have already purchased Geekbench, enter your email address and license 
key from your email receipt with the following command line:

  ./geekbench_x86_64 -r <email address> <license key>

  Running Gathering system information
System Information
  Operating System        Linux 3.10.0-514.26.2.el7.x86_64 x86_64
  Model                   Bochs Bochs
  Motherboard             N/A
  Processor               Intel(R) Xeon(R) CPU E5-26xx v3 @ 2.29 GHz
                          1 Processor
  Processor ID            GenuineIntel Family 6 Model 63 Stepping 2
  L1 Instruction Cache    32.0 KB
  L1 Data Cache           32.0 KB
  L2 Cache                4.00 MB
  L3 Cache                0.00 B
  Memory                  993 MB 
  BIOS                    Bochs Bochs
  Compiler                Clang 3.8.0 (tags/RELEASE_380/final)

 

2)运行后的目录结构

# ll
total 121488
-rwxrwxr-x 1 1000 1000   231820 Aug 30  2016 geekbench4
-rw-rw-r-- 1 1000 1000 60874278 Aug 30  2016 geekbench.plar
-rwxrwxr-x 1 1000 1000 31467864 Aug 30  2016 geekbench_x86_32
-rwxrwxr-x 1 1000 1000 31680232 Aug 30  2016 geekbench_x86_64

 

3)评测完毕后,链接提示如下

Uploading results to the Geekbench Browser. This could take a minute or two 
depending on the speed of your internet connection.

Upload succeeded. Visit the following link and view your results online:

  https://browser.geekbench.com/v4/cpu/3896131

Visit the following link and add this result to your profile:

  https://browser.geekbench.com/v4/cpu/3896131/claim?key=286251

 

4)打开其给的评测链接

https://browser.geekbench.com/v4/cpu/3896131

yun-ji-suan-chan-pin-xing-neng-ce-shi-zhi-nan-04

 

3. CPU Cyclictest

Cyclictest 官网https://wiki.linuxfoundation.org/realtime/documentation/howto/tools/cyclictest

Cyclictest 是一个高精度测试程序,可用来衡量 CPU 的平均延迟,即完成一个 CPU 周期所需的时间。

通过这个数据,我们可以判断物理 CPU 的超卖情况;特定时间内,有多少虚拟 CPU 在排队等候物理 CPU 进行处理。

因此,这个测试的数据越低,说明 CPU 的响应越快,延迟越低。

cyclictest 是 rt-tests 包的一部分,我们按如下操作安装并运行:

sudo apt-get -y install rt-tests
sudo cyclictest -D 10s -q

我们将使用测试结果中的 avg_lat 值。

$ sudo cyclictest -D 10s -q
# /dev/cpu_dma_latency set to 0us
T: 0 (18612) P: 0 I:1000 C:   9914 Min:      6 Act:   11 Avg:   26 Max:    3964

 

4. 内存性能

Mbw 是一个 Linux 内存性能测试工具,可以测试内存数据拷贝操作的速度。速度越快,性能越高。

在内存大小相同的情况下,该指标就显得比较重要,该指标越高越好。

因为通常内存数据操作是计算的常见瓶颈之一。

按如下操作安装并运行:

apt-get install mbw                // CentOS 无此命令
mbw -n 250 -t 0 200

取测试结果中 avg_copy 的值。

$ mbw -n 250 -t 0 200
Long uses 8 bytes. Allocating 2*26214400 elements = 419430400 bytes of memory.
Getting down to business... Doing 250 runs per test.
0       Method: MEMCPY  Elapsed: 0.18799        MiB: 200.00000  Copy: 1063.909 MiB/s
1       Method: MEMCPY  Elapsed: 0.17289        MiB: 200.00000  Copy: 1156.825 MiB/s
2       Method: MEMCPY  Elapsed: 0.14985        MiB: 200.00000  Copy: 1334.632 MiB/s
3       Method: MEMCPY  Elapsed: 0.16442        MiB: 200.00000  Copy: 1216.412 MiB/s
.....
246     Method: MEMCPY  Elapsed: 0.21887        MiB: 200.00000  Copy: 913.789 MiB/s
247     Method: MEMCPY  Elapsed: 0.22585        MiB: 200.00000  Copy: 885.536 MiB/s
248     Method: MEMCPY  Elapsed: 0.21463        MiB: 200.00000  Copy: 931.841 MiB/s
249     Method: MEMCPY  Elapsed: 0.21643        MiB: 200.00000  Copy: 924.091 MiB/s
AVG     Method: MEMCPY  Elapsed: 0.18964        MiB: 200.00000  Copy: 1054.622 MiB/s

 

5. 磁盘 I/O

磁盘 I/O 也是云服务器性能的重要指标,一般是选择读写速度快的。磁盘 I/O 性能测试主要分为两类:顺序读写和随机读写。顺序读写频繁,应该关注数据吞吐量指标;随机读写频繁,核心指标则是 IOPS,即每秒的输入输出量(或读写次数)。我们的云服务器上主要是存储一些小文件,更注重随机读写性能。

Fio 是测试磁盘 I/O 的传统基准工具。安装非常简单:

sudo apt-get -y install fio

 

1)使用如下命令测试磁盘 随机读性能

fio --name=randread --ioengine=libaio --direct=1 --bs=4k --iodepth=64 --size=4G --rw=randread --gtod_reduce=1

部分选项的说明如下:

  • direct=1:测试过程绕过机器自带的 buffer,使测试结果更加真实。
  • rw=randread:测试随机读的 I/O
  • size=4G:本次测试文件的大小为 4G
  • bs=4k:单次 I/O 的块文件大小为 4KB
  • iodepth=64:一次执行 64 个操作。

运行结果如下:

# fio --name=randread --ioengine=libaio --direct=1 --bs=4k --iodepth=64 --size=4G --rw=randread --gtod_reduce=1
randread: (g=0): rw=randread, bs=4K-4K/4K-4K/4K-4K, ioengine=libaio, iodepth=64
fio-2.2.8
Starting 1 process
randread: Laying out IO file(s) (1 file(s) / 4096MB)
Jobs: 1 (f=1): [r(1)] [53.8% done] [11748KB/0KB/0KB /s] [2937/0/0 iops] [eta 02m:43s]
Jobs: 1 (f=1): [r(1)] [100.0% done] [15000KB/0KB/0KB /s] [3750/0/0 iops] [eta 00m:00s]
randread: (groupid=0, jobs=1): err= 0: pid=13059: Tue Sep  5 01:44:52 2017
  read : io=4096.0MB, bw=11665KB/s, iops=2916, runt=359562msec
  cpu          : usr=1.43%, sys=3.50%, ctx=344831, majf=0, minf=95
  IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.1%, >=64=0.0%
     issued    : total=r=1048576/w=0/d=0, short=r=0/w=0/d=0, drop=r=0/w=0/d=0
     latency   : target=0, window=0, percentile=100.00%, depth=64

Run status group 0 (all jobs):
   READ: io=4096.0MB, aggrb=11665KB/s, minb=11665KB/s, maxb=11665KB/s, mint=359562msec, maxt=359562msec

Disk stats (read/write):
  vda: ios=1048296/606, merge=0/300, ticks=22947662/64194, in_queue=23011797, util=100.00%

 

2)使用如下命令测试磁盘 随机写性能

fio --name=randwrite --ioengine=libaio --direct=1 --bs=4k --iodepth=64 --size=4G --rw=randwrite --gtod_reduce=1

运行结果如下:

# fio --name=randwrite --ioengine=libaio --direct=1 --bs=4k --iodepth=64 --size=4G --rw=randwrite --gtod_reduce=1
randwrite: (g=0): rw=randwrite, bs=4K-4K/4K-4K/4K-4K, ioengine=libaio, iodepth=64
fio-2.2.8
Starting 1 process
randwrite: Laying out IO file(s) (1 file(s) / 4096MB)
Jobs: 1 (f=1): [w(1)] [67.8% done] [0KB/11892KB/0KB /s] [0/2973/0 iops] [eta 01m:57s]
Jobs: 1 (f=1): [w(1)] [99.7% done] [0KB/13554KB/0KB /s] [0/3388/0 iops] [eta 00m:01s]
randwrite: (groupid=0, jobs=1): err= 0: pid=13640: Tue Sep  5 01:52:17 2017
  write: io=4096.0MB, bw=11653KB/s, iops=2913, runt=359927msec
  cpu          : usr=1.44%, sys=2.98%, ctx=140341, majf=0, minf=28
  IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.1%, >=64=0.0%
     issued    : total=r=0/w=1048576/d=0, short=r=0/w=0/d=0, drop=r=0/w=0/d=0
     latency   : target=0, window=0, percentile=100.00%, depth=64

Run status group 0 (all jobs):
  WRITE: io=4096.0MB, aggrb=11653KB/s, minb=11653KB/s, maxb=11653KB/s, mint=359927msec, maxt=359927msec

Disk stats (read/write):
  vda: ios=10354/1048736, merge=1/1593, ticks=150656/22858317, in_queue=22992530, util=100.00%

 

IOPS 的值越高,磁盘读写性能越好

 

磁盘性能的另一个指标是延迟,可以通过 IOPing 工具进行测试。

IOPing 会运行指定数量的磁盘 I/O 请求,并测试响应的时间。

输出结果测试使用 ping 命令测试网络延迟的输出。

操作如下提示安装 IOPing:

wget https://launchpad.net/ubuntu/+archive/primary/+files/ioping_0.9-2_i386.deb 
dpkg -i ioping_0.9-2_i386.deb

然后通过下面的命令运行测试:

ioping -c 10 .

输出结果类似下面这样,我们取其中 avg 对应的值。

4 KiB from . (ext3 /dev/vda1): request=1 time=1.87 ms
4 KiB from . (ext3 /dev/vda1): request=2 time=1.57 ms
4 KiB from . (ext3 /dev/vda1): request=3 time=2.02 ms
4 KiB from . (ext3 /dev/vda1): request=4 time=1.78 ms
4 KiB from . (ext3 /dev/vda1): request=5 time=1.79 ms
4 KiB from . (ext3 /dev/vda1): request=6 time=1.56 ms
4 KiB from . (ext3 /dev/vda1): request=7 time=2.14 ms
4 KiB from . (ext3 /dev/vda1): request=8 time=1.96 ms
4 KiB from . (ext3 /dev/vda1): request=9 time=2.64 ms
4 KiB from . (ext3 /dev/vda1): request=10 time=1.69 ms

--- . (ext3 /dev/vda1) ioping statistics ---
10 requests completed in 9.02 s, 525 iops, 2.05 MiB/s
min/avg/max/mdev = 1.56 ms / 1.90 ms / 2.64 ms / 303 us

请求响应时间越低,说明磁盘性能越好。

 

数据库服务器

首先,我们在测试用的云服务器上安装 sysbench 和 mysql-client:

apt-get -y install sysbench mysql-client

这里安装的 sysbench 版本为 0.4.12 。

然后登陆到购买的数据库实例,并创建测试数据库 dbtest。

mysql -h [云数据库IP] -P [云数据库端口号] -uroot -p[云数据库密码]

云数据库内网 IP 或访问地址,可从厂商的云数据库实例管理界面获取。如没有数据库服务器,请在腾讯云、阿里云等厂商以按量计费模式新建实例。

实例创建后,需要手动在控制台点击“初始化”来初始化实例,在此过程中会弹出窗口要求设置 root 用户的密码。阿里云 RDS 则需要在数据库登陆管理界面新建一个用户,指定用户名和密码;同时将 测试 ECS 的内网 IP 地址添加到服务器服务器的白名单中。具体操作参见管理页面。

登陆至云数据库服务器后,我们创建用户测试的数据库 dbtest。

create database dbtest;

然后,使用 sysbench 的 prepare 语句在指定数据中生成用于执行测试的表。

sysbench --test=oltp --oltp-table-size=1000000 --mysql-db=dbtest --mysql-host=[云数据库访问IP/地址] --mysql-user=[云数据库用户名] --mysql-password=[云数据库密码] prepare

该命令将新建一个名为 sbtest 的表,其中包含一百万行数据。在实际测试过程中,发现阿里云 RDS 在创建测试数据时用的时间明显较长

你可以登陆数据库检查是否创建成功:

mysql> use dbtest;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+------------------+
| Tables_in_dbtest |
+------------------+
| sbtest           |
+------------------+
1 row in set (0.00 sec)

mysql> SELECT COUNT(*) FROM sbtest;
+----------+
| COUNT(*) |
+----------+
|  1000000 |
+----------+
1 row in set (0.12 sec)

接下来,就可以使用 sysbench 命令进行针对 MySQL 的 OLTP 基准测试了。先执行一个数据库只读测试(oltp-read-only=on):

sysbench --test=oltp --oltp-table-size=1000000 --oltp-test-mode=complex --oltp-read-only=on --num-threads=6 --max-time=60 --max-requests=0 --mysql-db=dbtest --mysql-host=[云数据库访问IP/地址] --mysql-user=[云数据库用户名] --mysql-password=[云数据库密码] run

如果要执行读写测试,只需要将 oltp-read-only 的值设置为 off 即可。

测试输出如下图所示。

 

对象存储服务

对象存储服务性能测试的注意事项,请参考:论云存储服务性能评测的正确姿势

推荐的测试方法:

  • 使用对应厂商位于同一区域的云服务器

  • 确保测试机性能不弱,CPU等资源充足

  • 随机生产指定数量、大小的测试文件,如

    • 10000 个 50KB 文件

    • 1000 个 2MB 文件

    • 100 个 50MB 文件

  • 通过 SDK 计算上传、下载、删除等操作的用时

  • 使用同一批文件,通过 SDK 做高并发测试

测试脚本(基于 Python SDK)位于 Github 项目中的 test_cos 目录下。

测试数据位于 csv 目录下。

 

 

参考推荐

9家云服务评测结果:腾讯云第一、阿里云第二、华为云第三

用户使用评测:阿里云腾讯云谁性价比更高  (推荐

国内外公有云对比:功能介绍、性能测试  (推荐

全球云服务商对比:阿里云,太贵了  (推荐

AWS与阿里云在国内使用的对比评测

阿里云网络系列之经典网络和专有网络

AWS、Google、Apple云端宕机背后的故事