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

Redis/Codis性能瓶颈揭秘:网卡软中断的影响与优化

目录

现象回顾

问题剖析

现场分析

解决方案

总结与反思

1.调整中断亲和性(IRQ Affinity):

2.RPS(Receive Packet Steering)和 RFS(Receive Flow Steering):


近期,我们的一位客户在生产环境中遭遇了广告业务访问超时的问题,尤其是在晚间高峰时段,这严重影响了业务运行。尽管客户经过一整天的努力,仍未能定位问题的根本原因,因此向我们寻求协助。通过我们的共同努力和深入分析,我们最终锁定了性能瓶颈——网卡软中断。现在,让我们一同回顾这次解决性能挑战的全过程。

现象回顾

在晚高峰期间,广告业务相关接口大量超时,服务日志中频繁出现访问Codis超时的错误记录。服务访问Codis的超时时间设定为200毫秒,但在问题时段,这一时间限制被频频突破。

问题剖析

通过监控数据,发现出问题时Codis的QPS(每秒请求数)明显降低,而连接数却显著上升。连接数增加可能有两方面原因:一是访问Codis的时延增大,导致业务连接池中的连接不够用,需要新建连接;二是业务流量突增,导致访问Codis的量变大,连接数不足,同样需要新建连接。然而,从QPS的监控数据来看,并没有出现QPS增长的趋势,因此可以排除业务流量突增的原因。

进一步分析发现,问题主要集中在IP为192.168.16.77的服务器上。这台服务器上的Codis-server(Redis)响应时间明显增加,达到了十几到二十毫秒,并且该服务器的内存使用也有明显上升。猜测此次事故可能与该服务器或网络层面有关。

然而,在检查服务器和网络层面的监控后,并未发现明显异常。同时,查看了该服务器上的Codis日志和系统日志,也均未发现异常记录。由于Codis的slowlog已被冲掉,无法确定问题发生时是否存在慢查询。此外,虽然业务服务日志中记录的超时Key都不是大Key,但仍然不能排除大Key对性能的影响

现场分析

在第二天晚高峰时段,问题再次出现。我们立即登录到服务器上执行top命令,发现软中断分布极不均衡,个别CPU上的软中断占用率已高达80%以上。这导致与Codis发生CPU争抢,使得Codis CPU使用率打满,响应时间大幅增加。

解决方案

迅速执行了均衡网卡软中断的脚本,将软中断均匀分布到各个CPU上,执行后,业务响应时间迅速恢复正常。

总结与反思

1.正常情况下,客户Redis和Codis服务器都会执行均衡网卡软中断的脚本。但在此次事件中,客户生产环境遗漏了对该服务器的操作。同时,由于之前业务量较小,即使存在软中断问题,也未达到性能瓶颈。因此,这个问题在之前并未暴露出来。

2.为了避免类似问题的再次发生,客户在监控系统中增加了软中断相关指标,并设置了阈值告警通知。

3.总结影响Redis性能的关键因素,为后续性能问题分析提供思路:

4.网卡软中断:

软中断是Linux内核处理网络数据包的重要机制。与硬中断相比,其优先级较低,主要用于处理耗时的网络数据包接收和发送任务。在网络硬件接收到数据包后,会先通过硬件中断将数据放入队列,随后由软中断进行处理。

在Redis服务器上,若遇到高网络负载,某个CPU的软中断占用率过高可能会影响系统整体性能。因此,均衡网卡软中断的负载对系统性能至关重要。软中断允许Linux内核在非抢占式环境中处理异步事件,如网络数据包的收发。当网卡接收到数据包,它会通过软中断信号通知CPU进行处理,包括数据复制、网络统计信息更新等操作。若网络流量大或处理效率不高,软中断可能会大量占用CPU资源,导致使用率显著上升。

因此,合理地均衡网卡软中断的负载是非常重要的,以下是两种常用均衡网卡软中断的方法,客户这里是采用了irqbalance服务自动调整中断亲和性,并使用第二种方式进行软中断均衡优化:

1.调整中断亲和性(IRQ Affinity)

可以通过调整中断亲和性,将中断处理分配到多个CPU上。可以使用irqbalance服务自动调整中断亲和性,或者手动设置/proc/irq/<irq号 /smp_affinity文件来指定中断处理的CPU。

/proc/interrupts文件在Linux系统中提供了有关中断(IRQ)的详细信息。这个文件的内容通常包括以下信息:

  • 中断编号:每一行的开头是中断的编号(或名称),例如 0, 1, 2,或 LOC(本地中断),NMI(非屏蔽中断)等。

  • CPU列:接下来的几列显示每个CPU核处理该中断的次数。每个列对应一个CPU核,显示该核处理该中断的计数。这些计数器可以帮助你了解中断在不同CPU核之间的分布情况。

  • 中断类型:有时会有一个标识符来表示中断类型,比如 IR-IO-APIC 或 PCI-MSI,这表示中断的来源或类型。

  • 中断名称或设备:最后一列通常显示与中断相关的设备或驱动程序名称。这可以帮助你识别哪个设备或驱动程序正在使用该中断。

例如,以下是一个典型的 /proc/interrupts 文件的输出示例:

           CPU0       CPU1       CPU2       CPU3  0:         66          0          0          0   IO-APIC-edge      timer  1:          2          0          0          0   IO-APIC-edge      i8042  8:          1          0          0          0   IO-APIC-edge      rtc0  9:          0          0          0          0   IO-APIC-fasteoi   acpi 16:        123          0          0          0   IO-APIC-fasteoi   ehci_hcd:usb1 23:       4567          0          0          0   IO-APIC-fasteoi   eth0

此codis服务器16.77信息如下,网卡对应的中断号为86,87,88,89;采用irqbalance服务自动调整亲和性,分别使用CPU8,CPU10,CPU12,CPU14。

2.RPS(Receive Packet Steering)和 RFS(Receive Flow Steering)

RPS和RFS是Linux内核提供的机制,用于将网络数据包的处理分配到多个CPU上。可以在/proc/sys/net/core/rps_sock_flow_entries/sys/class/net//queues/rx-/rps_cpus以及/sys/class/net//queues/rx-/rps_flow_cnt中进行配置。

比如40核服务器设置如下:

echo ff,ffffffff > /sys/class/net/<interface>/queues/rx-<n>/rps_cpusecho 4096 > /sys/class/net/<interface>/queues/rx-<n>/rps_flow_cntecho 131072 > /proc/sys/net/core/rps_sock_flow_entries其中:rps_cpus是一个位掩码,表示允许使用的CPU核,ff,ffffffff则表示40核全部允许使用rps_flow_cnt表示当前网络设备rps队列的流表数,需要设置为2的整数次幂,建议设置为4096,数值越大,同时所能处理的rps流越多。131072为4096*接收队列的数量

****************************************************************************************************

点开看看就知道了:DBdoctor-数据库性能诊断

相关文章:

Redis/Codis性能瓶颈揭秘:网卡软中断的影响与优化

目录 现象回顾 问题剖析 现场分析 解决方案 总结与反思 1.调整中断亲和性&#xff08;IRQ Affinity&#xff09;&#xff1a; 2.RPS&#xff08;Receive Packet Steering&#xff09;和 RFS&#xff08;Receive Flow Steering&#xff09;&#xff1a; 近期&#xff0c;…...

微知-DOCA ARGP参数模块的相关接口和用法(config单元、params单元,argp pipe line,回调)

文章目录 1. 背景2. 设置参数的主要流程2.1 初始化2.2 注册某个params的处理方式以及回调函数2.4 定义好前面的params以及init指定config地点后start处理argv 3. 其他4. DOCA ARGP包相关4.1 主要接口4.2 DOCA ARGP的2个rpm包4.2.1 doca-sdk-argp-2.9.0072-1.el8.x86_64.rpm4.2.…...

PostgreSQL高可用Patroni安装(超详细)

目录 一 安装Patroni 0 Patroni 对Python的版本要求 1 卸载原来的Python 3.6 版本 2 安装Python 3.7 之上版本 3 安装依赖 psycopg3 4 安装patroni 5 卸载 patroni 二 安装ETCD 1 使用 yum 安装 etcd 2 etcd 配置文件 3 管理 etcd 4 设置密码 5 常用命令 三 安装…...

mcu之,armv7架构,contex-M4系列,时钟树,中断,IO架构(一)

写这篇文章的目的&#xff0c;是记录一下arm架构的32mcu&#xff0c;方便记忆芯片架构原理&#xff0c;方便我展开对&#xff0c;BootLoader的研究。 arm架构&#xff0c;时钟树&#xff0c;先做个记录&#xff0c;有空写。...

论文解析:基于区块链的去中心化服务选择,用于QoS感知的云制造(四区)

目录 论文解析:基于区块链的去中心化服务选择,用于QoS感知的云制造(四区) 基于区块链的去中心化云制造服务选择方法 一、核心内容概述 二、核心创新点及原理与理论 三、实验与理论分析 PBFT(实用拜占庭容错) 论文解析:基于区块链的去中心化服务选择,用于QoS感知的…...

详细解析STM32 GPIO引脚的8种模式

目录 一、输入浮空&#xff08;Floating Input&#xff09;&#xff1a;GPIO引脚不连接任何上拉或下拉电阻&#xff0c;处于高阻态 1.浮空输入的定义 2.浮空输入的特点 3.浮空输入的应用场景 4.浮空输入的缺点 5.典型配置方式 6.注意事项 二、输入上拉&#xff08;Inpu…...

【hacker送书第16期】Python数据分析、挖掘与可视化、AI全能助手ChatGPT职场工作效率提升技巧与案例

解锁数据分析与AI应用的双重秘密&#xff1a;全面推广《Python数据分析、挖掘与可视化从入门到精通》与《AI全能助手ChatGPT职场工作效率提升技巧与案例》 前言Python数据分析、挖掘与可视化从入门到精通&#x1f495;内容简介获取方式 AI全能助手ChatGPT职场工作效率提升技巧与…...

翼鸥教育:从OceanBase V3.1.4 到 V4.2.1,8套核心集群升级实践

引言&#xff1a;自2021年起&#xff0c;翼鸥教育便开始应用OceanBase社区版&#xff0c;两年间&#xff0c;先后部署了总计12套生产集群&#xff0c;其中核心集群占比超过四分之三&#xff0c;所承载的数据量已突破30TB。自2022年10月&#xff0c;OceanBase 社区发布了4.2.x 版…...

WebGIS开发中不同坐标系坐标转换问题

在 JavaScript 中&#xff0c;使用 proj4 库进行坐标系转换是一个非常常见的操作。proj4 是一个支持多种坐标系的 JavaScript 库&#xff0c;提供了从一种坐标系到另一种坐标系的转换功能。 以下是使用 proj4 进行坐标系转换的基本步骤&#xff1a; 1. 安装 proj4 你可以通过…...

【青牛科技】视频监控器应用

1、简介&#xff1a; 我司安防产品广泛应用在视频监控器上&#xff0c;产品具有性能优良&#xff0c;可 靠性高等特点。 2、图示&#xff1a; 实物图如下&#xff1a; 3、具体应用&#xff1a; 标题&#xff1a;视频监控器应用 简介&#xff1a;视频监控器工作原理是光&#x…...

AWTK-WIDGET-WEB-VIEW 实现笔记 (3) - MacOS

MacOS 上实现 AWTK-WIDGET-WEB-VIEW 有点麻烦&#xff0c;主要原因是没有一个简单的办法将一个 WebView 嵌入到一个窗口中。所以&#xff0c;我们只能通过创建一个独立的窗口来实现。 1. 创建窗口 我对 Object-C 不熟悉&#xff0c;也不熟悉 Cocoa 框架&#xff0c;在 ChatGPT…...

PgSQL即时编译JIT | 第1期 | JIT初识

PgSQL即时编译JIT | 第1期 | JIT初识 JIT是Just-In-Time的缩写&#xff0c;也就是说程序在执行的时候生成可以执行的代码&#xff0c;然后执行它。在介绍JIT之前&#xff0c;需要说下两种执行方式&#xff1a;解释执行和编译执行。其中解释执行是通过解释器&#xff0c;将代码逐…...

Go小记:使用Go实现ssh客户端

一、前言 SSH&#xff08;Secure Shell&#xff09;是一种用于在不安全网络上安全访问远程计算机的网络协议。它通过加密的方式提供远程登录会话和其他网络服务&#xff0c;保证通信的安全性和数据的完整性。 本文使用golang.org/x/crypto/ssh包来实现SSH客户端 可以通过go …...

Nginx Spring boot指定域名跨域设置

1、Nginx配置跨域&#xff1a; server {listen 80;server_name your-backend-service.com;location / {proxy_pass http://localhost:8080; # Spring Boot应用的内部地址proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-F…...

深入理解Redis(七)----Redis实现分布式锁

基于Redis的实现方式 1、选用Redis实现分布式锁原因&#xff1a; &#xff08;1&#xff09;Redis有很高的性能&#xff1b; &#xff08;2&#xff09;Redis命令对此支持较好&#xff0c;实现起来比较方便 2、使用命令介绍&#xff1a; &#xff08;1&#xff09;SETNX SETNX …...

Database Advantages (数据库系统的优点)

数据库管理系统&#xff08;DBMS&#xff09;提供了一种结构化的方式来存储、管理和访问数据&#xff0c;与传统的文件处理系统相比&#xff0c;数据库提供了许多显著的优点。以下是数据库系统的主要优势&#xff1a; 1. Data Integrity (数据完整性) 概念&#xff1a;数据完整…...

Qt桌面应用开发 第五天(常用控件)

目录 1.QPushButton和ToolButton 1.1QPushButton 1.2ToolButton 2.RadioButton和CheckBox 2.1RadioButton单选按钮 2.2CheckBox多选按钮 3.ListWidget 4.TreeWidget控件 5.TableWidget控件 6.Containers控件 6.1QScrollArea 6.2QToolBox 6.3QTabWidget 6.4QStacke…...

初识Linux · 信号处理 · 续

目录 前言&#xff1a; 可重入函数 重谈进程等待和优化 前言&#xff1a; 在前文&#xff0c;我们已经介绍了信号产生&#xff0c;信号保存&#xff0c;信号处理的主题内容&#xff0c;本文作为信号处理的续篇&#xff0c;主要是介绍一些不那么重要的内容&#xff0c;第一个…...

【Linux】虚拟地址空间,页表,物理内存

目录 进程地址空间&#xff0c;页表&#xff0c;物理内存 什么叫作地址空间&#xff1f; 如何理解地址空间的区域划分&#xff1f; 地址空间结构体 为什么要有地址空间&#xff1f; 页表 cr3寄存器 权限标记位 位置标记位 其他 每个存储单元是一个字节&#xff0c;一…...

C++ 并发专题 - 线程安全的单例模式

一&#xff1a;概述&#xff1a; 在C编程中&#xff0c;call_once 是一种机制&#xff0c;用于确保某个函数或代码段在多线程环境下仅被调用一次。这种机制常用于初始化资源、配置全局变量或执行只需执行一次的逻辑。在 C11 标准中&#xff0c;std::call_once 是由标准库提供的…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...