一、Linux 操作系统


【1】ulimit 与 TCP backlog:1)、修改 ulimit:通过 ulimit 修改 open files 参数,redis 建议把 open files 至少设置成 10032,因为 maxclients 是10000  [客户端的数据是以文件的形式进行保存的] ,另外 redis 内部最多会使用 32 个文件描述符。

1 ulimit -n 10032  #但重启后就无效了,也可以通过配置文件limits.conf 的形式持久修改
2 #修改了,重新登录后就立刻生效.可以用CentOS ulimit -a 查看确认
3 [root@dev ~]# ulimit -a
4 #... 省略
5 open files (-n) 10032

2)、修改 TCP backlog:redis 默认的 tcp-backlog 为 511,可通过配置 tcp-backlog 进行调整,如果 Linux 的 tcp-backlog 小于 redis 的 tcp-backlog,日志里会出有 warning。此参数确定了 TCP 连接中已完成队列(完成三次握手之后)的长度, 当然此值必须小于或等于 Linux 系统定义的 [/proc/sys/net/core/somaxconn] 值,而 Linux 的默认参数值是128。当系统并发量大并且客户端速度缓慢的时候,可以将这二个参数一起参考设定

1 #建议修改为 2048 修改somaxconn
2 #该内核参数默认值一般是128,对于负载很大的服务程序来说大大的不够。一般会将它修改为2048或者更大。
3 echo 2048 > /proc/sys/net/core/somaxconn #但是这样系统重启后保存不了
4
5 #持久化设置: 在 /etc/sysctl.conf 中添加如下:
6 #net.core.somaxconn = 2048
7
8 #然后在终端中执行:sysctl -p

【2】vm.overcommit_mermory:表示内核在分配内存时做检查的方式。
  1)、redis 建议将 vm.overcommit_memory 设置为1,防止极端情况下 fork 出错。
  2)、vm.overcommit_memory 取值说明:Linux 对大多数申请内存的回复均为 YES,以运行更多程序,因为申请后并不是立马使用,该技术叫 vm.overcommit。
  ■  0:内核将检查是否有足够的内存,如果足够,申请通过,否则内存申请失败把错误返回给应用进程。
  ■  1:表示内核容许超量使用内存直到用完为止。
  ■  2:内存绝不过量使用内存,既系统整个内存空间不能超过 swap+50% 的 RAM[(random access memory)即随机存储内存 ]值,50% 是 overcommit_ratio 的默认值,支持修改。

echo "vm.overcommit_memory=1" > /etc/sysctl.conf 

【3】swappiness 参数:1):swappiness 参数决定操作系统使用 swap 的倾向程度,取值范围是0~100,swappiness 的值越大,说明操作系统可能使用 swap 的概率越高,swappiness 值越低,表示操作系统更加倾向于使用物理内存。

如果系统内存不足,可能会将 Redis 对应的某些页从内存 swap到磁盘文件上。可以通过 /proc 文件夹中的 smaps文件查看是否有数据页被 swap。如果发现大量页被 swap,则可以用 vmstat 和 iostat 进一步追查原因

2)、建议 Linux3.5 以上设置为1,否则建议设置为0。

echo "vm.swappiness=1" > /etc/sysctl.conf 

【4】Transparent Huge Pages:支持大内存分页(2MB)分配,默认开启,redis 建议关闭此功能。

sudo chkconfig --add disable-transparent-hugepages

【5】OOM killer:会在可用内存不足时选择性杀掉用户进程,OOM killer 会为每个用户进程设置一个权重,权重越大被 kill 的可能性越大。每个进程的权重放在 [/proc/{progress_id}/oom_adj]。对于 Redis 服务器来说,可以将所有 Redis 的 oom_adj 设置为最低值或者稍小的值,降低被 OOM killer 杀掉的概率。应该设置与进程有关,无法一次性设置。

二、Redis 关键参数


【1】客户端最大连接数(maxclients:1)、现象:如果连接数不够,或者请求返回比较慢导致连接数不足,可能会报[ max number of clients reached ]。
  2)、优化:调整 maxclients,或者优化 redis 命令处理性能。要注意该参数受到操作系统最大文件句柄的限制(ulimit -n <n>)

【2】repl-ping-slave-period/repl-timeout:1)、说明:slave 会每隔 repl-ping-slave-period(默认10秒)ping 一次 master,如果查过 repl-timeout(默认 60秒)都没有收到响应,就会认为 Master 挂掉。
  2)、优化:如果 Master 明明没挂掉但被阻塞住了也会报这个错。可以适当调大 repl-timeout

【3】client-output-buffer-limit:1)说明:客户端输出缓冲区大小。
  2)、当使用主从复制时,性能压测下,数据量会急剧增长,导致从节点需要复制的数据很大,消耗时长增加。slave 没挂但被阻塞住了,比如正在 loading Master 发过来的 RDB,Master 的指令不能立刻发送给 slave,就会放在 output-buffer 中,在配置文件中有如下配置:

client-output-buffer-limit slave 256mb 64mb 60

上述配置说明:负责发送给 slave的 client,如果 buffer 超过 256m 或者连续 60秒超过 64m,就会被立刻强行关闭。所以此时应该相应调大数值,否则就会出现很悲剧的循环:Master 传输一个很大的 RDB 给 slave,slave 努力地装载,但是还没装载完,Master 对 client 的缓存存满了,关闭后再来一次。

三、Redis 性能测试


Redis 官网自动 Redis 性能测试工具 Redis-benchmark,可以有效的测试 Redis 服务的性能。

【1】案例一:命令如下,100个并发连接,100000个请求,检测host为127.0.0.1 端口为 6379 的 redis 服务器性能

 1 ./redis-benchmark -h 127.0.0.1 -p 6379 -c 100 -n 100000
2
3 #对集合写入测试 结果如下
4 100000 requests completed in 2.38 seconds #100000个请求在2.38秒内完成
5 20 parallel clients #每次请求有20个并发客户端
6 3 bytes payload #每次写入3个字节的数据
7 keep alive: 1 #保持一个连接,一台服务器来处理这些请求
8
9 93.06% <= 15 milliseconds
10 99.96% <= 31 milliseconds
11 99.98% <= 46 milliseconds
12 99.99% <= 62 milliseconds
13 100.00% <= 62 milliseconds
14 #所有请求在62毫秒内完成
15 42105.26 requests per second
16 #每秒处理42105.26次请求

【2】案例二:命令如下,测试指定操作命令的性能。

1 ./redis-benchmark -t set,lpush -n 100000 -q

四、查找慢查询语句


Redis 提供了记录耗时操作语句的功能,当语句执行(不包括命令排队时间)超过了阈值,则被认为是慢查询。

【1】参数设置:[ slowlog-log-slower-than ]:记录运行耗时语句的阈值,单位是微妙(1秒=1000毫秒=1000 000微妙,默认值:10000)。当值为0时,记录所有请求。当值<0时,不记录任何请求。
 [ slowlog-max-len ]:该参数用于设置慢查询保存的条数。
【2】功能使用:[ slowlog get ]:用于查询慢查询信息。[ slowlog len ]:显示当前 redis 有多少条慢查询

Redis 性能优化的更多相关文章

  1. redis性能优化、内存分析及优化

    redis性能优化.内存分析及优化 1.优化网络延时 2.警惕执行时间长的操作 3.优化数据结构.使用正确的算法 4.考虑操作系统和硬件是否影响性能 5.考虑持久化带来的开销 5.1 RDB 全量持久 ...

  2. 《吐血整理》Redis 性能优化的 13 条军规!史上最全

    Redis 是基于单线程模型实现的,也就是 Redis 是使用一个线程来处理所有的客户端请求的,尽管 Redis 使用了非阻塞式 IO,并且对各种命令都做了优化(大部分命令操作时间复杂度都是 O(1) ...

  3. 吊打面试官系列:Redis 性能优化的 13 条军规大全

    1.缩短键值对的存储长度 键值对的长度是和性能成反比的,比如我们来做一组写入数据的性能测试,执行结果如下: 从以上数据可以看出,在 key 不变的情况下,value 值越大操作效率越慢,因为 Redi ...

  4. redis性能优化——生产中实际遇到的问题排查总结

    背景 redis-K,V数据库,因其高性能的操作性和支持丰富的数据结构,目前大量被用于衔接应用层和关系数据库中间的缓存层.随着使用的场景越来越多,和数据量快速的递增,在生产环境中经常会遇到相关的性能瓶 ...

  5. 大型系统的Redis性能优化

    问题描述 系统背景:大型线上Java服务集群(活跃用户数上千万),业务重度使用Redis存储个管理Session,业务并发量>1WQPS,基本上每个请求都需要访问Redis(可能是多次),使用了 ...

  6. redis性能优化

    redis日志截图:

  7. Redis性能优化之redis.cnf配置参数

    redis调优总结 1.相应的参数调优 加内存2.redis使用结构调优3.使用合理的数据类型说明:redis存储的数据为redis hash(字符映射表) 单key多字段结构. 1)调整配置文件中配 ...

  8. 15套java架构师、集群、高可用、高可扩展、高性能、高并发、性能优化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战视频教程

    * { font-family: "Microsoft YaHei" !important } h1 { color: #FF0 } 15套java架构师.集群.高可用.高可扩展. ...

  9. java架构师负载均衡、高并发、nginx优化、tomcat集群、异步性能优化、Dubbo分布式、Redis持久化、ActiveMQ中间件、Netty互联网、spring大型分布式项目实战视频教程百度网盘

    15套Java架构师详情 * { font-family: "Microsoft YaHei" !important } h1 { background-color: #006; ...

  10. 15套java架构师、集群、高可用、高可扩 展、高性能、高并发、性能优化Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战视频教程

    * { font-family: "Microsoft YaHei" !important } h1 { color: #FF0 } 15套java架构师.集群.高可用.高可扩 展 ...

随机推荐

  1. Web实时通信之SignalR

    前言 对于B/S模式的项目,基础的场景都是客户端发起请求,服务端返回响应结果就结束了一次连接:但在很多实际应用场景中,这种简单的请求和响应模式就显得很吃力,比如消息通知.监控看板信息自动刷新等实时通信 ...

  2. 求两个自然数之间的最大公约数C++实现

    1 #include "pch.h" 2 #include <iostream> 3 using namespace std; 4 5 int main() 6 { 7 ...

  3. 浏览器F12,Network中各按钮的作用

    Network下 preserve log:勾选,页面发生跳转,接口不丢失:(比如登录成功跳转到首页,登录的接口就没了,勾选Perserve log,会记录跳转前的接口): Disable cache ...

  4. POJ--2689-C++

    题意很简单就是让你求给定区间的素数,然后用一个循环求出相距最远的相邻素数数和最近的素数以及相距最近的相邻素数 难点在与数据很大,所以不可能直接对区间的每一个数进行素数判断.但是,每个合数n都至少有一个 ...

  5. K Smallest In Unsorted Array

    Find the K smallest numbers in an unsorted integer array A. The returned numbers should be in ascend ...

  6. 苹果公司对蓝牙免提AT指令的扩充

    介绍 苹果公司对蓝牙HF profile进行了一些HF AT指令的扩充.不过为了兼容起见,尽量实现HF标准规范规定的内容,如果标准规范没有规定相应的内容,为了适配苹果设备新增的功能,还是可以适应苹果公 ...

  7. html页面下载为docx文档

    1.安装要用到的两个插件:html-docx-js-typescript.file-saver. 2.导入两个方法: import { asBlob } from 'html-docx-js-type ...

  8. OO课程第二阶段(实验和期中试题)总结Blog2

    OO课程第二阶段(实验和期中试题)总结Blog2 前言:学习OOP课程的第二阶段已经结束了,在此进行对于知识点,题量,难度的个人看法. 学习OOP课程的第二阶段已经结束了,较第一次阶段学习难度加大,学 ...

  9. Importing Your Own Python Module or Python File into Colab

    Source from : https://medium.com/analytics-vidhya/importing-your-own-python-module-or-python-file-in ...

  10. Android studio 使用Internet传递信息

    使用Intent在Activity之间传递信息1.首先创建一个新的Activity,在activity_main.xml中设计页面,将android.support.constraint.Constr ...