2020 Google开发者大会重磅开幕 了解详情

如何整合RI续购日期

2019 年 9 月 29 日

如何整合RI续购日期

需求背景


看过以前四篇文章的介绍,作为一个云平台的管理人员,我想你应该非常熟悉如何做年度的 EC2 实例优化了,那么下面你一定会根据优化结果开始准备购买下一年的 RI 了。但是在很多企业中,由于的历史原因,并不是所有的 RI 都是在同一天购买的,也就是说,RI 的到期日分布在不同的月份和不同的日子,这样一批一批的购买是不是很繁琐呢?你也许会脑洞大开的想,我能不能选择日期临近的 RI 合并一起购买呢?这样就可以通过逐步减少购买 RI 的批次从而逐步增加每个批次的数量,合并以后可以省去很多麻烦。


但是选择在哪一天集中购买会更加经济呢?仔细想想,并不是每天的成本都是一样的。我们举个例子,你有 30 个 EC2 instance,最早过期日和最晚过期相差 2 个月,一共有 6 个批次。那么究竟选择哪一天集中购买最划算呢?


方案概述


要计算出哪一天购买最划算,我们需要分析一下我们所做决定的成本构成:


假设我们选择在第 X 天购买,对于任何一个 EC2, 在整个批次的 RI 购买周期内(从最早 RI 到期日至最晚 RI 到期日)有以下三部分成本:


  1. 原有机型RI的成本,


假设原有的 RI 在第 Y 天到期,如果在第 X 天购买新的 RI,则浪费了:


(X-Y)* 原有机型 RI 每日成本


如果 X-Y<=0, 则这部分成本为 0


2.新机型 RI 的成本


(RI 购买周期-X)*新机型 RI 每日成本


如果(RI 购买周期-X)<=0,则这部分成本为 0


3.On-Demand 成本


假设原有机型 RI 在第 Y 天到期,而我们在第 X 天购买了新机型的 RI,则从第 Y 天到第 X 天会以 On-Demand 的价格收取原有机型的费用


(Y-X)*原有机型 On-Demand 每日价格


如果 Y-X<=0, 则这部分成本为 0


我们要做的就是将每台 EC2 的这三部分成本加起来,选择一个合适的日子,使这三部分的成本之和最小。


我们使用第三篇文章介绍的优化方法生产的优化结果文件作为输入,输入的 Excel 的每条记录需要包含如下信息:


ri_expired_datetarget_pricesource_pricesource_ondemand


ri_experied_date:源系统 EC2 RI 的到期日(日期类型)


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


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


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


示例输入文件的格式如下:



上面的结果显示总计有 52 台服务器,原来分了 7 个批次购买 RI,最早到期日是 5 月 21 日,最晚到期日是 6 月 12 日。我们要计算的是如果这 52 台服务器今年一起购买 RI,那么在哪一天购买最划算?


下面这个 Python 程序(ri_plan.py)就是根据上述方案阐述的思路编写的,可以很好地解决这个问题。


import pandas as pd

from datetime import *

from datetime import date

from datetime import datetime


table = pd.read_excel("blog5_output.xlsx")

start_day = min(table['ri_expired_date']).date()

end_day = max(table['ri_expired_date']).date()

duration = (end_day - start_day).days

total_item = table.shape[0]

cost = []

for x in range(0, duration + 1):

sub_total = 0

for i in range(0, total_item):

current_item_date = (table.loc[[i]].ri_expired_date)[i].date()

# old price duration

op_day = ((current_item_date - start_day).days) - x

# on demand price duration

od_day = x - ((current_item_date - start_day).days)

# new price duration

np_day = (duration - x)

if op_day < 0:

op_day = 0

if od_day < 0:

od_day = 0

sub_total += ((table.loc[[i]].source_price)[i] / 365 * op_day + (table.loc[[i]].target_price)[i] / 365 * np_day + (table.loc[[i]].source_ondemand) * od_day * 24)[i]

cost.append(sub_total)

optimize_cost = min(cost)


print("{} {}".format(' Date', ' Cost'))

for i in range(0, len(cost)):

if cost[i] == optimize_cost:

recommand_date = start_day + timedelta(days=i)

current_date = start_day + timedelta(days=i)

current_date = datetime.combine(current_date, datetime.min.time())

print("{} {:.2f}".format(current_date.strftime('%Y-%m-%d'), cost[i]))

print ('\nRecommanded date to buy RI is {}'.format(recommand_date))

复制代码


运行后的结果如下:


$ python ri_plan.py
Date Cost
2019-05-21 135170.43
2019-05-22 129999.90
2019-05-23 124917.96
2019-05-24 119982.30
2019-05-25 115046.64
2019-05-26 110110.98
2019-05-27 105175.32
2019-05-28 100239.65
2019-05-29 102823.48
2019-05-30 105407.30
2019-05-31 107991.12
2019-06-01 110574.95
2019-06-02 113158.77
2019-06-03 115742.59
2019-06-04 118326.42
2019-06-05 127722.57
2019-06-06 137703.24
2019-06-07 147683.91
2019-06-08 157664.58
2019-06-09 167645.26
2019-06-10 177625.93
2019-06-11 187606.60
2019-06-12 197587.27
Recommended date to buy RI is 2019-05-28

复制代码


从上述运行结果可以看出,5 月 28 日购买 RI 是最好的选择。


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


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


本文转载自 AWS 技术博客。


原文链接:


https://amazonaws-china.com/cn/blogs/china/how-to-use-ec2-combine-ri-date-seriesfive/


2019 年 9 月 29 日 16:30 168
用户头像

发布了 1179 篇内容, 共 21.8 次阅读, 收获喜欢 14 次。

关注

欲了解 AWS 的更多信息,请访问【AWS 技术专区】

评论

发布
暂无评论
发现更多内容

ARTS-WEEK4

一周思进

ARTS 打卡计划

代码重构-学习总结

飞雪

架构师训练营 - 第三周总结

teslə

ARTS-WEEK3

Allen

故障演练利器之ChaosBlade介绍

心平气和

故障演练 故障注入

week3.学习总结

个人练习生niki

十万同时在线用户,需要多少内存?——Newbe.Claptrap 框架水平扩展实验

newbe36524

架构师训练营-第 02 周作业

rainbowbox

第三周总结

Karl

ARTS打卡 第4周

引花眠

ARTS 打卡计划

程序员的晚餐 | 6 月 21 日 自制小火锅

清远

美食

三周作业

飞雪

架构师训练营 - 学习笔记 - 第三周

心在飞

极客大学架构师训练营

week3 学习总结

耕夫

Go:使用Delve和Core Dump来调试

陈思敏捷

go golang debug gdb

Open-Falcon安装注意事项

wong

Open-Falcon Nightingale Monitor

设计模式练习及感想(训练营第三课)

看山是山

设计模式 极客大学架构师训练营

架构师训练营 - 第三周作业

teslə

手写单例

Karl

架构师训练营第三周作业

锦澄

极客时间 - 架构师培训 -3 期作业

Damon

Prometheus 2.19.0 新特性

耳东

Prometheus

还有比二分查找更快的算法,面向接口编程Protocol,John 易筋 ARTS 打卡 Week 05

John(易筋)

swift ARTS 打卡计划 二分查找 binary search protocol

架构师训练营-第 03 周作业提交

rainbowbox

极客大学架构师训练营

week3.课后作业

个人练习生niki

单例模式 组合模式

游戏夜读 | 《FPS关卡设计》

game1night

架构师训练营-第 03 周总结

rainbowbox

极客大学架构师训练营

架构师训练营 - 第 02 周学习总结

rainbowbox

组合设计模式

Karl

每周学习总结 - 架构师培训 3 期

Damon

技术学习进阶(死磕法)

dudu

学习方法 技术

2020中国技术力量年度榜单盛典

2020中国技术力量年度榜单盛典

如何整合RI续购日期-InfoQ