提高redis性能一指禅

江湖传言,在redis中,一个command("get or set key value")中value的长度超过1k的时候,其性能急剧下降。

稍微看了下redis的代码,发现它的网络模块关闭了nagel算法,如果修改redis的源码启动这个算法会如何呢?

1 采用redis默认代码测试(即关闭nagel算法)

为了验证这个算法启用与否,是否影响了redis的性能。先不改变redis的代码,利用redis-benchmark进行一番测试,执行下面的命令:

./redis-benchmark -p 30000 -n 50000 -k 1 -d 2048 -q

上面命令相关参数意义为:连接服务器断开30000、测试50000次、打开keepalive选项、value长度2k、只输出结果不输出测试过程。

测试结果是:

SET: 51599.59 requests per second
GET: 50403.23 requests per second
INCR: 55493.89 requests per second
LPUSH: 54112.55 requests per second
LPOP: 48875.86 requests per second
SADD: 54644.81 requests per second
SPOP: 54112.55 requests per second
LPUSH (needed to benchmark LRANGE): 49067.71 requests per second
LRANGE_600 (first 600 elements): 400.68 requests per second
MSET (10 keys): 33134.53 requests per second

2 采用socket默认属性

下面是/redis-2.8.19/networking.c的createClient函数:

  53 redisClient *createClient(int fd) {
  54     redisClient *c = zmalloc(sizeof(redisClient));
  55 
  56     /* passing -1 as fd it is possible to create a non connected client.
  57      * This is useful since all the Redis commands needs to be executed
  58      * in the context of a client. When commands are executed in other
  59      * contexts (for instance a Lua script) we need a non connected client. */
  60     if (fd != -1) {
  61         anetNonBlock(NULL,fd);
  62         // anetEnableTcpNoDelay(NULL,fd);
  63         if (server.tcpkeepalive)
  64             anetKeepAlive(NULL,fd,server.tcpkeepalive);
  65         if (aeCreateFileEvent(server.el,fd,AE_READABLE,
  66             readQueryFromClient, c) == AE_ERR)
  67         {
  68             close(fd);
  69             zfree(c);
  70             return NULL;
  71         }
  72     }

请注意,我已经把line 62注释掉,采用系统默认设置。

执行同样的命令,其测试结果为:

SET: 50968.40 requests per second
GET: 50607.29 requests per second
INCR: 55432.37 requests per second
LPUSH: 47438.33 requests per second
LPOP: 49950.05 requests per second
SADD: 54945.05 requests per second
SPOP: 55187.64 requests per second
LPUSH (needed to benchmark LRANGE): 47709.93 requests per second
LRANGE_600 (first 600 elements): 398.41 requests per second
MSET (10 keys): 26766.60 requests per second

3 明确启用Nagel算法

同样地,可以修改代码以明确启用Nagel算法,同样的代码块修改后为:

  53 redisClient *createClient(int fd) {
  54     redisClient *c = zmalloc(sizeof(redisClient));
  55 
  56     /* passing -1 as fd it is possible to create a non connected client.
  57      * This is useful since all the Redis commands needs to be executed
  58      * in the context of a client. When commands are executed in other
  59      * contexts (for instance a Lua script) we need a non connected client. */
  60     if (fd != -1) {
  61         anetNonBlock(NULL,fd);
  62         // anetEnableTcpNoDelay(NULL,fd);
  63         anetDisableTcpNoDelay(NULL,fd);
  64         if (server.tcpkeepalive)
  65             anetKeepAlive(NULL,fd,server.tcpkeepalive);
  66         if (aeCreateFileEvent(server.el,fd,AE_READABLE,
  67             readQueryFromClient, c) == AE_ERR)
  68         {
  69             close(fd);
  70             zfree(c);
  71             return NULL;
  72         }
  73     }

明确地启用Nagel算法后,其测试结果为:

SET: 49164.21 requests per second
GET: 48496.61 requests per second
INCR: 52910.05 requests per second
LPUSH: 50556.12 requests per second
LPOP: 49164.21 requests per second
SADD: 53937.43 requests per second
SPOP: 53248.14 requests per second
LPUSH (needed to benchmark LRANGE): 48169.56 requests per second
LRANGE_600 (first 600 elements): 406.73 requests per second
MSET (10 keys): 34106.41 requests per second

4 总结

从以上对比结果来看,大部分情况下启用nagel算法后,redis的性能约有百分之二的提升。

时间: 2025-01-02 17:33:11

提高redis性能一指禅的相关文章

关于redis性能问题分析和优化

一.如何查看Redis性能 info命令输出的数据可分为10个分类,分别是: server,clients,memory,persistence,stats,replication,cpu,commandstats,cluster,keyspace 为了快速定位并解决性能问题,这里选择5个关键性的数据指标,它包含了大多数人在使用Redis上会经常碰到的性能问题 二.内存 上图中used_memory 字段数据表示的是:由Redis分配器分配的内存总量,以字节(byte)为单位. 其中used_m

Redis性能问题排查解决手册(七)

阅读目录: 性能相关的数据指标 内存使用率used_memory 命令处理总数total_commands_processed 延迟时间 内存碎片率 回收key 总结 性能相关的数据指标 通过Redis-cli命令行界面访问到Redis服务器,然后使用info命令获取所有与Redis服务相关的信息.通过这些信息来分析文章后面提到的一些性能指标. info命令输出的数据可分为10个类别,分别是: server clients memory persistence stats replication

redis性能问题排查

Redis性能问题排查解决手册(七) 2015-08-19 08:35 by 蘑菇先生, 6073 阅读, 9 评论, 收藏,  编辑  阅读目录: 性能相关的数据指标 内存使用率used_memory 命令处理总数total_commands_processed 延迟时间 内存碎片率 回收key 总结 性能相关的数据指标 通过Redis-cli命令行界面访问到Redis服务器,然后使用info命令获取所有与Redis服务相关的信息.通过这些信息来分析文章后面提到的一些性能指标. info命令输

Redis(二十一):Redis性能问题排查解决手册(转)

性能相关的数据指标 通过Redis-cli命令行界面访问到Redis服务器,然后使用info命令获取所有与Redis服务相关的信息.通过这些信息来分析文章后面提到的一些性能指标. info命令输出的数据可分为10个类别,分别是: server clients memory persistence stats replication cpu commandstats cluster keyspace 这篇主要介绍比较重要的2部分性能指标memory和stats. 需要注意的是info命令返回的信息

memcached与redis性能测试总结

– 相同的数据模型,Memcached能保存的热数据要比Redis高些,如Memcached在13G的限定内存下大概能保存1亿条数据,而Redis大概保存了8千万条 – 相同服务器环境,Memcached写性能要比Redis高些,前者约10万条每秒,后者约7万条秒 – 达到内存上限时,Memcached插入性能除了在临界点有些抖动,大概降到7万条每秒,之后性能跟临界点之前一样,而Redis性能急剧下降,一度降到396条每秒,之后其性能受子进程dump数据及每秒产栺大量页面错误影响而持续下降 –

如何提高数据库性能

一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善.这篇博文主要谈MySQL数据库发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大致分为以下五个阶段: 1.数据库表设计 项目立项后,开发部根据产品部需求开发项目,开发工程师工作其中一部分就是对表结构设计.对于数据库来说,这点很重要,如果设计不当,会直接影响访问速度和用户体验.影响的因素很多,比如慢查询.低效的查询语句.没有适当建立索引.数据库堵塞(死锁)等.当然,有测试工程师的团队

Redis进阶实践之十八 使用管道模式提高Redis查询的速度

原文:Redis进阶实践之十八 使用管道模式提高Redis查询的速度 一.引言 学习redis 也有一段时间了,该接触的也差不多了.后来有一天,以为同事问我,如何向redis中批量的增加数据,肯定是大批量的,为了这主题,我从新找起了解决方案.目前的解决方案大都是从官网上查找和翻译的,每个实例也都调试了,正确无误.把结果告诉我同事的时候,我也跟清楚这个主题如何操作了,里面的细节也更清楚了.大然也有人说可以通过脚本来做这个操作,没错,但是我对脚本语言还没有研究很透,就不来班门弄斧了. 二.管道的由来

Redis性能调优

Redis性能调优 尽管Redis是一个非常快速的内存数据存储媒介,也并不代表Redis不会产生性能问题.前文中提到过,Redis采用单线程模型,所有的命令都是由一个线程串行执行的,所以当某个命令执行耗时较长时,会拖慢其后的所有命令,这使得Redis对每个任务的执行效率更加敏感. 针对Redis的性能优化,主要从下面几个层面入手: 最初的也是最重要的,确保没有让Redis执行耗时长的命令 使用pipelining将连续执行的命令组合执行 操作系统的Transparent huge pages功能

提高服务器性能和并发能力

从哲学上说,消除瓶颈是提高服务器性能和并发能力的唯一途径.如果你能够消除所有的瓶颈,你就能够最大的发挥硬件性能,让系统的性能和并发数到达最佳.采用多线程多核编程,使用事件驱动或异步消息机制,尽量减少阻塞和等待操作(如I/O阻塞.同步等待或计时/超时等).原理:1.多线程多核编程,消除cpu瓶颈.2.采用IOCP或epoll,利用状态监测和通知方式,消除网络I/O阻塞瓶颈.3.采用事件驱动或异步消息机制,可以消除不必要的等待操作.4.如果是Linux,可以采用AIO来消除磁盘I/O阻塞瓶颈.5.在