亚马逊AWS官方博客

如何自动化的选择和优化EC2系列(二)在迁移项目中,如何自动选择最经济的EC2

需求背景

我们在上一篇文章中讲了如何利用AWS Price List API生成EC2价格表,现在,我们就讲讲如何利用这个价格表自动化的选择最经济的EC2类型。

方案概述

在做大规模迁移时,我们首先要做的是收集线下数据中心X86服务器的信息,最基本的例如CPU核数,CPU峰值利用率,内存大小(GB),内存峰值利用率,操作系统类型。我们想根据这些基本信息估算一下在云上应该选择何种机型,以及一年的费用大约是多少。大多数客户在上云后都会购买一年标准RI实例以节省费用,所以我们就以一年全部预付费标准RI的价格作为选择机型的依据。选择机型的逻辑是:满足内存和CPU需求的最便宜的机型。

当然,由于我们买的是一年标准RI实例,在一年之内不可改变机型配置,所以也应该考虑预留一年的业务增长量。因此,在以上收集的基本信息的基础上,我们还要加上两条:我们期望的CPU利用率和内存利用率。举例来说,如果您目前的某个服务器的CPU和内存利用率是90%和80%, 您预计在一年内业务会有20% 的增长(我们姑且认为业务增长与资源需求成正比),当前的CPU是4核,内存是16GB。如果你希望当业务增长20%后,服务器的CPU和内存的利用率维持现状,即90%和80%, 选择的EC2机型应该在运行现有负载时的期望CPU利用率是90%/1.2=75%, 期望的内存利用率是80%/1.2=67%。

还有一点需要考虑的就是应用系统的特性,是以计算能力为主的还是以内存大小为主。AWS EC2 最小的CPU:内存配比是1:2,最大的是1:8。

  • 如果是以计算为主的,我们在选择服务器的时候只考虑满足CPU的计算能力,我们会挑选满足计算能力的最经济的EC2,这时的CPU:内存配置至少是1:2 (当然,如果价格合适,我们也会选择CPU:内存是1:4的机型。但是,前提条件是,CPU:内存=1:2的服务器已经可以满足内存需要)。
  • 如果是以内存为主的,我们在选择服务器的时候只考虑满足内存的大小,我们会挑选满足内存需求的最经济的EC2,这时的CPU:内存配置至少是1:4 (当然,如果价格合适,我们也会选择CPU:内存是1:8的机型。但是,前提条件是,CPU:内存=1:4的服务器已经可以满足CPU需要)。
  • 当然,你也可以要求同时满足内存和CPU的要求,那么这时的选择逻辑就是同时满足内存和CPU要求的最便宜的EC2机型。

综上所述,做机型选择的输入项有以下几条:

vcpu

cpu_rate target_cpu_rate

memory

memory_rate target_mem_rate prefer source_os

 

vcpu:源系统CPU核数(必选)

cpu_rate: 源系统CPU峰值利用率(可选),缺省为100 (100%)

target_cpu_rate: 期望的CPU利用率(可选),缺省为0.9(即90%)

memory:源系统内存大小(GB)(必选)

memory_rate: 源系统内存峰值利用率(可选),缺省为100 (100%)

target_mem_rate:期望的内存利用率(可选),缺省为0.9(即90%)

prefer:计算优化(c)、内存优化(m)或者同时考虑CPU和内存(c+m)(可选)缺省为c+m

source_os: 源系统操作系统类型(可选),缺省为Linux。如果是BYOL类型的,此处选择Linux

可选项为:Linux,RHEL,SUSE,Windows

 

为了实现机型选择自动化,我们构造了一个新的Python Library – select_ri.py。 select_ri.py里面定义了一个RI类,还有两个方法:

  1. select_ec2_by_type
  2. select_ec2_by_config

注意:我们在上一篇文章中生成的价格文件cn_ec2_standard_price.xlsx 需要与select_ri.py放在同一个目录下

 

这里我们先介绍第二个,第一个会在下一篇文章中介绍。

select_ec2_by_config的功能是根据上面定义的输入项(Excel格式记录),选择合适的EC2机型,输出如下信息:

target_type target_vcpu target_memory target_price target_ondemand

 

target_type:目标EC2的类型

target_vcpu:目标EC2的CPU核数

target_memory:目标EC2的内存大小

target_price:目标EC2的一年标准RI实例价格

target_ondemand:目标EC2的On-Demand实例价格

 

输入参数:

input_row: Excel的行记录

location=’China (Beijing)’:缺省是Beijing Region,还可以选择China (Ningxia)

ec2_os=’Linux’:缺省是Linux

tenancy=’Shared’:缺省是Shared,还可以选择Dedicated,

preInstalledSw=’NA’:针对于Windows, 还可以选择SQL Ent,SQL Std,SQL Web

licenseModel=’No License required’:针对Windows,还可以选择Bring your own license

如果在选择的机型上有要求,你也可以通过设置环境变量指定不选择哪些机型,例如:

os.environ['EXCLUDE_EC2_TYPE'] = "3,t"

在目标机型中不选择3系列(c3,m3,r3)和t(t2)系列的服务器。

 

在select_ri.py里面通过如下语句取得Exclude信息:

try:

exclude_list = os.getenv('EXCLUDE_EC2_TYPE').split(",")

except:

exclude_list = []

self.exclude = ""
if exclude_list != []:

for exclude_type in exclude_list:

self.exclude = self.exclude + f'(type NOT LIKE \'%{exclude_type}%\') and '

 

选择机型的逻辑是这样的:

q = "SELECT type,vcpu, memory,min(all_upfront_price_1yr)

FROM price_table

WHERE (vcpu >= {}) and (memory>={}) and (tenancy == '{}') and (location == '{}') and (os == '{}') and (all_upfront_price_1yr > 0) and {}{} and (license_model=='{}');".format(

t_vcpu, t_memory, tenancy, location, ec2_os, self.exclude, preInstalledSw_option, licenseModel)

 

这里的t_vcpu的计算是这样的:

if (prefer.lower() == 'c') | (prefer.lower() == 'c+m') | (prefer.lower() == 'm+c'):

try:

return float(cpu_base) * float(cpu_rate) / 100 / target_cpu_rate

except TypeError:

return float(cpu_base)

else:

return 0

(上面的cpu_base就是输入项中的vcpu(CPU核数))

 

t_memory的计算是这样的:

if (prefer.lower() == 'm') | (prefer.lower() == 'c+m') | (prefer.lower() == 'm+c'):

try:

return float(mem_base) * float(mem_rate) / 100 / target_mem_rate

except TypeError:

return float(mem_base)

else:

return 0

为了验证一下效果,我们准备了如下Excel表格作为输入项:

输出结果如下:

使用的测试程序如下:

from select_ri import *

import pandas as pd


input = pd.read_excel("blog2_input.xlsx")

output = pd.DataFrame()


ri = RI()

for i in range(0, input.shape[0]):

row = pd.DataFrame(input.loc[[i]])

row = row.reset_index(drop=True)

result = ri.select_ec2_by_config(input_row=row)

output = output.append(result, ignore_index=True, sort=False)

output = pd.concat([input, output], axis=1, join_axes=[input.index])

print (output)

output.to_excel('blog2_output.xlsx', index=False)

 

如果你没有收集到足够的信息,只是想初步评估一下迁移到云上的成本,那也没问题,最简单的输入信息如下:

你可以得到如下输出:

你也许很好奇,为什么目标服务器(r5系列)都比实际要求的大呢,为什么不选择更小的4系列服务器呢?

那么我们就看看如果选择4系列服务器,成本是多少。 你可以通过定义环境变量来实现。

os.environ[‘EXCLUDE_EC2_TYPE’] = “5”

 

运行结果如下:

仔细看看这两个输出文件中蓝色箭头所示的位置,这下你应该明白了吧,我们的程序真的是选择最经济的EC2机型!

 

本文中的完整程序可从这里下载:

https://github.com/shaneliuyx/awscnprice/tree/master/examples

————

如何自动化的选择和优化EC2系列(一)利用AWS Price List API生成中国区的EC2 价格表

如何自动化的选择和优化EC2系列(二)在迁移项目中,如何自动选择最经济的EC2(本博文)

如何自动化的选择和优化EC2系列(三)如何进行EC2优化,进一步优化成本

如何自动化的选择和优化EC2系列(四)如何为SAP应用选择合适的EC2

如何自动化的选择和优化EC2系列(五)如何整合RI续购日期

本篇作者

刘育新

AWS ProServe 团队高级顾问,长期从事企业客户入云解决方案的制定和项目的实施工作。