redis 性能相关方面

来源:互联网 发布:禁毒网络知识登录竞赛 编辑:程序博客网 时间:2024/06/06 09:15

一、存储延时

Cpu的运算速度发展迅速,最高峰平均每隔几个月,速度就翻一倍,目前Cpu的一个时钟周期已达到纳秒级
近几年cpu的发展趋势不再是提高速度,而是并行化,包括支持多cpu多核,超线程和numa结构
原因是存储设备的速度发展相对滞后,单纯提高cpu的运算速度已无法有效提高系统的性能
因此除少数计算密集型系统外,大部分系统的性能瓶颈往往在存储设备性能

Relative Latency

  • CPU Register – 1x
  • L2 Cache – 10x
  • Memory – 100x
  • Disk – 10,000,000x

内存的读写性能是磁盘的10W倍,因此基于内存操作的redis的性能会显著高于基于磁盘操作的数据库

二、内存管理

Linux默认内存分配函数ptmalloc性能不佳,并且存在内存碎片率过高的问题(部分长周期内存会影响其他内存回收)
Redis封装了zmalloc函数,如果linux安装了tcmalloc,则使用tcmalloc,否则使用默认的jemalloc

zmalloc.c

  • 支持tcmalloc(google提供),需要单独安装
  • 默认使用jemalloc(freeBSD默认),redis源码自带
  • 快速分配和回收
  • 解决内存碎片率问题
    tcmalloc: 1.01
    jemalloc: 1.02
    ptmalloc: 1.31

三、 IO multiplexing

Blocking io要求1条线程支持1条连接,连接仅消耗少量内存,并不稀缺,但线程为稀缺资源,一台机器一般最多支持1000条线程左右,因此blocking io严重制约系统吞吐量
Nonblocking io需要不断check连接状态,cpu消耗严重
Io multiplexing支持1条线程监听多条连接,不需要反复check,当有连接发送状态变更时,返回连接集合

单线程处理所有io事件,由于redis的请求都是内存操作,性能很高,因此所有事件都在同一条线程循环中完成

Io多路复用适合高吞吐量服务端使用,io开销小,释放紧缺的线程资源处理业务逻辑,nginx,jetty,tomcat,netty都在使用

原创粉丝点击