当前位置: 首页 > news >正文

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 自定义链路追踪

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

Linux驱动开发(速记版)--设备模型

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

动手学深度学习(李沐)PyTorch 第 6 章 卷积神经网络

李宏毅-卷积神经网络CNN 如果使用全连接层&#xff1a;第一层的weight就有3*10^7个 观察 1&#xff1a;检测模式不需要整张图像 很多重要的pattern只要看小范围即可 简化1&#xff1a;感受野 根据观察1 可以做第1个简化&#xff0c;卷积神经网络会设定一个区域&#xff0c…...

新编英语语法教程

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

Golang 服务器虚拟化应用案例

推荐学习文档 golang应用级os框架&#xff0c;欢迎stargolang应用级os框架使用案例&#xff0c;欢迎star案例&#xff1a;基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识&#xff0c;这里有免费的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&#xff0c;should&#xff0c;must_not2.3.2、f…...

Elasticsearch要点简记

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

【通信协议】IIC通信协议详解

IIC&#xff08;Inter-Integrated Circuit&#xff09;通信协议&#xff0c;又称为I2C&#xff08;Inter-Integrated Circuit 2&#xff09;协议&#xff0c;是一种广泛使用的串行通信协议。它由Philips Semiconductor&#xff08;现NXP Semiconductors&#xff09;开发&#x…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...

Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?

Pod IP 的本质与特性 Pod IP 的定位 纯端点地址&#xff1a;Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址&#xff08;如 10.244.1.2&#xff09;无特殊名称&#xff1a;在 Kubernetes 中&#xff0c;它通常被称为 “Pod IP” 或 “容器 IP”生命周期&#xff1a;与 Pod …...