亚马逊AWS官方博客

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

需求背景

我们在上一篇文章中分享了如何为新迁移上云的服务器选择合适的机型,在这篇文章中,我们将继续我们的EC2优化之路。当您将工作负载迁移到云上稳定运行了一段时间后,就可以开始考虑调整EC2机型以节省成本或者更好的满足业务发展的需要了。

您可能会问,为什么上云后这么麻烦?我以前在数据中心运行工作负载时一般几年才考虑做一次容量规划,根本不用每年做规划,这么麻烦能给我带来什么好处呢?俗话说,一分耕耘一分收获,当然是有好处的:

  • 首先,云的优势就是即买即用,按照用量付费。这就是说你不用为支撑一年以后的业务发展而购买多余的资源,而只需要估算一年的业务增长量(基于一年固定RI的情况)即可。
  • 其次,AWS每年都会推出新的服务器类型,一般来说新的服务器会比旧的型号有更好的性价比,而且,也会有一些旧型号的服务器停止业务支持。每年进行一次容量规划可以借此机会淘汰一些旧机型,采用一些新机型,而且还会节省成本。
  • 第三,估算毕竟是估算,总有误差的。而不同业务的发展也是不均衡的,有的快一些,有的慢一些。每年做一次容量规划可以根据一年的性能指标重新调整一下资源的分配方式,将有限的资金用在最恰当的地方。

所有说,优化并不一定总是降配省钱,也包含适当的扩容。

方案概述

我们的目的很明确,根据现有的资源分配情况和利用率,选择满足条件的最经济的EC2资源。在开始程序设计之前,我们先看看在云上运行了将近一年,我们手里有什么数据。很明显,我们有每个服务器的机型信息,我们应该还会有服务器的性能数据(通过CloudWatch以及安装CloudWatch Agent),包括CPU的峰值利用率和内存的峰值利用率。如果你收到AWS Support团队给你发出的机型退役邮件,你还会有即将淘汰的机型信息。如果你近期和业务部门沟通过,你还会拿到未来一年的业务发展计划数据,据此,你可以粗略估算一下预期的CPU和内存利用率,具体逻辑和方法可以参加上一篇文章中的介绍。

现在我们开始介绍select_ri.py里面RI类的第二个方法select_ec2_by_type。我们的输入项还是Excel表格形式,每条记录的格式如下:

type

cpu_rate target_cpu_rate memory_rate target_mem_rate prefer source_os

type:源系统EC2型号(必选)

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

 

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

target_type target_vcpu target_memory target_price source_vcpu source_memory source_price savings source_ondemand target_ondemand

 

target_type:目标EC2的类型

target_vcpu:目标EC2的CPU核数

target_memory:目标EC2的内存大小

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

source_ondemand:源EC2的On-Demand实例价格

source _vcpu:源EC2的CPU核数

source _memory:源EC2的内存大小

source _price:源EC2的一年标准RI实例价格

source _ondemand:源EC2的On-Demand实例价格(每小时)

savings:“源EC2的一年标准RI实例价格”与“目标EC2的一年标准RI实例价格”的差值

输入参数:

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

 

select_ec2_by_type方法内部的逻辑是这样的:

第一步,取得现有EC2的信息,包括CPU核数、内存大小、一年标准RI实例价格、On-Demand实例价格

q = "select DISTINCT vcpu, memory, all_upfront_price_1yr

from price_table

where (type == '{}') and (tenancy == '{}') and (location == '{}') and (os == '{}') and (all_upfront_price_1yr > 0) and {} and  (license_model=='{}')".format(

    input_row['type'][0], tenancy, location, ec2_os, preInstalledSw_option, licenseModel)


try:

    base = sqldf(q, locals())

except:

    base = pd.DataFrame()

    base.columns = ['vcpu', 'memory', 'all_upfront_price_1yr']

 

第二步,根据现有的信息,选择合适的机型 (满足CPU和内存要求,且价格低于原有的类型)

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 <= {}) and (all_upfront_price_1yr > 0) and (license_model == '{}') and {} {};".format(float(t_vcpu), float(t_memory), tenancy, location, ec2_os, float(base.all_upfront_price_1yr), licenseModel, self.exclude, preInstalledSw_option)

try:

    target = sqldf(q, locals())

except:

    target = pd.DataFrame()

    target.columns = ['type', 'vcpu','memory', 'min(all_upfront_price_1yr)']

 

第三步,如果目前满足要求的机型都比之前的机型贵,则选择最便宜的那款

if pd.isnull(target['type'])[0]:

    target = self.select_ec2_by_config(input_row)

 

您也许注意到了,这里调用了上一篇文章中介绍的方法:self.select_ec2_by_config。因为这个逻辑就是选择满足条件的最便宜的机型。一般来说,调用这个方法的触发条件一般都是因为老的机型已经退役了或者目前的机型需要进行升级配置。

下面就给大家展示一下测试的效果,输入文件:

输出文件:

我们可以看到,因为使用的缺省的prefer值,所以目标CPU和内存的利用率都是90%,2台目前CPU峰值利用率高于90%的服务器都做了升级,总的来说成本节省了29.3%,优化的效果还是挺明显的。

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

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 团队高级顾问,长期从事企业客户入云解决方案的制定和项目的实施工作。