Finops成本优化企业实践-可视化篇
引言:上一章讨论了finops的一些方法论,笔者在拿到finops官方认证finops-engineer certificate之后,将方法论运用到所在项目组中,并于今年完成了40%的费用节省。在此将这些实践方法总结沉淀,与大家分享。实践包括三篇:可视化篇,可优化篇,可规划篇。这三篇里不讲太多理论,主要以实践为主,干货满满,理论部分可以看上一篇。
一、月度账单分析
1. 目的
可视化的目标,就是讲清楚你在云上花的每一笔钱。在起步阶段,不需要在这一步花费太多时间,遵从“爬、走、跑”原则,在较短时间内,把top5的cost分析清楚,后面优化阶段够你省的了。
我之前做TAM的时候,服务的一家客户,一家做ERP的公司,领导层决定做finops项目,于是上来就要先搞个可视化平台,于是平台从开发到上线三五个月过去了,还没进入优化阶段呢。
2. 方法
最省事的方法(不是最快,最快的方法是把我请过去做):让你们的云厂商来做。找到你们的TAM,让他每月做一个月度账单汇报,并给出优化建议。
当然这个方法也有一些弊端,厂商不够了解你们的业务,不了解你们这个月做了什么事情。比如你们这个月对集群做了一次蓝绿升级,遗留了一堆实例和ebs;或者你们对跨az的eks集群扩缩容了,遗留了一堆pvc(ebs不支持跨az挂载);或者你们对应用升级了,打了一堆计划之外的snapshot等等,厂商看着就会很懵。
自主分析,依托厂商提供的工具,以不同分组和纬度组合,得出你所需要的数据。本篇以AWS提供的cost explorer为例(阿里云、腾讯云、华为云都有类似的工具)。
3. 方向
账单分析的下一步是优化,那么优化的方向是我们需要在分析阶段break down的。不要上来就想着把最贵的干掉,确定优化方向要结合考虑业务稳定性、难易程度、人力投入成本。我推荐从以下四个优先级来做:
3.1 冗余资源
首先识别出多余的、不用的资源,删除不会有任何业务影响的资源,这部分也是比较容易识别的。例如没有使用的ec2,没有挂载的ebs,时间久远的snapshot,不再使用的vpc endpoint等等。
3.2 能快速恢复的资源
一些可快速恢复的资源,删减后可以快速恢复,对业务影响时间较短,可以放到第二优先级。常见于集群的自动扩缩容、spot节点替换、standby节点缩规格等。
3.3 人力成本投入较大的资源
前两个优先级做完后,基本可以省下一笔可观的钱,还想要继续深度优化的话,就要考虑一些投入比较大的、当然产出也比较可观的调整。比如架构优化,或者体系化地做资源整体的回收策略。
3.4 无法恢复的资源
这不一步不推荐做,尤其不推荐放在不成熟的finops阶段做。要做这不一定要把稳定性做的非常成熟再做(我计划再写一篇稳定性篇来讨论finops的稳定性如何做),简单讲,面对不可恢复的资源,要做好监控覆盖、应急预案、应急演练之后,且省无可省了,再考虑做这一步。
讲一个真实的案例(可以跳过):某部门新上任了一位部门领导,在做成本优化时,已经在月度分析的报告中告诉了他,计算资源、网络资源的占比是最高的,存储资源其次,我们应该优先分析计算资源,但他偏不,很倔强地定了一个决策:要清理aws S3存储桶里的数据,把该删的删了,不用的放冰川层。于是拉着一帮人去分析哪个数据是给哪个业务部门用的、花多少钱、占比多少(这三个问题在没有充分打标时是非常难统计的,尤其存储大小和费用的关系,当开启了智能分层时)。S3我们没有打标签,全靠bucket name人肉分析,花了一个来月。然后开始做house keeping,用life cycle左加一条规则又加一条规则,对着20几个桶加出了快上百条life cycle policy,一点都不优雅!最错误的一步是挪到冰川层,standard是0.25 $/Gb/month,本来我们开启智能分层,自动放进归档层只需要花费0.05$/Gb/month,已经很省了,为了再省3分钱(冰川层是哦。0.002$/Gb/month),要强行挪到平川层。挪到冰川层只有两个结果:一是彻底不用(那为什么不直接删掉),二是等待恢复(恢复费用超级贵的,除非你能放三年不用)。结果挪到冰川层的第二天,欧吼有人要用数据,于是开始紧急恢复,关键还没做恢复预案,临时提单给厂商帮忙恢复,花了较多时间恢复。在下一个月的账单里S3不仅没有省钱,倒花两千美金恢复数据,等恢复之后再过一个月,我们看到节省的效果只有1500$,然而却花了几个月的人力投入。
4. 维度
列出top5 的资源,没打标签之前先以service纬度列出,可以是饼状图或者柱状图,主要先定下我们优化的service,定了主要优化目标后,再继续往下细拆。
例如,我把成本按照service分组,可以看出70%的成本来自于ec2,而14%的成本来自于S3,那么接下来我的分析重心就是ec2。
再往下拆,在ec2里面,instance占比67%,other占比33%,再把other细拆:流量占到大头(流量费用即图中的interZone-in, interZone-out),ec2的流量来源于实例之间跨AZ的访问,我们发现是一个大数据的应用集群部署在了3个AZ上,而它每次做map-reduce时在集群内部就会产生大量跨AZ调用,导致流量费用升高。于是有了action1:调整应用集群的部署AZ来减少流量费用。再看图中存在gp2的使用,gp2相比gp3较贵,性能也差,应该全部替换或删除掉。于是有了action2:替换gp2为gp3,清理没有挂载的卷。
对于ec2的instance分析,我们可以打上应用的标签(注意,如果要展示费用明细,不同维度的过滤方式可能会有重叠,比如按照应用分析,A应用的ec2总费用会包含ebs、ec2之间的流量、snapshot),如下图所示,在确定应用的比重之后,可以继续细分,比如按照实例类型、api调用等。具体计算资源的优化方案会在规划篇详细介绍。
接下来是存储的细分,这里的存储特指对象存储,而非EBS存储卷,因为通常来讲对象存储的占比会是一个大头,EBS只是很小一部分,而且随着EC2的优化就被优化掉了。以AWS S3为例,S3存储桶有一个天然优势,即它自带一个key,就是它的name。所以我们可以得到每个存储桶所花的费用占比,所以我们可以很明确地得出哪个桶是我们最需要关注的。如图:
对于S3有两个维度,一个是存储维度,一个是请求维度,这两个维度,都必须搞清楚它的细节以及计费规则,才可有效优化。我们先从存储维度谈起,S3的存储分为如下几层:
在存储维度,有很关键的一步,就是开启智能分层,让数据自动归类,不需要琢磨着把它放到冰川层。如果想针对某个桶做house keeping,那么可以先过滤出具体的桶名,再以存储的维度展示,那么归档层占比较大的桶,就是我们首先做house keeping的对象。
下一个是请求维度,按照请求维度可以看到具体哪个桶的读写请求最多,再结合access log,查询出是什么应用在调用数据,是否合理。
例如下图,可以看到二月份的list bucket和get object请求特别多,可以进一步查询是哪个服务的调用增长。
5. 灵活运用api过滤和cloudtrail
在展示的时候,AWS的cost explorer还提供了一个很好的维度,即api。例如上图中ec2-other和s3 request都是通过api过滤出来的,可以详细看到里面的内容。
结合使用cloudtrail来定位具体费用,通过cloudtrail可以看到具体的资源、对象、时间、账号的事件。例如S3中某个请求在某一天调用频繁,可通过cloudtrail追踪具体是哪个账号在调用。
6. 指标
还记得公式 费用 = 单位时间资源使用量 * 费率 吗?其中的费率可以作为我们观测的主要指标,例如RI覆盖率、saving plans覆盖率。当覆盖率接近100%时,才证明我们充分利用了RI和saving plans。
如图,在周一到周五时,我们对集群扩容,从而使用的按需实例较多,没有被saving plans完全覆盖;而周末对集群缩容,刚好让所有的实例都被saving plans覆盖住。后续在做计划性的扩缩容时,可参考这一指标。
二、异常检测告警
1. 阈值告警
分析报告通常一个月做一次,但如果遇到天级别的问题,那么可以设置阈值告警,例如可以针对某一应用设置天级别的阈值,当超出阈值时发送邮件告警。
2. 异常告警
开启AWS 异常告警功能,当费用忽高忽低时,会发出警告。
三、关联服务费用
有一些服务的费用会相互关联,比如:
当glue频繁调用S3时,S3的读写请求费用会增高,如果开启了kms加密传输,那么kms加密解密的费用也会增加,guardduty扫描S3 bucket的费用也会增加(在guarduty里也能看出具体哪个桶费用最高,也是一个辅助分析的方式)。
相关文章:

Finops成本优化企业实践-可视化篇
引言:上一章讨论了finops的一些方法论,笔者在拿到finops官方认证finops-engineer certificate之后,将方法论运用到所在项目组中,并于今年完成了40%的费用节省。在此将这些实践方法总结沉淀,与大家分享。实践包括三篇&a…...

Spring Boot中线程池使用
说明:在一些场景,如导入数据,批量插入数据库,使用常规方法,需要等待较长时间,而使用线程池可以提高效率。本文介绍如何在Spring Boot中使用线程池来批量插入数据。 搭建环境 首先,创建一个Spr…...

Python机器学习:自然语言处理、计算机视觉与强化学习
📘 Python机器学习:自然语言处理、计算机视觉与强化学习 目录 ✨ 自然语言处理(NLP) 文本预处理:分词、去停用词词向量与文本分类:使用Word2Vec与BERT 🌆 计算机视觉基础 图像预处理与增强目标…...

Vue2 + ElementUI + axios + VueRouter入门
之前没有pc端开发基础,工作需要使用若依框架进行了一年的前端开发.最近看到一个视频框架一步步集成,感觉颇受启发,在此记录一下学习心得。视频链接:vue2element ui 快速入门 环境搭建和依赖安装 安装nodejs安装Vue Cli使用vue create proje…...

GO网络编程(四):海量用户通信系统2:登录功能核心【重难点】
目录 一、C/S详细通信流程图二、消息类型定义与json标签1. 消息类型定义2. JSON标签3.结构体示例及其 JSON 表示:4.完整代码与使用说明 三、客户端发送消息1. 连接到服务器2. 准备发送消息3. 创建 LoginMes 并序列化4. 将序列化后的数据嵌入消息结构5. 序列化整个 M…...

某项目实战分析代码二
某项目实战分析代码二 此次分析的是protobuf的使用操作流程具体实现 3. 业务数据分析3.1 客户端3.2 服务器端简单案例 此次分析的是protobuf的使用 Protocol Buffer( 简称 Protobuf) 是Google公司内部的混合语言数据标准,它是一种轻便高效的结构化数据存储格式&…...

全面指南:探索并实施解决Windows系统中“mfc140u.dll丢失”的解决方法
当你的电脑出现mfc140u.dll丢失的问题是什么情况呢?mfc140u.dll文件依赖了什么?mfc140u.dll丢失会导致电脑出现什么情况?今天这篇文章就和大家聊聊mfc140u.dll丢失的解决办法。希望能够有效的帮助你解决这问题。 哪些程序依赖mfc140u.dll文件…...

QT学习笔记1(QT和QT creator介绍)
QT学习笔记1(QT和QT creator介绍) Qt 是一个跨平台的应用开发框架,主要用于图形用户界面(GUI)应用的开发,但也支持非GUI程序的开发。Qt 支持多种平台,如Windows、macOS、Linux、iOS和Android&a…...

存储电话号码的数据类型,用 int 还是用 string?
在 Java 编程中,存储电话号码的选择可以通过两种常见方式进行:使用 int 类型或 String 类型。这种选择看似简单,但实际上涉及到 JVM 内部的字节码实现、内存优化、数据表示、以及潜在的可扩展性问题。 Java 基本数据类型与引用数据类型的差异…...

【目标检测】工程机械车辆数据集2690张4类VOC+YOLO格式
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2694 标注数量(xml文件个数):2694 标注数量(txt文件个数):2694 标注…...

target_link_libraries()
target_link_libraries() 是 CMake 中的一个命令,用于指定目标(如可执行文件或库)所依赖的其他库。其主要作用包括: 链接库:将指定的库链接到目标上,使目标能够调用这些库中的函数和使用其功能。 管理依赖…...

Javascript数组研究09_Array.prototype[Symbol.unscopables]
Symbol.unscopables 是 JavaScript 中一个相对较新的符号(Symbol),用于控制对象属性在 with 语句中的可见性。它主要用于内置对象,如 Array.prototype,以防止某些方法被引入到 with 语句的作用域中,避免潜在…...

SkyWalking 自定义链路追踪
对项目中的业务方法,实现链路追踪,方便我们排查问题 引入依赖 <!‐‐ SkyWalking 工具类 ‐‐> <dependency> <groupId>org.apache.skywalking</groupId> <artifactId>apm‐toolkit‐trace</artifactId> <vers…...

Linux驱动开发(速记版)--设备模型
第八十章 设备模型基本框架-kobject 和 kset 80.1 什么是设备模型 设备模型使Linux内核处理复杂设备更高效。 字符设备驱动适用于简单设备,但对于电源管理和热插拔,不够灵活。 设备模型允许开发人员以高级方式描述硬件及关系,提供API处理设备…...

动手学深度学习(李沐)PyTorch 第 6 章 卷积神经网络
李宏毅-卷积神经网络CNN 如果使用全连接层:第一层的weight就有3*10^7个 观察 1:检测模式不需要整张图像 很多重要的pattern只要看小范围即可 简化1:感受野 根据观察1 可以做第1个简化,卷积神经网络会设定一个区域,…...

新编英语语法教程
新编英语语法教程 1. 新编英语语法教程 (第 6 版) 学生用书1.1. 目录1.2. 电子课件 References A New English Grammar Coursebook 新编英语语法教程 (第 6 版) 学生用书新编英语语法教程 (第 6 版) 教师用书 1. 新编英语语法教程 (第 6 版) 学生用书 https://erp.sflep.cn/…...

Golang 服务器虚拟化应用案例
推荐学习文档 golang应用级os框架,欢迎stargolang应用级os框架使用案例,欢迎star案例:基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识,这里有免费的golang学习笔…...

Elasticsearch基础_4.ES搜索功能
文章目录 一、搜索辅助功能1.1、指定返回的字段1.2、结果计数1.3、结果分页 二、搜索匹配功能2.1、查询所有文档2.2、term级别查询2.2.1、term查询2.2.2、terms查询2.2.3、range查询2.2.4、exists查询 2.3、布尔查询2.3.1、must,should,must_not2.3.2、f…...

Elasticsearch要点简记
Elasticsearch要点简记 1、ES概述2、基础概念(1)索引、文档、字段(2)映射(3)DSL 3、架构原理4、索引字段的数据类型5、ES的三种分页方式(1)深度分页(fromsize)…...

【通信协议】IIC通信协议详解
IIC(Inter-Integrated Circuit)通信协议,又称为I2C(Inter-Integrated Circuit 2)协议,是一种广泛使用的串行通信协议。它由Philips Semiconductor(现NXP Semiconductors)开发&#x…...

2024年中国科技核心期刊目录(社会科学卷)
2024年中国科技核心期刊目录 (社会科学卷) 序号 期刊代码 期刊名称 1 SC02 JOURNAL OF S…...

用Python集成免费IP归属地查询API
IP查询的优势是什么? IP查询是一种强大的工具,能够快速提供关于IP地址的信息,如地理位置、互联网服务提供商(ISP)、连接类型等。这些数据在多种场景下都非常有用,帮助用户理解网络环境和用户行为。 首先&…...

C 数组
C 数组 数组是C语言中的一种基本数据结构,用于存储一系列相同类型的数据。它是连续的内存分配,允许通过索引快速访问元素。本文将详细介绍C数组的概念、使用方法、以及注意事项。 1. 数组的概念 数组是一个集合,可以存储一定数量的元素。在…...

【Unity】unity安卓打包参数(个人复习向/有不足之处欢迎指出/侵删)
1.Texture Compression 纹理压缩 设置发布后的纹理压缩格式 Use Player Settings:使用在播放器设置中设置的纹理压缩格式 ETC:使用ETC格式(兼容) ETC2:使用ETC2格式(很多设备不支持) ASTC:使用…...

C0016.Clion中qDebug()打印输出中文时,都是问号??????的解决办法
问题描述 在clion中使用qDebug打印输出中文内容时,都是?????如下图: 注意:修改该文件的编码格式就行,该文件名为apr.cpp; 解决办法...

C++ priority_queue 优先队列构造大根堆和小根堆
priority_queue的三个参数 template <class T, class Container std::vector<T>, class Compare std::less<typename Container::value_type>> class priority_queue;1、元素类型 2、底层容器类型,默认vector 3、比较函数(传入的是…...

音视频入门基础:FLV专题(9)——Script Tag简介
一、SCRIPTDATA 根据《video_file_format_spec_v10_1.pdf》第75页到76页,如果某个Tag的Tag header中的TagType值为18,表示该Tag为Script Tag(脚本Tag,又称Data Tag、SCRIPTDATA tag)。这时如果Filter的值不为1表示未加…...

Vue页面,基础配置
最简单页面 日期范围及字符搜索,监听器处理日期范围搜索控件清空重置问题导出、导出文件文件名称带日期时间表格日期指定格式显示。。。 <template><div class"app-container"><el-form :model"queryParams" ref"queryForm…...

(杨辉三角) 攻防世界--->notsequence
学习笔记。(不想看可以直接跳正文。) 前言:仿佛又回到高中 - - 只不过,是以另一种形式再次出现。 学习思维为主,做题位次。(后面再补。) 前置知识: 什么是杨辉三角: 杨辉三角_百度百科 (bai…...

【CTF Web】Pikachu CSRF(get) Writeup(CSRF+GET请求+社会工程学)
CSRF(跨站请求伪造)概述 Cross-site request forgery 简称为“CSRF”,在CSRF的攻击场景中攻击者会伪造一个请求(这个请求一般是一个链接),然后欺骗目标用户进行点击,用户一旦点击了这个请求,整个攻击就完成…...