Go 怎么做性能优化芝麻开门篇

news2024/12/16 17:40:58

一、性能优化的流程

我们在对某个功能(或单个接口)做性能优化的时候。一般是该功能(或接口)性能无法满足我们的业务要求,所以被迫优化。在开始优化之前,我们需要明白一些理论知识。

1、常见的性能优化指标
1.1 响应时间
  • 定义:接口从接收到请求到返回响应所需的时间。
  • 常见优化方法:
    • 缓存:减少对数据库或后端系统的频繁访问。
    • 异步处理:将耗时操作放到后台,避免阻塞主线程。
    • 数据压缩:减小返回的数据量,减少传输时间。
    • 优化算法:使用高效的算法和数据结构
1.2 并发数
  • 定义:接口能够同时处理的并发请求数量。
  • 常见优化方法:
    • 增加并发连接池:避免线程或数据库连接的瓶颈。
    • 限流(Rate Limiting):通过限制并发请求数,保证系统稳定性。
    • 适当配置线程池、数据库连接池等资源。
1.3 吞吐量
  • 定义:单位时间内,接口可以处理的请求数量。通常以每秒请求数(RPS)来表示。
  • 常见优化方法:
    • 使用负载均衡:通过多个服务器分担请求压力。
    • 数据库优化:通过分库分表、索引等方法提高数据库查询性能。
    • 使用高效的缓存策略,减少对后端的访问。
    • 异步化操作,提升并发处理能力。
1.4 资源消耗
  • 定义:接口处理请求时消耗的系统资源(如 CPU、内存、I/O)。
  • 常见优化方法:
    • 优化数据处理流程,减少不必要的计算。
    • 使用合适的缓存机制,避免重复计算。
    • 监控和优化内存使用,防止内存泄漏。
    • 使用合适的压缩算法,减少 I/O 操作。

这里有人可能会对RPS有点不大熟悉,那么它和QPS的区别是什么呢?

2.QPS和RPS的区别
2.1 QPS(Queries Per Second)
  • 定义:QPS 表示系统每秒钟处理的查询次数,通常用于描述 数据库查询 或 搜索引擎 的查询频率。

  • 使用场景:QPS 多用于衡量查询系统(如数据库、缓存系统、搜索引擎等)的处理能力,反映的是系统能够处理的查询请求的数量。

    例如:对于一个数据库,QPS 可能表示每秒从数据库中查询的记录数。如果某个搜索引擎的 QPS 为 1000,意味着每秒钟有 1000 个查询请求提交到搜索引擎,它需要处理并返回相应的搜索结果。

2.2 RPS(Requests Per Second)
  • 定义:RPS 表示系统每秒钟能够处理的请求次数。RPS 一般用于描述 Web 服务器 或 API 接口 的吞吐量,反映的是系统接受并处理请求的能力。
  • 使用场景:RPS 多用于 Web 应用、API 服务、负载均衡器等,描述这些系统在处理 HTTP 请求时的能力。
    例如:对于一个 Web 服务器,RPS 可能表示每秒处理的 HTTP 请求数量。如果某个 Web 服务器的 RPS 为 5000,意味着每秒钟该服务器可以处理 5000 个 HTTP 请求。
指标区别常用场景
QPS每秒查询次数,常用于数据库或查询引擎数据库、缓存、搜索引擎
RPS每秒请求次数,常用于衡量 Web 服务器或 API 的吞吐量Web 服务器、API 接口

实际上,QPS 是针对查询类操作的吞吐量度量,RPS 是针对网络请求的吞吐量度量。

3、性能优化怎么做
3.1 确定性能优化目标

在开始做性能优化之前,首先你要明确你的优化目标是什么,不同的优化目标对应着不同的优化策略,确定好性能优化目标,一方面可以避免过度优化,另一方面,是避免优化不足导致我们的系统无法继续支持后续发展。比如说,接口的QPS要达成多少,接口延迟需要达到多少,通过这些目标,才能明确我们的优化是否达标。

怎么算过度优化呢,比如说,一个内部系统页面查询太慢了,现在需要2s,然后你大费周章把它优化到了10ms , 花费了大量的时间和人力调整服务架构,搞分布式,提高了系统的复杂性,增大了系统维护成本,就没太大必要,因为它只是一个内部系统,我们在做任何决策的时候,都需要权衡我们的付出和收获,即ROI思想,把核心的资源用在核心的部分上

我们可以根据实际业务情况,来设定目标,例如搞活动的时候,我们要大概预估会有多少的活动用户,来确定某个查询接口的QPS,在评估上要有一定的系统冗余,即在保守估计上✖️个1.2~1.5倍,这样即使估摸不准确,或者突然有更多的参与用户,我们的系统也可以保证尽量不出问题。

确定性能目标,需要基于你手中拥有的资源和实际业务,做决策和权衡,比如说在保证接口时延不变的情况下,提高单机的QPS

说实话,决策和权衡能力很依赖一个人的经验,当然如果我们自己没有太多经验,那么我们可以去借鉴别人的经验。多实践多思考,必有收获。

3.2 找到瓶颈

为了更好的找到某个功能的瓶颈,我们可以对这个功能进行性能测试,单个请求测试和集群整体压测(全链路压测)。

单个请求测试的目的是确定我们自己的服务是否存在可优化点,比如接口延时是否符合预期,服务资源的使用是否合理,有没有异常报错

全链路压测的目的则是针对某个具体的功能进行上下游压测,方便我们找到整个链路中其他服务的卡点,来确定瓶颈是在本服务还是其他服务。

经常做活动服务的朋友应该对这方面比较有认知,活动对接口时延,QPS等要求都特别高,因此每次活动前都要模拟压测,确保活动当天不会出问题,一般都是进行全链路压测,通过链路追踪工具可以方便的看出具体是在哪个节点比较慢(本质上就是打日志分析),如果是本服务的瓶颈,我们可以针对性对具体的接口进行优化,如果是其他下游服务的瓶颈,则需要让其他团队帮忙优化。

当瓶颈点有多个时,我们可以找到最大的影响瓶颈,一步步做优化,为了控制好改造的成本,先解决一个相对好解决或者说是改造价值比较大的瓶颈,后续性能目标达不到再继续优化其他的点。

3.2 怎么对瓶颈进行优化

找到了瓶颈之后,我们就要分析瓶颈的原因是什么,不同的瓶颈分析的思路也是不同的。

如果是本服务的接口:在压测过程中,我们可以观察服务的资源消耗情况(内存、CPU、协程数),通过资源的使用情况来判断接口存在的问题。如果发现是内存的消耗过高导致单机吞吐量低,可以通过 pprof 抓取内存的火焰图,看具体是哪段代码在频繁的分配内存

而对于下游组件的瓶颈,例如说mysql。有一些常见的分析思路:

1、是否是服务调用 MySQL 的 IO 时间过长,这种情况可以看下是不是返回的数据量过大。
2、查看我们的 MySQL 请求是否存在慢查询,判断 SQL、索引使用合不合理。
3、如果排除了上述两个因素,需要分析下是否是因为我们的表太大、从库不够,还是说 MySQL 本身支持不了这么高的吞吐和这么严的延时要求

本质上观察几个点。

  • 服务和mysql的连接是否正常(连接池、网络等)
  • mysql 的响应是否正常(慢查询、查询量等)

针对Go来说。一个接口的瓶颈常见的问题有如下几点。

  • 网络吞吐量
  • Go服务资源限制
  • 代码逻辑
  • 下游组件的瓶颈

用人话说,首先可以先看看是不是代码问题,代码是不是有存在循环的数据库查询,可以改成批量查询来优化,同步操作能不能改成异步处理,内存使用是否合理,有没有内存泄漏,有没有协程泄漏,能不能加缓存层,网络调用是否有复用连接。

网络本身是否有问题,带宽,网络延迟。

服务的资源(内存、CPU、硬盘)够不够用

下游服务是不是高性能的组件。使用方式是否正确。

3.3 验证目标达成

为了验证性能目标是否达成,我们可以对调优过的应用进行性能测试,与优化前的各项指标进行对比,观测其是否符合预期。

如果瓶颈点没有消除或者性能指标不符合预期,则需要重复找瓶颈点、瓶颈分析、性能调优和验证目标是否达成的步骤,直到达成性能目标

在这里插入图片描述

二、性能优化的工具(篇幅太长没必要,第二篇再写)

pprof 工具
benchmark 功能
trace 工具

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2260627.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Elasticsearch入门到落地】4、Elasticsearch的安装

接上篇《3、es与mysql的概念对比》 上一篇我们学习了Elasticsearch与Mysql的概念与区别。本篇我们来进行Elasticsearch的环境准备及软件安装。 一、环境准备 如果我们没有自己的Linux服务器,且现在正在使用的是Windows操作系统的电脑,那么首先我们需要安…

CRYPTO密码学

加解密算法/编码 哈希算法SM3SHA-3base家族GBGB18030GB2312GBKutf家族恺撒二进制分区法unicodeASCIIDSADSSCRC32校验对称非对称gbk编码h264SEA初探smc动态代码保护四方密码曼彻斯特编码剖析基本概念什么是编码?什么是加密与解密寻找银弹-有没有无法破解的密码通过Java代码入门…

我们来学mysql -- 探讨win安装方式(安装篇)

题记 书接上回,在我们来学mysql – 闲聊(安装篇)中,拿到安装包,当宝贝一样揣在怀里 然而,还没捂热乎,得粉丝秘报,U哥,上篇文章用了滞后的官方文档,哈哈哈…内心的小倔强&#xff0c…

pip 如何快速安装包

一、问题描述 当使用Python通过pip安装一些包时,pip默认是访问的国外的源,但在国内访问又是异常的慢,而且还经常因为网络问题导致安装失败,比如下面通过pip install jupyter来安装jupyter Notebook,这网速真的超级慢&…

CodeBook-Ubuntu-sandbox Linux 沙箱服务 docker pull

CodeBook-Ubuntu-sandbox Linux 沙箱服务 开源技术栏 这是一个多用户的 Linux SSH 服务沙箱,支持启动时动态加载用户列表,并可随时更新用户信息。每个用户仅能修改自己目录下的文件,确保了环境的安全性和隔离性。 目录 文章目录 CodeBook-…

【echarts】数据过多时可以左右滑动查看(可鼠标可滚动条)

1. 鼠标左右拖动 在和 series 同级的地方配置 dataZoom: dataZoom: [{type: inside, // inside 鼠标左右拖图表,滚轮缩放; slider 使用滑动条start: 0, // 左边的滑块位置,表示从 0 开始显示end: 60, // 右边的滑块位置&#xf…

【数据分享】2014-2024年我国POI兴趣点数据(免费获取/来源于OSM地图)

POI是Point of Interest的简称,意为“兴趣点”,是互联网电子地图中用于表示特定位置的地理实体的核心数据类型。POI通常用于标注具体地点,例如餐厅、商场、学校、医院、景点等。这些数据以点的形式呈现,并附带详细属性信息&#x…

使用html和JavaScript实现一个简易的物业管理系统

码实现了一个简易的物业管理系统,主要使用了以下技术和功能: 1.主要技术 使用的技术: HTML: 用于构建网页的基本结构。包括表单、表格、按钮等元素。 CSS: 用于美化网页的外观和布局。设置字体、颜色、边距、对齐方式等样式。 JavaScript…

SSM 垃圾分类系统——高效分类的科技保障

第五章 系统功能实现 5.1管理员登录 管理员登录,通过填写用户名、密码、角色等信息,输入完成后选择登录即可进入垃圾分类系统,如图5-1所示。 图5-1管理员登录界面图 5.2管理员功能实现 5.2.1 用户管理 管理员对用户管理进行填写账号、姓名、…

ip_done

文章目录 路由结论 IP分片 数据链路层重谈Mac地址MAC帧报头局域网的通信原理MSS,以及MAC帧对上层的影响ARP协议 1.公司是不是这样呢? 类似的要给运营商交钱,构建公司的子网,具有公司级别的入口路由器 2.为什么要这样呢?? IP地…

排序算法(5):归并排序

问题 排序 [30, 24, 5, 58, 18, 36, 12, 42, 39] 归并排序 归并排序采用分治法,将序列分成若干子序列,每个子序列有序后再合并成有序的完整序列。 在数组排序中,如果只有一个数,那么它本身就是有序的。如果有两个数&#xff0…

uniapp打包apk教程

文章目录 一、uniapp是什么?二、使用步骤1.需要有Java环境,安装jdk2.安装hbuilderx开发工具3.自签证书4.使用云打包 总结 一、uniapp是什么? ‌uni-app是一个基于Vue.js的跨平台应用开发框架,允许开发者使用一套代码同时构建iOS、…

Titanic - Machine Learning from Disaster————泰坦尼克号幸存者预测————逻辑回归、随机森林和梯度提升树(XGBoost、LightGBM)

目录 1. 引言 2. 理解 Titanic 数据集 目标变量 数据的初步探索 3. 数据预处理 3.1 处理缺失值 3.2 处理类别型特征 3.3 创建新特征 3.4 删除无关特征 3.5 确保所有特征都是数值型 4. 模型选择与训练 4.1 数据集拆分 4.2 选择和训练模型 4.2.1 逻辑回归模型 4.2…

MySQL笔记--多表查询

1--多表关系 多表关系基本上分为三种: 一对多(多对一); 多对多; 一对一; 1-1--多对一 在多的一方建立外键,指向一的一方的主键; 1-2--多对多 建立第三张中间表,中间表至少…

利用git上传项目到GitHub

GitHub是基于git实现的代码托管。git是目前最好用的版本控制系统了,非常受欢迎,比之svn更好。 GitHub可以免费使用,并且快速稳定。 利用GitHub,你可以将项目存档,与其他人分享交流,并让其他开发者帮助你一…

Gate学习(7)引入体素源

一、从GitHub下载体素源模型源码 下载地址:BenAuer2021/Phantoms-for-Nuclear-Medicine-Imaging-Simulation:用于核医学成像应用的模型(闪烁显像、SPECT 和 PET) --- BenAuer2021/Phantoms-For-Nuclear-Medicine-Imaging-Simulat…

快速启动Go-Admin(Gin + Vue3 + Element UI)脚手架管理系统

Go-Admin 是一个基于 Gin Vue Element UI & Arco Design & Ant Design 的前后端分离权限管理系统脚手架。它包含了多租户支持、基础用户管理功能、JWT 鉴权、代码生成器、RBAC 资源控制、表单构建、定时任务等功能。该项目的主要编程语言是 Go 和 JavaScript。 ps&a…

epoll反应堆模型

epoll反应堆模型 基于该视频所做笔记,视频里面讲的也挺难的,最好先让chat给你梳理一遍整体的代码再去看视频吧 15-epoll反应堆模型总述_bilibili_哔哩哔哩_bilibili 文章目录 epoll反应堆模型1.epoll反应堆模型概述2.具体讲解1.myevent_s结构体2.超时检…

F-Cooper论文精读(未完成)

F-Cooper 文章目录 背景有关边缘计算基于单目激光雷达数据的3D目标检测 创新点与以前比创新之处1:引入基于特征的协同感知(F-Cooper)框架创新2:所需数据量减少 2. 基于特征融合的车辆数据处理2.1 卷积特征图2.2 融合特征2.2.1 融…

Z240004基于Java+ssm+maven+mysql的房屋租赁系统的设计与实现

基于ssmmavenmysql的房屋租赁系统的设计与实现 1.项目描述2.运行环境3.项目截图4.源码获取 1.项目描述 该项目在原有的基础上进行了优化,包括新增了注册功能,房屋模糊查询功能,管理员和用户信息管理等功能,以及对网站界面进行了优…