AliRedis性能
引言:
如今redis凭借其高性能的优势, 以及丰富的数据结构作为cache已越来越流行, 逐步取代了memcached等cache产品, 在Twitter,新浪微博中广泛使用,阿里巴巴同样如此. redis已经占据了其不可动摇的地位, 然而在实际的生产环境中, redis也暴露出一些其他问题.如性能瓶颈, 内存冗余, 运维部署复杂等. 本文目的就是分析redis现有的问题, 以及介绍阿里巴巴技术保障团队对redis的改造工作, 使其在生产环境中发挥更大的价值.
原生redis的瓶颈:
1. 单进程单线程, 无法充分发挥服务器多核cpu的性能.
2. 大流量下造成IO阻塞. 同样是由于单进程单线程, cpu在处理业务逻辑的时候,网络IO被阻塞住, 造成无法处理更多的请求.
3. 维护成本高, 如果想要充分发挥服务器的所有资源包括cpu, 网络io等, 就必须建立多个instance, 但此时不可避免会增加维护成本. 拿24核服务器举例来讲, 如果部署24个单机版的instance,理论上可以实现10w*24core= 240wQPS的总体性能.但是每个 instance 有各自独立的数据,占用资源如内存也会同比上升,反过来制约一台服务器又未必能支持这么多的 instance. 如果部署24个Instance来构成单机集群, 虽然可以共享数据,但是因为节点增加, redis的状态通讯更加频繁和费时,性能也下会降很多. 并且两种方式都意味着要维护24个Instance,运维成本都会成倍增加.
4. 持久化. redis提供了两种save方式 1)save触发. 2)bgsave. 当然也可以使用3)aof来实现持久化, 但是这3点都有弊端.
1)save: 由于是单进程单线程, redis会阻塞住所有请求, 来遍历所有redisDB, 把key-val写入dump.rdb. 如果内存数据量过大, 会造成短时间几秒到几十秒甚至更长的时间停止服务, 这种方案对于twitter, taobao等大流量的网站, 显然是不可取的.
2)bgsave: 在触发bgsave时, redis会fork自身, child进程会进入1)的处理方式,这意味着服务器内存要有一半的冗余才可以, 如今内存已变得越来越廉价, 但是对于存储海量数据的情况,内存以及服务器的成本还是不容忽视的.
3)aof: 说到持久化, redis提供的aof算是最完美的方案了, 但是有得必有失, 严重影响性能! 因为redis每接收到一条请求, 就要把命令内容完整的写到磁盘文件, 且不说频繁读写会影响磁盘寿命,写磁盘的时间足以拖垮redis整体性能 . 当然熟悉redis的开发者会想到用appendfsync等参数来调整, 但都不是完美.即使使用 SSD,性能也只是略有提升,并且性价比不高。
针对以上几种情况, 阿里技术保障团队做了如下优化手段, 其实这不仅仅只是优化, 而更是一种对redis的改造.
1. 多线程master + N*work 工作模式.master线程负责监听网络事件, 在接收到一个新的连接后, master会把新的fd注册到worker的epoll事件中, 交由worker处理这个fd的所有读写事件, 这样master线程就可以完全被释放出来接收更多的连接, 同时又不妨碍worker处理业务逻辑和IO读写.
采用这种master + N*worker的网络层事件模型,可以实现redis性能的平行扩展. 真正的让redis在面临高并发请求时可以丛容面对.
2. 抛弃save, bgsave, aof等三种模式.采用redisDB lock模式. AliRedis在数据存储层把多DB存储模式转换成HashDb存储, 将key hash到所有RedisDB上, 这样做有一个弊端就是抛弃了select命令, 但与此同时会带来一个更大的好处, 可以逐个DB持久化而不会影响整个系统, 在做持久化的时候AliRedis只需lock住1/N个redisDb, 占用1/m个线程. 在不需要内存冗余的情况下进行持久化, 相比之前提到的弊端, 这种方式可以带来更大的收益, 更丰厚的回报.
3. 重构hiredis客户端, 支持redis-cluster工作模式, 目前hiredis并不支持redis-cluster模式, 阿里技术保障团队对hiredis进行重构,使之支持redis-cluster.
4. 优化jemalloc, 采用大内存页. Redis在使用内存方面可谓苛刻至极, 压缩, string转number等, 能省就省, 但是在实际生产环境中, 为了追求性能, 对于内存的使用可以适度(不至于如bgsave般浪费)通融处理, 因此AliRedis对jemalloc做了微调, 通过调整pagesize来让一次je_malloc分配更多run空间来储备更多的用户态可用内存, 同时可以减轻换页表的负载, 降低user sys的切换频率, 来提高申请内存的性能, 对jemalloc有兴趣的开发者可以参考jemalloc源码中的bin, run, chunk数据结构进行分析.
通过如上改造 , redis 可以充分发挥服务器多核的优势 , 以及网络 IO 复用 , 特别是节省运维成本 , 每台服务器只需维护一个 AliRedis 实例 .
测试环境
CPU: Intel Xeon E5-2630 2.3GHz, *2
KERNEL: 3.2.0
GCC: 4.4.6
Jemalloc: 3.2.0
NIC: Intel 82599EB
测试数据
AliRedis单机版性能数据
thread: 1 2 4 8 12 16 20 24
set/get=1:1 83182 162214 301552 605817 876656 1173748 1551113 1800878
AliRedis集群
8个节点, 20台客户端, 配置相同, cpu全部打满.
set/get=1:1 qps: 10,344,877
结论
单机版AliRedis可以实现24核跑满180wQPS性能.
集群版可以实现8台服务器支撑1000wQPS的数据请求.
阿里巴巴技术保障团队肩负着支撑阿里技术, 保障系统稳定运行的艰巨使命.不管是双11, 还是双12, 或者其他大促活动, 每个阿里人都在努力且拼命的工作, 拿自己的劳动来捍卫着阿里集团的荣誉.
阿里技术-保障奇迹.
阿里技术保障部-系统运营-网络部-子逍
AliRedis性能的更多相关文章
- AliRedis单机180w QPS, 8台服务器构建1000w QPS Cache集群
转自:http://www.open-open.com/lib/view/open1389880948758.html 引言: 如今redis凭借其高性能的优势, 以及丰富的数据结构作为 ...
- AliRedis单机180w QPS, 8台服务器构建1000w QPS Cache集群(转)
http://blog.sina.com.cn/s/blog_e59371cc0101br74.html 引言: 如今redis凭借其高性能的优势, 以及丰富的数据结构作为cache已越 ...
- 故障重现(内存篇2),JAVA内存不足导致频繁回收和swap引起的性能问题
背景起因: 记起以前的另一次也是关于内存的调优分享下 有个系统平时运行非常稳定运行(没经历过大并发考验),然而在一次活动后,人数并发一上来后,系统开始卡. 我按经验开始调优,在每个关键步骤的加入如 ...
- 01.SQLServer性能优化之----强大的文件组----分盘存储
汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 文章内容皆自己的理解,如有不足之处欢迎指正~谢谢 前天有学弟问逆天:“逆天,有没有一种方 ...
- 03.SQLServer性能优化之---存储优化系列
汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 概 述:http://www.cnblogs.com/dunitian/p/60413 ...
- SignalR系列续集[系列8:SignalR的性能监测与服务器的负载测试]
目录 SignalR系列目录 前言 也是好久没写博客了,近期确实很忙,嗯..几个项目..头要炸..今天忙里偷闲.继续我们的小系列.. 先谢谢大家的支持.. 我们来聊聊SignalR的性能监测与服务器的 ...
- 【前端性能】高性能滚动 scroll 及页面渲染优化
最近在研究页面渲染及web动画的性能问题,以及拜读<CSS SECRET>(CSS揭秘)这本大作. 本文主要想谈谈页面优化之滚动优化. 主要内容包括了为何需要优化滚动事件,滚动与页面渲染的 ...
- Web性能优化:What? Why? How?
为什么要提升web性能? Web性能黄金准则:只有10%~20%的最终用户响应时间花在了下载html文档上,其余的80%~90%时间花在了下载页面组件上. web性能对于用户体验有及其重要的影响,根据 ...
- Web性能优化:图片优化
程序员都是懒孩子,想直接看自动优化的点:传送门 我自己的Blog:http://cabbit.me/web-image-optimization/ HTTP Archieve有个统计,图片内容已经占到 ...
随机推荐
- centos从头学习配置web服务器环境
为了学习linux下配置web服务器环境,于是安装了vmware,准备在虚拟机里面学习web服务器的搭建! 首先是在虚拟机里安装centos,我选择的是32位的centos6.6版本,因为新版本7据说 ...
- Android 使用SQLite本地数据库
参考:http://blog.csdn.net/jianghuiquan/article/details/8569252 在Android平台上,集成了一个嵌入式关系型数据库—SQLite.以SQLi ...
- 安装php扩展模块参数memcache和memcached在php中的应用
一, memcache和memcached的区别与关系统php要想去访问memcached就得需要memcache扩展,这个道理和php连接mysql一样. 你不安装memcache扩展就没法识别me ...
- SilverLight-3:目录
ylbtech-SilverLight-Index: 1.A,返回顶部 Layout The Layout Containers - The Panel Background Borders Si ...
- 通过JBoss反序列化(CVE-2017-12149)浅谈Java反序列化漏洞
前段时间学校学习J2EE,用到了jboss,顺便看了下jboss的反序列化,再浅谈下反序列化漏洞. Java序列化,简而言之就是把java对象转化为字节序列的过程.而反序列话则是再把字节序列恢复为ja ...
- ISP模块之色彩增强算法--HSV空间Saturation通道调整 .
色彩增强不同于彩色图像增强,图像增强的一般处理方式为直方图均衡化等,目的是为了增强图像局部以及整体对比度.而色彩增强的目的是为了使的原有的不饱和的色彩信息变得饱和.丰富起来.对应于Photoshop里 ...
- 关于并发,异步,非阻塞(python)疑惑的一些资料解答
从iterable/iterator到generator到coroutine理解python的迭代器: http://python.jobbole.com/81916/理解python的生成器: ht ...
- [转]js模块化编程之彻底弄懂CommonJS和AMD/CMD!
原文: https://www.cnblogs.com/chenguangliang/p/5856701.html ------------------------------------------ ...
- Shell命令-----VI
vi的基本操作 a) 进入vi 在系统提示符号输入vi及文件名称后,就进入vi全屏幕编辑画面: $ vi file 不过有一点要特别注意,就是您进入vi之后,是处于「命令行模式(comman ...
- Ubuntu使用日志2(在Eclipse中搭建C++交叉编译环境)
Release用交叉编译:arm-none-linux-gnueabi-gcc. 搭建步骤: 1).在Project->Properties->C/C++ Build->Settin ...