本文是记录利用云计算( AWS )对一个开源软件进行百万用户压力测试的过程,你可以认为是一篇云计算使用的基本入门文章。文章将一步步的展示作者一个人是如何利用云计算,构建,部署,测试,验证百万用户压测试这一过程的。希望能给云计算的使用者一点启发。文中所使用的所有代码 脚本,都可以在 https://github.com/xiaojiaqi/fakewechat 找到,本文的 wiki 地址在 https://github.com/xiaojiaqi/fakewechat/wiki/Stress-Testing-in-the-Cloud。 。因为个人能力有限,文中难免有各种错误,请谅解。如果有错误 建议 欢迎邮件 ppmsn2005#gmail.com
几个月以前 我开发了一个分布式的软件:fakewechat. 这是一个开源通信系统的原型,它实现了服务器的后端功能。比如它可以为用户提供可靠的通信,可以水平扩展。(它还是只是一个原型,和成熟的商业产品对比 没有意义)
现在我模拟测试了 1 千,1 万用户时候的场景,我认为符合我设计的要求。现在我想验证我的设计在 100 万用户的情况下,会怎么样?没有实践是没有发言权的,所以我需要模拟一个环境测试一下。 假设我是一位网站的工程师,现在网站每天服务 10 万人。我想测试当每天有 100 万用户的情况下,网站是否还能正常服务呢?
核心的需求 我需要很多的资源,服务器,网络,存储。我需要把程序放上去测试,搭建好环境,模拟出状态,并得出结果。
可能的解决方案:
方案 2 就是云计算
云计算的概念很广,这里的云计算可以特指 Iaas, 你可以简单的认为,远处有一个机房,你可以在这个机房暂时租用一些机器,几个小时或者几天以后,你就可以把这些机器还给机房,然后出一点租金。
国外: AWS.
国内:腾讯云 UC ...
我选择: AWS
理由:
缺点:
这里的例子是测试 fakewechat, 当然如果你是网站, AWS 做测试也是完全没有问题的。只是复杂度会有所提高,但是原理都一样。
操作目标: 1 位操作人员,在 10 分钟内完成项目,启动,部署和启动测试过程(不包括数据准备的过程),实现 fakewechat 项目百万用户压力测试。
在这个测试中我们主要涉及弹性云和私有网络这 2 项服务
AWS 的基本概念:
弹性云
简称为 EC2 , Amazon Elastic Compute Cloud (Amazon EC2) 是一种 Web 服务,可在云中提供大小可调的计算容量。该服务旨在降低开发人员进行网络规模级云计算的难度。
安全私有云
简称为 VPC , Amazon Virtual Private Cloud (Amazon VPC) 允许您在 Amazon Web Services (AWS) 云中预置一个逻辑隔离分区,让您在自己定义的虚拟网络中启动 AWS 资源。您可以完全掌控您的虚拟联网环境,包括选择自有的 IP 地址范围、创建子网,以及配置路由表和网关。
你可以这样简单理解 Ec2 就是虚拟机,它是你的计算资源。你可以启动很多虚拟机,然后在上面安装各种软件,提供服务。而 VPC 就是对你网络拓扑的描述,它描述了 你的网络是怎么构成的,外部用什么 DNS , IP 来访问,有那些子网,网关,路由。这样 Ec2 的主机拥有了私有或者公有的 IP ,就可以为用户服务了。
AWS 的概念非常复杂,要全部理解不是这样一篇小小的文章可以解决。
首先我们需要考虑如何设计一个水平扩展的架构。
下图是系统的架构图
我们可以看到架构在设计的时候已经考虑到了水平扩展的问题。所以,我们可以将系统 Cell 化。具体设计思想可见文档,简单的说我们可以把所有需要的服务划分为一个 Cell,一个 Cell 是可以独立的为用户提供服务的。
注意 简单的按照用户 id 号划分集群,会有非常大的局限性,实际生产环境中不能简单的使用。目前项目还没有实现实现动态的调度和配置,以后会实现这个要点。
为了进一步节省成本 系统还可以被优化成这个样子
一个虚拟机模拟一个集群,完成集群里所有的业务。(需要注意 这样的测试大部分流量并没有走真正的网络,和真实网络情况有差异。) 这样可以最大程度的节省成本。
如果在真正的生产环境,我们可以把各个服务进程分配到各个独立的服务器上,提高服务的能力。当用户人数降低的时候,我们又可以简单地把服务进程收缩到少数的服务器上,节省支出。真正的做到 收发自如。(本文离真正的收发自如还有 10 万多公里,剩下的路还需读者自行钻研)
画一下我们的测试需要用到网络拓扑图
这个拓扑比较简单,我简单的描述一下里面各个节点和作用
测试者: 测试者就是作者,作者利用 internet 连接进 AWS 集群,完成百万用户的测试 子网: 在这里我将测试划分为 2 个子网 10.0.1/24 和 10.0.2.0/24 .其中 10.0.1.0/24 这个子网有互联网的接入能力,也只放置了一台主机 10.0.1.11. 因为我需要在这台主机下载各种需要的软件包。 而 10.0.2.0/24 里面可以启动非常多的主机,比如从 10.0.2.11-10.0.2.200. 它们可以和主机 10.0.1.11 互通。它们可以每台服务器模拟一个集群,可以几台服务器模拟一个集群。
注意,一般来说我们会把网段做更好的规划。比如 10.0.2.0/24 这个网段作为接入服务器的网段。放置 100 台计算服务器。 10.0.4.0/24 这个网段作为数据库的网段,放置数据库,网络之间连接使用专门的网络设备。我这个测试比较简单,所有的东西都在同一个子网内,服务器之间的流量也不是非常大。
这一切和真正的实际环境,业务模型都有很大关系。 总之这里是个简单版本
开始 AWS 之旅 如果网络不好的,也许需要翻墙。
注册帐号
创建用户
输入用户信息
输入信用卡
我的账号是几年以前注册的,我记得当时会有电话回拨,输入验证码,然后信用卡会被扣除 1 美金。测试你的信用卡是否正常。这 1 美金不会真正的扣除,大概是这样,完成整个注册过程。如有有问题 请帮我修正。
软件部分 你需要准备以下的几样东西
考虑到 windows 的普及性,我 windows 平台上完成测试。 Mac os,Linux 的用户使用会在使用密钥的时候稍有不同,但问题不大。
浏览一下首页,右上端显示我正在使用东京区的网页控制台。 主服务区里面罗列了, AWS 提供的所有服务。目前我们只需要使用 2 种 弹性云,安全私有云。
点击右上端的"东京", 会罗列出所有的区域,你可以选择不同的区域跳转
点击首页的弹性云,可以看到弹性云的主页面。
点击启动实例就可以启动开启一个弹性云的主机。
第一步 选择一个 AMI , AMI 就是磁盘镜像,和 Ghost 很类似。 AMI 分为我的 AMI , AMI MarketPlace, 社区 AMI, AMI 标签里有 AMI ID , 根存储设备, 虚拟类型这几个参数。 注意 某些 AMI 是要收钱的。
第二步, 选择一个实例类型,实例的差别主要体现在 CPU,内存,网络
第三步,主要是配置网络,如子网,是否拥有外网 IP 等等
第四步,选择存储,也就是为主机选择一块"硬盘"
第五步 设置标签实例
第六步 设置安全组,也就是设置网络端口
最后运行实例
运行以后大概就是这样
AWS 的基本概念
主机部分:
网络部分:
注意点:
主机选择:
主机类型的选择: AWS 将主机分为了 通用,计算,内存。
CPU 核数从 1 到 32...
某些主机 CPU 有积分, 如果你使用一个 CPU 很弱的主机,跑一个重 CPU 的业务,那么它将迅速的把这个主机的 CPU 主机资源消耗殆尽,然后进入非常低速的状态,这时使用 top 检测系统,表现的状态就是 st 非常高。 aws 很精明,它将计算资源,内存资源,网络资源,存储资源都做了非常精确的划分。所以你需要谨慎的选择你的主机类型,不要让小马拉大车,同时也要避免大马拉小车的浪费。
解决办法: 在软件设计的时候,应该有各种参数控制程序对资源的使用,比如线程并发数,队列长度,是否可以暂停请求等等。你可以通过调节参数让主机的负载能力和 cpu 网络 的消耗符合要求。
Region :
各个分区的主机价格是不一样的!但是离你太远的话,网络又是问题。所以你需要做一个折中。
AMI :
有一些 AMI 是要花钱的,而且价格不菲。 比如 t2.Micro +RHEL 每小时是 0.08$ 而纯的 T2.Micro + linux 是 0.02$. 如果你在 t2.Micro 上使用 1 小时的 RHEL, 就可以使用等额 4 小时的 Centos. 作为工程师必须节约资源! (当然默认的 RHEL 的确很好用)
1
firefox12 OP 很不幸 V2EX 没办法把关键的部分贴出来,重新开一贴
|
2
qa52666 2016-05-05 23:26:20 +08:00 via Android
好厉害的样子
|
3
cnnblike 2016-05-05 23:32:43 +08:00 via iPhone
收藏了,明天细读
|
4
irainsoft 2016-05-05 23:56:23 +08:00 via Android
这后半部分写的也太详细了吧...新手教程级别的详细...
|
5
tracymcladdy 2016-05-06 00:32:01 +08:00
我觉得楼主这样压意义不大啊。
脱离具体业务做压力测试是吃力不讨好啊。 生产环境上压,然后基于压力测试的结果调优 linux 系统,中间件,缓存,数据库等相关的参数,优化资源配置,顺便代码级优化相应慢的 url 才是正道啊。。 |
6
binux 2016-05-06 00:36:59 +08:00
你前面铺垫这么多。。结果只用了 EC2 ,根本就是当 VPS 在用,根本就没有用到「云」啊
不说 DO , Linode ,就是国内云,它们也有内网啊,需求也能满足啊。 |
7
firefox12 OP @tracymcladdy 我在验证产品原型,验证架构的设计有扩展能力,所有的开发 测试 设计 编码只有我一个人,目前只能做成这样
|
8
SlipStupig 2016-05-06 16:35:36 +08:00
@firefox12 这种跟 AB 直接压力测试有啥区别吗?
|
9
firefox12 OP @SlipStupig 本质上没区别,这个测试完全可以用 ab 来做,但是需要生成符合要求的 url 而且不是一种请求,是多种请求,还需要判断状态,改变流程, ab 并不合适。
压力测试主要测试系统的负载能力, ab 可以做高并发,但我在入口做了保护,所以 不是你压力大就可以击垮我的系统的。系统的处理解决能力决定了能放多少哦请求进来 , Taobao 的双 11 交易数不过是 11 万 /s. nginx 多核很容易做到几万 qps ,难道几台服务器就能支持 Taobao 的双 11 了? 所以外部请求和核心处理是需要匹配。 |