Redis6的IO多线程分析
性能测试
机器配置
C++
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 14
On-line CPU(s) list: 0-13
Mem: 62G
性能




配置推荐
官方表示,当使用redis时有性能瓶颈时,才推荐开启该功能,但是消耗更多的cpu time。并且,开启i/o多线程,至少要是4核以上的cpu,并且需要预留一个空闲cpu。比如4核就配io-threads=2,8核至多配io-threads=6。对于4核以上的机器,官方更推荐配置io-threads=4,因为再往上叠加,收益相对较低了,也没有太大必要。
另外,io-threads-do-reads配置默认no。i/o多线程默认是的是写socket多线程,socket连接本身就是epoll多路复用模式,理解下来开启此配置对性能不太有提升空间。
分析
多线程模型
并非是标准的Reactor多线程模型。主线程将就绪的socket交给IO线程去读写,IO线程处理完后主线程开始进行下一步操作。

流程图

IO线程执行函数代码分析
void *IOThreadMain(void *myid) {long id = (unsigned long)myid;char thdname[16];snprintf(thdname, sizeof(thdname), "io_thd_%ld", id);redis_set_thread_title(thdname);//设置线程的CPU亲和性redisSetCpuAffinity(server.server_cpulist); //设置线程可以在任意时刻被kill//pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);//pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);makeThreadKillable(); while(1) {/* Wait for start *///主线程setIOPendingCount(id, count)时,这里先空转一下。for (int j = 0; j < 1000000; j++) {if (getIOPendingCount(id) != 0) break;}/* 如果pending count 小于线程数*2,或者io_threads_num == 1,那么交给主线程自己处理,阻塞子线程。* (入口是:handleClientsWithPendingWritesUsingThreads->stopThreadedIOIfNeeded)* 主线程尝试加锁,加锁成功后,子线程就阻塞在这里了。(见:stopThreadedIO)*/if (getIOPendingCount(id) == 0) {pthread_mutex_lock(&io_threads_mutex[id]);pthread_mutex_unlock(&io_threads_mutex[id]);continue;}serverAssert(getIOPendingCount(id) != 0);/* Process: note that the main thread will never touch our list* before we drop the pending count to 0. */listIter li;listNode *ln;//每个线程都有自己的list,遍历list执行就序操作。listRewind(io_threads_list[id],&li); while((ln = listNext(&li))) {client *c = listNodeValue(ln);//handleClientsWithPendingWritesUsingThreads()会把就序操作设置为IO_THREADS_OP_WRITEif (io_threads_op == IO_THREADS_OP_WRITE) {writeToClient(c,0); //写//handleClientsWithPendingReadsUsingThreads()会把就序操作设置为IO_THREADS_OP_READ} else if (io_threads_op == IO_THREADS_OP_READ) {readQueryFromClient(c->conn); //读(需开启io-threads-do-reads)} else {serverPanic("io_threads_op value is unknown");}}listEmpty(io_threads_list[id]);// 置0,表示这个线程已经处理完了。setIOPendingCount(id, 0);}
}
相关文章:
Redis6的IO多线程分析
性能测试 机器配置 C Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 14 On-line CPU(s) list: 0-13 Mem: 62G性能 配置推荐 官方表示,当使用redis时有性能瓶…...
kali linux安装教程
安装 Kali Linux 非常简单,下面是基本的步骤: 首先下载 Kali Linux 的 ISO 镜像文件。你可以从官方网站 https://www.kali.org/downloads/ 下载。 确保你的计算机支持使用盘或者 USB 启动。你可以在计算机开机时按下 F12 或者其他类似的按键,…...
React进阶之路(四)-- React-router-v6、Mobx
文章目录 ReactRouter前置基本使用核心内置组件说明编程式导航路由传参嵌套路由默认二级路由404路由配置集中式路由配置 Mobx什么是Mobx环境配置基础使用observer函数*计算属性(衍生状态)异步数据处理模块化多组件数据共享Mobx和React职责划分 ReactRout…...
55基于matlab的1.高斯噪声2.瑞利噪声3.伽马噪声4.均匀分布噪声5.脉冲(椒盐)噪声
基于matlab的1.高斯噪声2.瑞利噪声3.伽马噪声4.均匀分布噪声5.脉冲(椒盐)噪声五组噪声模型,程序已调通,可直接运行。 55高斯噪声、瑞利噪声 (xiaohongshu.com)...
Codeforces Round 908 (Div. 2)视频详解
Educational Codeforces Round 157 (A--D)视频详解 视频链接A题代码B题代码C题代码D题代码 视频链接 Codeforces Round 908 (Div. 2)视频详解 A题代码 #include<bits/stdc.h> #define endl \n #define deb(x) cout << #x << "…...
电路综合-基于简化实频的SRFT集总参数切比雪夫低通滤波器设计
电路综合-基于简化实频的SRFT集总参数切比雪夫低通滤波器设计 6、电路综合-基于简化实频的SRFT微带线切比雪夫低通滤波器设计中介绍了使用微带线进行切比雪夫滤波器的设计方法,在此对集总参数的切比雪夫响应进行分析。 SRFT集总参数切比雪夫低通滤波器综合不再需要…...
Linux系统编程——实现cp指令(应用)
cp指令格式 cp [原文件] [目标文件] cp 1.c 2.c 功能是将原文件1.c复制后并改名成2.c(内容相同,实现拷贝) 这里需要引入main函数的参数解读: 我们在定义函数时许多都带有参数,输入参数后便可进行定义函数内的功能执行,而main…...
20231112_DNS详解
DNS是实现域名与IP地址的映射。 1.映射图2.DNS查找顺序图3.DNS分类和地址4.如何清除缓存 1.映射图 图片来源于http://egonlin.com/。林海峰老师课件 2.DNS查找顺序图 3.DNS分类和地址 4.如何清除缓存...
使用ssh上传数据到阿里云ESC云服务上
在这之前需要安装 ssh2-sftp-client 直接在终端输入:npm i ssh2-sftp-client 直接上代码: const path require(path); const Client require(ssh2-sftp-client);// 配置连接参数 const config {host: your-server-ip, // 云服务器的IP地址port: 22, …...
【408】计算机学科专业基础 - 数据结构
数据结构知识 绪论 数据结构在学什么 如何用程序代码把现实世界的问题信息化 如何用计算机高效地处理这些信息从而创造价值 数据结构的基本概念 什么是数据: 数据是信息的载体,是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序…...
SpringSpringBoot自动装配
文章目录 spring自动装配的好处Spring框架提供了三种自动装配的方式:Springboot自动装配Springboot自动装配的原理 spring自动装配的好处 Spring的自动装配(Autoscan or Autowiring)在开发中带来了多方面的好处,使得应用程序更加…...
k8s 部署mqtt —— 筑梦之路
mqtt是干嘛的,网上有很多资料,这里就不再赘述。 --- apiVersion: apps/v1 kind: Deployment metadata:labels:app: mqttname: mqttnamespace: default spec:replicas: 1selector:matchLabels:app: mqttstrategy:rollingUpdate:maxSurge: 25%maxUnavaila…...
模型部署:量化中的Post-Training-Quantization(PTQ)和Quantization-Aware-Training(QAT)
模型部署:量化中的Post-Training-Quantization(PTQ)和Quantization-Aware-Training(QAT) 前言量化Post-Training-Quantization(PTQ)Quantization-Aware-Training(QAT) 参…...
C++模板元模板(异类词典与policy模板)- - - 题目答案
目录 一、书中第一题 二、书中第三题 三、书中第五题 四、书中第六题 五、书中第七题 六、书中十一题 七、书中十二题 八、 书中十三题 总结 一、书中第一题 #include <iostream>template <typename T, size_t N> struct NSVarTypeDict {static void Cre…...
二十三种设计模式全面解析-组合模式与迭代器模式的结合应用:构建灵活可扩展的对象结构
在前文中,我们介绍了组合模式的基本原理和应用,以及它在构建对象结构中的价值和潜力。然而,组合模式的魅力远不止于此。在本文中,我们将继续探索组合模式的进阶应用,并展示它与其他设计模式的结合使用,以构…...
postgresql|数据库|提升查询性能的物化视图解析
前言: 我们一般认为数字的世界是一个虚拟的世界,OK,但我们其实有些需求是和现实世界一模一样的,比如,数据库尤其是关系型数据库,希望在使用的数据库能够更快(查询速度),…...
Unity中Shader雾效的原理
文章目录 前言一、我们先看一下现实中的雾二、雾效的混合公式最终的颜色 lerp(雾效颜色,物体颜色,雾效混合因子) 三、雾效的衰减1、FOG_LINEAR(线性雾衰减)2、FOG_EXP(指数雾衰减1)3、FOG_EXP(指数雾衰减2) 前言 Unity中Shader雾…...
chatgpt辅助论文优化表达
chatgpt辅助论文优化表达 写在最前面最终版什么是好的论文整体上:逻辑/连贯性细节上一些具体的修改例子 一些建议,包括具体的提问范例1. **明确你的需求**2. **提供上下文信息**3. **明确问题类型**4. **测试不同建议**5. **请求详细解释**综合提问范例&…...
Vue3 源码解读系列(二)——初始化应用实例
初始化应用实例 创建 Vue 实例对象 createApp 中做了两件事: 创建 app 对象保存并重写 mount /*** 创建 Vue 实例对象*/ const createApp ((...args) > {// 1、创建 app 对象,延时创建渲染器,优点是当用户只依赖响应式包的时候࿰…...
网络原理-UDP/TCP详解
一. UDP协议 UDP协议端格式 由上图可以看出,一个UDP报文最大长度就是65535. • 16位长度,表示整个数据报(UDP首部UDP数据)的最大长度(注意,这里的16位UDP长度只是一个标识这个数据报长度的字段࿰…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
