记一次真实项目的性能问题诊断、优化(阿里云redis分片带宽限制问题)过程
前段时间,接到某项目的压测需求。项目所有服务及中间件(redis、kafka)、pg库全部使用的阿里云。
压测工具:jmeter(分布式部署),3组负载机(每组1台主控、10台linux 负载机)
问题现象:
混合场景压测时,发现通过增加线程数、扩容被测服务数量等方式,服务整体吞吐量最大仅到TPS 1.6万左右(预期目标TPS 2万),不会随着线程的增加、服务容器数量增加而增长,且增加线程后,接口耗时开始增加。注:接口耗时正常应为100毫秒内,此时为1秒以上。
下图为几次压测后被测服务的总吞吐量。

问题诊断方向:(因压测的各接口未为数据库交互,数据库未纳入检查范围)
- 查看被测服务日志耗时。确认存在部分耗时超过1秒的日志。基本确认接口耗时慢问题在服务端。
- 检查被测服务的资源使用情况(CPU、内存、磁盘IO、带宽)。压测期间被测服务的各项资源使用正常,排除嫌疑。下图为其中一台服务资源使用情况。

- 检查压测负载机资源使用是否存在瓶颈。压测期间各负载机CPU及内存、磁盘使用均正常,排除嫌疑。
- 检查压测负载机与被测服务间网络带宽。负载机网络带宽100MB,压测期间各负载机带宽仅使用30MB左右,排除嫌疑。
- 检查被测服务使用的中间件(redis、kafka)资源使用情况。下图为redis集群资源使用情况,看起来也没问题。


于是进行下一步的排查:
1、查看接口耗时的各分段耗时。在程序中增加打印断点耗时日志(阶段处理逻辑超过100或200毫秒时会进行打印、仅开启服务集群中的一台断点日志打印即可)
通过断点日志打印,发现耗时超过200ms的为redis查询key的操作。
2、检查redis集群是否存在慢日志。发现redis存在大量的慢日志,redis请求一次耗时500000us(500ms)以上。终于找到元凶了。

接下来针对redis进行仔细的检查(检查下各redis分片使用是否正常、redis中影响性能的配置文件参数)。
经排查,发现redis集群(共8个分片)的其中一个分片带宽比其他7个分片,出网带宽要高90MB。分片带宽使用率100%以上。终于找到原因了。如下图对比:


接着看下redis分片设置的默认带宽值,发现单分片默认带宽值为96MB。如下图。

解决措施:1)redis分片带宽设置为自动弹性带宽。

redis分片带宽调整后,回归压测,确认服务吞吐量上来了(QPS 29000,预期QPS 20000,已满足预期),接口耗时在100ms内,各redis分片带宽使用均匀、各服务资源使用正常。至此优化结束。

(三组负载机中的其中一组压测结果)

相关文章:
记一次真实项目的性能问题诊断、优化(阿里云redis分片带宽限制问题)过程
前段时间,接到某项目的压测需求。项目所有服务及中间件(redis、kafka)、pg库全部使用的阿里云。 压测工具:jmeter(分布式部署),3组负载机(每组1台主控、10台linux 负载机) 问题现象࿱…...
LeetCode - 4. 寻找两个正序数组的中位数
. - 力扣(LeetCode) 题目 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 示例 1: 输入:nums1 …...
算法设计与分析——动态规划
1.动态规划基础 1.1动态规划的基本思想 动态规划建立在最优原则的基础上,在每一步决策上列出可能的局部解,按某些条件舍弃不能得到最优解的局部解,通过逐层筛选减少计算量。每一步都经过筛选,以每一步的最优性来保证全局的最优性…...
【实战篇】GEO是什么?还可以定义新的数据类型吗?
背景 之前,我们学习了 Redis 的 5 大基本数据类型:String、List、Hash、Set 和 Sorted Set,它们可以满足大多数的数据存储需求,但是在面对海量数据统计时,它们的内存开销很大,而且对于一些特殊的场景&…...
SpringBoot最佳实践之 - 项目中统一记录正常和异常日志
1. 前言 此篇博客是本人在实际项目开发工作中的一些总结和感悟。是在特定需求背景下,针对项目中统一记录日志(包括正常和错误日志)需求的实现方式之一,并不是普适的记录日志的解决方案。所以阅读本篇博客的朋友,可以参考此篇博客中记录日志的…...
【Flutter】状态管理:高级状态管理 (Riverpod, BLoC)
当项目变得更加复杂时,简单的状态管理方式(如 setState() 或 Provider)可能不足以有效地处理应用中状态的变化和业务逻辑的管理。在这种情况下,高级状态管理框架,如 Riverpod 和 BLoC,可以提供更强大的工具…...
OAK相机的RGB-D彩色相机去畸变做对齐
▌低畸变标准镜头的OAK相机RGB-D对齐的方法 OAK相机内置的RGB-D管道会自动将深度图和RGB图对齐。其思想是将深度图像中的每个像素与彩色图像中对应的相应像素对齐。产生的RGB-D图像可以用于OAK内置的图像识别模型将识别到的2D物体自动映射到三维空间中去,或者产生的…...
smartctl硬盘检查工具
一、smartctl工具简介 Smartmontools是一种硬盘检测工具,通过控制和管理硬盘的SMART(Self Monitoring Analysis and Reporting Technology),自动检测分析及报告技术)技术来实现的,SMART技术可以对硬盘的磁头单元、盘片电机驱动系统、硬盘…...
清空MySQL数据表
要清空 MySQL 数据表,您可以使用 TRUNCATE 或 DELETE 命令 使用 TRUNCATE 命令 TRUNCATE 命令用于删除表中的所有数据,并重置自增 ID(如果存在): TRUNCATE TABLE table_name;将 table_name 替换为您要清空的表的名称…...
2024年妈杯MathorCup大数据竞赛A题超详细解题思路
2024年妈杯大数据竞赛初赛整体难度约为0.6个国赛。A题为台风中心路径相关问题,为评价预测问题;B题为库存和销量的预测优化问题。B题难度稍大于A题,可以根据自己队伍情况进行选择。26日早六点之前发布AB两题相关解题代码论文。 下面为大家带来…...
Kafka系列之:Kafka集群磁盘条带划分和Kafka集群磁盘扩容详细方案
Kafka系列之:Kafka集群磁盘条带划分和Kafka集群磁盘扩容详细方案 一、lsblk命令二、Kafka节点磁盘条带化方案一三、Kafka节点磁盘条带化方案二四、理解逻辑区块LE五、查看kafka节点磁盘条带划分情况六、Kafka节点磁盘扩容一、lsblk命令 lsblk命令用于列出块设备的信息,包括磁…...
【LeetCode】修炼之路-0007- Reverse Integer (整数反转)【python】
题目 Reverse Integer Given a signed 32-bit integer x, return x with its digits reversed. If reversing x causes the value to go outside the signed 32-bit integer range [-231, 231 - 1], then return 0. Assume the environment does not allow you to store 64-b…...
【Flutter】页面布局:线性布局(Row 和 Column)
在 Flutter 中,布局(Layout)是应用开发的核心之一。通过布局组件,开发者可以定义应用中的控件如何在屏幕上排列。Row 和 Column 是 Flutter 中最常用的两种线性布局方式,用于水平和垂直排列子组件。在本教程中…...
C语言巨难题:执行操作可获得的最大总奖励 I(C语言版)
1.题目: 给你一个整数数组 rewardValues,长度为 n,代表奖励的值。 最初,你的总奖励 x 为 0,所有下标都是 未标记 的。你可以执行以下操作 任意次 : 从区间 [0, n - 1] 中选择一个 未标记 的下标 i。如果…...
【力扣】GO解决子序列相关问题
文章目录 一、引言二、动态规划方法论深度提炼子序列问题的通用解法模式 三、通用方法论应用示例:最长递增子序列(LeetCode题目300)Go 语言代码实现 四、最长连续递增序列(LeetCode题目674)Go 语言代码实现 五、最长重…...
Ubuntu20.04安装VM tools并实现主机和虚拟机之间文件夹共享
1、Ubuntu20.04安装VM tools 参考这个,很详细:Ubuntu 20.04 安装 VMwareTools 教程 2、实现主机与VMware虚拟机共享文件夹 设置共享文件夹参考:windows和虚拟机互传文件的三种方式 挂载操作参考:主机与VMware虚拟机共享文件夹&…...
Linux 学习笔记(十七)—— 文件系统
终极目标:理解 inode 和 软硬连接; 文件系统:Ext2; 文件 文件内容 文件属性; ——> 磁盘上存储的文件 存储的文件内容 存储的文件属性; Linux系统中:文件内容使用数据块存储,文件属性使用inode(固定…...
【计算机网络 - 基础问题】每日 3 题(五十八)
✍个人博客:https://blog.csdn.net/Newin2020?typeblog 📣专栏地址:http://t.csdnimg.cn/fYaBd 📚专栏简介:在这个专栏中,我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞…...
Netty入门基础:IO模型中BIO\NIO概念及区别【附演示代码】
文章目录 😀BIO💢实战demo 🌈NIO🏍Buffer核心属性核心方法 🎗Channel🎈Selector核心方法 🧨实战demo 🎨粘包与半包 😀BIO 传统IO模型,同步阻塞,每…...
vue2 使用环境变量
一. 在根目录下创建.env.xxx文件 .env 基础系统变量,无论何种环境,都可使用其中配置的值,其他环境中的变量会覆盖.env中的同名变量。 .env.development 开发环境 .env.production 生产环境 .env.staging 测试环境 二. 内容格式 vue2 使用是以…...
安卓蓝牙开发避坑指南:Bluedroid初始化流程中的5个关键细节
安卓蓝牙开发避坑指南:Bluedroid初始化流程中的5个关键细节 在安卓蓝牙协议栈开发中,Bluedroid的初始化流程是系统与蓝牙硬件建立通信的基础桥梁。许多看似随机的蓝牙功能异常,往往源于初始化阶段某些参数的微妙配置差异。本文将深入剖析五个…...
OWL ADVENTURE Java面试题实战:手写一个简单的图像加载器
OWL ADVENTURE Java面试题实战:手写一个简单的图像加载器 最近在准备Java面试的朋友,是不是经常被问到IO、多线程这些基础?光背八股文总觉得心里没底。今天咱们换个玩法,不搞虚的,直接动手写一个能用在真实项目里的东…...
避坑指南:解决Livox Mid-360双雷达点云融合时坐标系错乱与IMU数据混杂问题
Livox Mid-360双雷达点云融合实战:坐标系校准与IMU数据分离全解析 当你在RViz中看到两个Livox Mid-360雷达的点云像醉酒的水母一样随机飘动,而IMU数据又像被搅拌机混合过的果汁——恭喜你,遇到了多传感器融合的经典难题。这不是简单的参数调整…...
DeepSeek-R1-Distill-Qwen-1.5B响应慢?函数调用优化实战解决方案
DeepSeek-R1-Distill-Qwen-1.5B响应慢?函数调用优化实战解决方案 你是不是也遇到过这种情况:好不容易在本地部署了DeepSeek-R1-Distill-Qwen-1.5B这个“小钢炮”模型,结果发现函数调用时响应特别慢?明明官方说RTX 3060能跑200 to…...
新手必看:Carsim与Simulink联合仿真搭建AEB系统的5个关键步骤
从零搭建AEB系统:Carsim与Simulink联合仿真实战指南 在自动驾驶技术快速发展的今天,自动紧急制动系统(AEB)已成为车辆安全领域的重要研究方向。对于车辆工程专业的学生和自动驾驶初学者而言,掌握Carsim与Simulink的联合…...
【STM32F4系列】【HAL库】【实战解析】MPU6050 DMP姿态解算与I2C通信优化
1. MPU6050与DMP库基础解析 第一次接触MPU6050时,我被它小巧的体积和强大的功能震撼到了。这个售价不到10元的芯片,居然能同时测量三轴角加速度和三轴线加速度。在实际项目中,我发现直接读取原始数据并不难,但要想获得稳定的姿态信…...
PHP开发者必看:如何在本地环境快速搭建gRPC和Protobuf开发环境
PHP开发者必看:如何在本地环境快速搭建gRPC和Protobuf开发环境 作为一名长期与PHP打交道的开发者,我深刻理解在微服务架构盛行的当下,掌握gRPC和Protobuf技术栈的重要性。记得第一次尝试在本地搭建环境时,光是版本兼容问题就耗费了…...
【Python 3.15 JIT终极指南】:20年CPython核心开发者亲授,从零部署到性能翻倍的5个关键跃迁
第一章:Python 3.15 JIT的诞生背景与核心设计哲学 Python 长期以来以开发效率和生态丰富性见长,但其解释执行模型在 CPU 密集型场景下始终面临性能瓶颈。CPython 的字节码解释器虽稳定可靠,却缺乏运行时优化能力;而第三方方案&…...
Bitahub算力上新 RTX3080 10G重磅登场
针对当前 AI 开发与科研场景中算力成本高、配置复杂的痛点,Bitahub 平台推出了 RTX3080 10G 显卡算力服务。该显卡具备 10GB 显存,能够满足模型训练、推理等多场景算力需求,同时平台定价极具竞争力:单卡低至 0.82 元 / 小时&#…...
从‘偏差-方差’到一行代码:用NumPy/PyTorch五步实现GAE,附PPO实战避坑点
从‘偏差-方差’到一行代码:用NumPy/PyTorch五步实现GAE,附PPO实战避坑点 强化学习中的策略优化常常面临一个核心挑战:如何准确评估动作的价值?广义优势估计(GAE)通过巧妙平衡偏差与方差,成为PP…...
