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

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);}
}
http://www.lryc.cn/news/227595.html

相关文章:

  • kali linux安装教程
  • React进阶之路(四)-- React-router-v6、Mobx
  • 55基于matlab的1.高斯噪声2.瑞利噪声3.伽马噪声4.均匀分布噪声5.脉冲(椒盐)噪声
  • Codeforces Round 908 (Div. 2)视频详解
  • 电路综合-基于简化实频的SRFT集总参数切比雪夫低通滤波器设计
  • Linux系统编程——实现cp指令(应用)
  • 20231112_DNS详解
  • 使用ssh上传数据到阿里云ESC云服务上
  • 【408】计算机学科专业基础 - 数据结构
  • SpringSpringBoot自动装配
  • k8s 部署mqtt —— 筑梦之路
  • 模型部署:量化中的Post-Training-Quantization(PTQ)和Quantization-Aware-Training(QAT)
  • C++模板元模板(异类词典与policy模板)- - - 题目答案
  • 二十三种设计模式全面解析-组合模式与迭代器模式的结合应用:构建灵活可扩展的对象结构
  • postgresql|数据库|提升查询性能的物化视图解析
  • Unity中Shader雾效的原理
  • chatgpt辅助论文优化表达
  • Vue3 源码解读系列(二)——初始化应用实例
  • 网络原理-UDP/TCP详解
  • C#多线程入门概念及技巧
  • c primer plus_chapter_four——字符串和格式化输入/输出
  • Python Fastapi+Vue+JWT实现注册、登录、状态续签【登录保持】
  • oracle-sql语句解析类型
  • 2023 年最新企业微信官方会话机器人开发详细教程(更新中)
  • 3、FFmpeg基础
  • c语言:用指针解决有关字符串等问题
  • 吃透 Spring 系列—Web部分
  • JAVA后端服务端与移动端客户端高精度时间同步思路
  • nsd的资料
  • 关于Maven中pom.xml文件不报错但无法导包解决方法