当前位置: 首页 > 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…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

日常一水C

多态 言简意赅&#xff1a;就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过&#xff0c;当子类和父类的函数名相同时&#xff0c;会隐藏父类的同名函数转而调用子类的同名函数&#xff0c;如果要调用父类的同名函数&#xff0c;那么就需要对父类进行引用&#…...

通过MicroSip配置自己的freeswitch服务器进行调试记录

之前用docker安装的freeswitch的&#xff0c;启动是正常的&#xff0c; 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...