Redis优化及配置(一)

本文详细介绍Redis内存优化策略,包括Linux配置调整、Redis配置优化、键值对象缩减及缓存淘汰方案,助您提升Redis性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Redis所有的数据都在内存中,而内存优势非常宝贵的资源。常用的内存优化方案有如下几个部分:

1. 配置优化
2. 缩减健值对象
3. 命令处理
4. 缓存淘汰方案

一 配置优化

1.linux 配置优化:

目前大部分公司都会将web服务器,数据库服务器等部署在Linux操作系统上,Redis优化也需要考虑操作系统,所以介绍Linux操作系统如何优化Redis

1.内存分配

  • vm.overcommit_memory
  • Redis是内存操作,需要优先使用内存。设置overcommit_memory为1,是为了让fork操作能够在低内存下也执行成功。linux操作系统对大部分申请内存的请求都是回复yes,以便能运行更多的程序。因为申请内存后,并不会马上使用内存,这种技术叫做overcommit。vm.overcommit_memory用来设置内存分配策略。有三个可选值:
含义
0表示内核将检查是否有足够的可用内存,如果有足够的可用内存,内存申请通过, 否则内存申请失败,并把错误返回给应用进程
1表示内核允许超量使用内存直到用完为止
2表示内核决不过量的(‘never overcommit’)使用内存,即系统整个内存地址空间不能超过swap+50%de RAM值,50%是overcommit_ratio默认值每次吃参数同样支持修改

下图显示(启动redis会提示该优化方式:)

在这里插入图片描述
修改命令:

#方式1:
[root@192 ~]# vim /etc/sysctl.conf
追加  
vm.overcommit_memory = 1
然后重新启动

#方式2:
运行
[root@192 ~]# sysctl vm.overcommit_memory=1

2.THP
Redis在启动时可能会看到如下日志:

WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command ‘echo never > /sys/kernel/mm/transparent_hugepage/enabled’ as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.

截图:

在这里插入图片描述Redis建议修改 Transparent Huge Pages (THP)的相关配置,Linux kernel 在2.6.38内核增加了 THP 特性,支持大内存页(2MB)分配,默认开启,当开启可以降低fork子进程的速度,但fork操作之后,每个内存页从原来4KB变为2MB,会大幅增加重写期间父进程内存消耗。同时每次写命令引起的复制内存页单位放大了512倍,会拖慢写操作的执行时间,导致大量写操作慢查询,例如简单的incr命令也会出现在慢查询中。因此Redis日志中建议将此特性禁用,禁止方法:

echo never > /sys/kernel/mm/transparent_hugepage/enabled

为使机器重启后THP配置依然生效,可以在/etc/rc.local 中追加:

echo never > /sys/kernel/mm/transparent_hugepage/enabled

3.swappiness

  • swap对于操作系统来说比较重要,当物理内存不足时,可以将一部分内存页今次那个swap操作,已解燃眉之急。swap空间由硬盘提供,对于需要开发并发高吞吐的应用来说,磁盘IO通常会成为系统瓶颈。在linux中,并不是要等到所有物理内存都使用完才会使用到swap.系统参数Swapiness会决定操作系统使用swap的倾向程度。swppiness的取值范围是0-100,swappiness的值越大,说明操作系统可能使用swap的概率越高,swappiness值越低,表示操作系统更加倾向于使用物流内存。swap的默认值是60,了解这个值的含义后,有利于Redis性能优化。下表对swappiness的重要值进行了说明:
策略
0Linux3.5以及以上:宁愿用OOM killer也不使用swap;Linux3.4以及更早:宁愿用swap也不实用OOM killer
1Linux3.5以及以上:宁愿用swap也不实用OOM killer
60默认值
100操作系统会主动使用swap

OOM(Out of Memory) killer机制是指Linux操作系统发现可用内存不足时,强制杀死一些用户进程(非内核进程),来保证系统有足够的可用内存进行分配,为使配置在重启Linux操作系统化之后立即生效,只需要在/etc/sysctl.conf 追加 vm.swappiness={bestvalue}即可

修改方式:

方式1:
[root@192 ~]# vim /etc/sysctl.conf 
追加(bestvalue:0,1,60,100)
 vm.swappiness={bestvalue}
 然后重新启动

方式2:
[root@192 ~]# echo vm.swappiness={bestvalue} >> /etc/sysctl.conf

查看swap的总体情况使用free -m命令查看:

[root@192 ~]# free -m
          total        used        free      shared  buff/cache   available
		 Mem:           1828         397        1075           9         356        1279
		Swap:          2047           0        2047

4.ulimit设置

可以用过ulimit查看和设置系统当前用户进程的资源数。其中ulimit -a命令包含的open files参数是单个用户同时打开的最大文件个数:

[root@192 ~]# ulimit -a
core file size          (blocks, -c) 0                       #核心文件大小(块,-c)
data seg size           (kbytes, -d) unlimited        #数据seg大小(kbytes, -d)
scheduling priority             (-e) 0					     #调度优先级(-e) 
file size               (blocks, -f) unlimited		     #文件大小(块,-f)
pending signals                 (-i) 7223			     #等待信号(-i)
max locked memory       (kbytes, -l) 64		     #最大锁定内存(kbytes, -l)
max memory size         (kbytes, -m) unlimited	 #最大内存大小(kbytes, -m)
open files                      (-n) 1024					 #打开文件(-n) 1024
pipe size            (512 bytes, -p) 8					 #管道大小(512字节,-p)
POSIX message queues     (bytes, -q) 819200	 #POSIX消息队列(字节,-q)
real-time priority              (-r) 0						 #实时优先级(-r) 
stack size              (kbytes, -s) 8192				 #堆栈大小(kbytes, -s) 
cpu time               (seconds, -t) unlimited		 #cpu时间(秒,-t)
max user processes              (-u) 7223			 #最大用户进程(-u) 
virtual memory          (kbytes, -v) unlimited		 #虚拟内存(kbytes, -v)

Redis允许同时有多个客户端通过网络进行连接,可通过配置maxclients来限制最大客户端连接数。对于Linu操作系统来说,这些网络连接都是文件句柄。
假如当前open files是1024,那么启动Redis 会看到如下日志:

#You requested maxclients of 10000 requiring at least 10032 max file descriptors. 
#Redis can’t set maximum open files to 10032 because of OS error: Operation not permitted. 
#Current maximum open files is 4096. Maxclients has been reduced to 4064 to compensate for low ulimit. If you need higher maxclients increase ‘ulimit –n

说明(此用户不是root用户):

  • 第一行:redis加你吧open files至少设置成10032,那么这个10032是如何来的呢?因为maxclients默认是10000,这些是用来处理客户端连接的,除此之外,redis内部会使用最多32个文件描述符,所以这里的1002=10000+32.
  • 第二行:redis建议把open fiels设置成10032,因为它没有权限设置。
  • 第三行:当前系统的open fiels是4096,所以讲maxclients设置成4096-32=4064.如果你想设置更高的maxcliens,请使用ulimit -n来设置。

从上面的三行日志分析可以看出 open files 的限制优先级比 maxclients 大Open files 的设置方法如下:

ulimit –Sn {max-open-files}

demo:
查看:max-open-files
[root@192 redis-5.0.7]# ulimit -Sn 30000
30000
2.Redis 配置优化:
  • 设置maxmemory。设置redis使用的最大物流内存,即redis在占用maxmemory大小的内存之后就开始拒接后续写入请求,该参数可以确认redis因为使用了大量内存严重影响速度或者发生OOM(out-of-memory),发现内存不足时,它会选择杀死一些进程(用户态进程,不是内核进程),以便释放内存。此外可以使用info 命令查看Redis占用的内存及其它信息。

     常用命令:
     #查看一般统计信息
     info stats
     #查看链接客户端数量
     info client
     #查看持久化情况
     info Persistence 
     详细地址:
     https://www.runoob.com/redis/server-info.html
    
  • 让健名保持剪短,键的长度越长,redis需要存储的数据也就越多

  • 检查数据持久化策略

    数据落磁盘尽可能减少性能损坏,以空间换时间。设置如下命令:
    1.rdbcompression no :默认值是yes。对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的花,redis会采用LZF算法进行压缩。如果你不想消耗CPU来进行压缩的花,可以设置为关闭此功能,但是存储在磁盘上的快照会比较大。
    2.rdbchecksum no :默认是 yes。再存储快照后。还可以让redis使用CRC64算法进行数据校验,但是这样会增加约10%的性能损耗,如果希望获得最大的性能提升,可以关闭此功能

  • 优化AOF和RDB,减少占用CPU时间
    主库可以不进行dump操作或者减低dump频率。(注意如果主库【没有哨兵的主从复制,或集群版】不进行数据的持久化,在宕机情况下,请勿开启自动重启,否则数据会丢失)
    取消AOF持久化。命令如下(也可以在配置文件操作【redis.conf】):
    appendonly no

  • 监控客户端的连接

因为redis是单线程模型(只是用单核),来处理所有客户端请求,但由于客户端连接数的增涨,处理请求的线程资源开始降低分配给单个客户端连接的处理时间

  • 限制客户端连接数。在redis-cli工具中输入 info clients查看到当前实例的所有客户端连接信息

maxclients属性上修改客户端连接的最大数,可以通过在redis-cli工具上输入config set maxclients去设置最大连接数(也可以在配置文件操作【redis.conf】),根据连接数负载的情况

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值