【转】Redis学习---阿里云Redis多线程性能增强版详解

【原文】https://www.toutiao.com/i6594620107123589635/

摘要

Redis做为高性能的K-V数据库,由于其高性能,丰富的数据结构支持,易用等特性,而得到广泛的应用。但是由于redis单进程单线程的模型限制,单Redis Server QPS最高只能达到10万级别。本文试图通过对Redis做多线程的优化,来达到增强性能的目的。

二、背景

众所周知redis是单进程单线程模型(不完全是单进程单线程,还有若干后端线程主要做刷脏数据,关闭文件描述符等后台清理工作)。redis中负责主要工作的是主线程,主线程的工作包括但不限:接收客户端连接,处理连接读写事件,解析请求,处理命令,处理定时器事件,数据同步等相关工作。单进程单线程只能跑满一个CPU核,在小包场景下,单个redis server的QPS在8~10万级别。如果QPS超过这个级别,单个redis server就无法满足需求。而常用的解决办法就是数据分片,采用多server的分布式架构予以解决。然而数据分片,多redis server方式也存在若干问题:redis server过多,难以管理;分片之后一些在单redis server上使用的命令无法支持;分片无法解决热点读写问题;分片后数据倾斜,数据重分布,数据扩缩容等也比较复杂。由于单进程单线程的局限,我们期望通过多线程的改造以期充分利用SMP多核架构的优势,从而达到提高单redis server吞吐的目的。对redis做多线程化,最容易想到的方案是每个线程既做IO又做命令处理等工作,但由于redis处理的数据结构相对比较复杂,多线程需要锁来保证线程安全性,而锁粒度处理不好性能反而可能会出现下降。

我们的思路是通过增加IO线程,将连接中数据的读写,命令的解析和数据包的回复放到单独的IO线程来处理,而对命令的处理,定时器事件的执行等仍让单一的线程来处理,以此达到提高单redis server吞吐的目的。

三、单进程单线程的优点和不足

1、优点

因为单进程单线程模型的限制,redis在实现上将耗时的操作分解成多步,多次来执行(例如dict rehash, 过期key删除等操作),尽量避免长时间执行一个操作,从而避免长时间阻塞在一个操作上。单进程单线程代码编写简单,可以减少多进程多线程导致的上下文切换和锁的争抢。

2、不足

  • 只能使用一个CPU核,无法发挥多核优势。
  • 对于重IO应用来说,大量的cpu耗费在网络IO操作上。对于将redis做为缓存的应用,往往都是重IO的应用。这类应用基本上都是QPS很高,使用的命令相对比较简单(多为get,set,incr等操作),但是对RT响应很敏感。这类应用通常带宽占用很高,甚至会跑到百兆级别。当前由于万兆,25G网卡的普及,网络往往已不再是瓶颈,而如何发挥多核优势,充分发挥网卡性能成为需要考虑的事情。

四、实现

1、线程划分

  • 主线程(MAIN THREAD)
  • IO线程(IO THREAD)
  • WORKER线程(WORKER THREAD)

2、线程模型

  • 主线程:接受连接,创建client,将连接转发给IO线程。
  • IO线程:处理连接的读写事件,解析命令,将解析的完整命令转发给WORKER线程处理,发送response包,负责删除连接等。
  • WORKER线程:负责命令的处理,生成客户端回包,定时器事件的执行等。
  • 主线程,IO线程,WORKER线程都有单独的事件驱动。
  • 线程之间通过无锁队列交换数据,通过管道进行消息通知。

五、收益

1、 压测结果

  • 从压测结果来看,小包场景下,读写性能差不多有三倍左右的性能提升。

2、主从同步速度提升

3、主从同步优化

Master向Slave发送同步数据时,数据在IO线程中发送,Slave从主读取数据时,全量数据在WORKER线程中读取,增量数据在IO线程中读取,因此可以相对比较有效的增加同步的速度。

4、后续工作

  • 现在所做的第一部分工作是增加IO线程,优化IO读写能力。进一步的优化可以考虑对WORKER线程进行拆分:每个线程既负责IO读取,也负责WORKER工作处理。

5、IO线程数设置

  • 从测试结果来看,IO线程数最大不要超过6个。超过之后对简单操作来说,WORKER线程往往已经成为瓶颈。
  • 进程在启动时需要设置IO线程的个数,在进程运行期间IO线程个数无法修改,按当前的连接分配策略,修改IO线程的个数涉及到连接的重新分配,处理相对比较复杂。

六、展望

  • 随着万兆网卡,25G网卡的普及,如何充分利用硬件的性能需要充分的考虑。多网络IO线程,By pass内核的用户态协议栈等都是可利用的技术。
  • 通过IO线程实现数据的迁移,可以无阻塞,IO线程对数据进程Encode,或者命令转发,目标节点实现数据Decode,或者命令执行。

原文地址:https://www.cnblogs.com/ftl1012/p/9569099.html

时间: 2024-11-05 06:25:59

【转】Redis学习---阿里云Redis多线程性能增强版详解的相关文章

阿里云部署 Flask + WSGI + Nginx 转载详解

我采用的部署方案是: Web 服务器采用 uwsgi host Flask 用 Supervisor 引用 uwsgi 作常规启动服务 基于 Nginx 作反向代理 首先, 阿里云服务器可以通过 SSH 指令在本机的终端进行远程连接 ssh [email protected]云服务器地址 输入密码进入后所有的操作与本地终端完全一至. 安装 Python 环境 接下来是python , Ubuntu 的默认环境已经预装 python 2.7 所以只需要安装 python 的 pip 安装工具即可.

普元云计算-阿里云上的容器技术实践详解

转载本文需注明出处:EAII企业架构创新研究院,违者必究.如需加入微信群参与微课堂.架构设计与讨论直播请直接回复公众号:"EAII企业架构创新研究院".(微信号:eaworld)   导读:本文以"实践过程中问题与思考"为主体,与大家分享其中的过程和经验,希望大家在后续的工作中能够避免相关问题,形成更佳实践. 为什么选择阿里云 现在的公有云如雨后春笋,国外如AWS.Azure.Bluemix,国内如BAT.DaoCloud.goodrain,都可以给大家提供丰富的云

生活杂谈之阿里云免费虚拟主机申请过程详解

对于我来说,拥有一个自己的网站是盼望已久的事情,如今终于实现了,我的网站搭建于2015年05月26日,那是一个值得纪念的日子.搭建一个网站对于初学者来说,第一感觉会认为那是”程序员”该做的事情,其实不然,不管你懂不懂代码,也不管是不是计算机专业毕业,你都可以不用花费一百块钱,轻松拥有自己独立的网站.我们这一百块主要用于购买一个网站域名,万网域名大概29-39块钱之间,同时一个域名可以使用一年,其次购买一台虚拟主机,阿里云虚拟主机可以购买28块钱每月的,也可以购买55块钱每月,如果你比较”高富帅”

使用阿里云主机离线部署CDH步骤详解

一.Linux文件系统准备 1. 拍摄快照 登录阿里云控制台,拍摄快照,注意有几个关键点尽量拍摄快照,系统初始状态.CM环境准备完成.CM安装完成.CDH安装完成. 2. 挂载设备 三个主机都执行. 创建挂载目录 $mkdir /data 查看设备 $df -h $fdish -l 得知/dev/vdb没有挂载 格式化设备 $mkfs.ext3 /dev/vdb 编写开机自动挂载脚本 $mkdir /opt/shell/ $vim /opt/shell/mymount.sh #!/bin/bas

阿里云轻量应用服务器 搭建配置详解

好久没有更新博客了,说来也是惭愧没有养成记录经验的习惯. 有很多技术开发同学都想拥有自己的服务器用来搭建个人网站,或者展示作品,但是怕租上不会配置或者嫌配置繁琐难下决定. 废话不多说直接进入正题,前两天帮朋友配置一台阿里云的轻量应用服务器(注意不是云服务器ECS但是大同小异). 服务器规格 我配置的是1GB内存1核  20GB SSD系统盘 一年(最低配置算下来打折400多),一般个人建站或者拿来自己练手这个配置足够用了,如果公司用可以选择配置更高的. 1.地域选择 推荐大家选择 华东1(杭州)

FineBI学习系列之FineBI与阿里云ADS数据连接(图文详解)

不多说,直接上干货! 这是来自FineBI官网提供的帮助文档 http://help.finebi.com/http://help.finebi.com/doc-view-569.html 目录: 1.描述 2.操作 3.注意事项 1.描述 阿里分析型数据库ADS是一种高并发低延时的PB级实时数据仓库,全面兼容MySQL协议以及SQL:2003 语法标准,可以毫秒级针对万亿级数据进行即时的多维分析透视和业务探索:可以使用标准 SQL.现有的商业智能 (BI) 工具和ETL工具经济高效地轻松分析与

解密阿里云Redis助力双十一背后的技术

摘要: Redis是一个使用范围很广的NOSQL数据库,阿里云Redis同时在公有云和阿里集团内部进行服务,本文介绍了阿里云Redis双11的一些业务场景:微淘社区之亿级关系链存储.天猫直播之评论商品游标分页和菜鸟单据履行中心之订单排序. 双11如火如荼的结束了,阿里云Redis(ApsaraDB for Redis原KVStore)也圆满完成了双11Redis的保障工作.目前阿里云Redis提供了单机版本和集群版本的Redis. 单机版本Redis具有很高的兼容性,并且支持Lua脚本及地理位置

阿里云Redis使用规范

一.键值设计 1.key名设计 (1)[建议]: 可读性和可管理性 以业务名(或数据库名)为前缀(防止key冲突),用冒号分隔,比如业务名:表名:id ugc:video:1 (2)[建议]: 简洁性 保证语义的前提下,控制key的长度,当key较多时,内存占用也不容忽视,例如: user:{uid}:friends:messages:{mid}简化为u:{uid}:fr:m:{mid}. (3)[强制]: 不要包含特殊字符 反例:包含空格.换行.单双引号以及其他转义字符 2.value设计 (

codis/redis数据数据迁移至阿里云redis服务器

本次迁移采用了唯品会的开源工具RMT 1.阿里云redis服务器的购买 注:要和生产上数据的内存大小一致 不然有些key会迁移失败 很明显的OOM报错 2.迁移机器的cpu要足够  迁移会有一段时间的负载上升 对迁移机器的IOPS有要求 rmt_redis.c:1474 Error: I/O error reading bulk count from MASTER 这种报错你就需要查看一下 迁移codis服务器的性能了 3.RMT(redis-migrate-tool)工具的安装 git clo