Redis 哪些地方需要调整 杂谈

2020-06-22 00:00:00 数据库 设置 系统 内存 延迟

如果有人问redis 到底跑的有多快,简单的回答,纳秒等级, 可如果再要细问,估计只能进行测试了,每台机器的物理硬件标准不同,所以就需要基准测试. 另外redis到底需要不需要进行调优,可能大部分场景不需要,但不需要不意味这你可以欣然接受你不会.

redis 本身提供了一个测试程序 redis-benchmark, 通过benchmark 来对当前的机器能处理的redis任务有一个大致的评估.

下面可以看到100万的request 在各种方面处理的速度, ping_bulk 需要16.09秒完成相关的100万的操作, 这里需要指出操作的单次的数据流是3byte.


其中评测时需要有一些指标

1 -c 参数 默认是50个client 但实际上需要根据具体的client 来进行测试例如 100个客户端

2 -d 每次操作的byte的数字是多少


在得出redis 在评估标准下的标准值后. 就可以查看自己的 reids的机器和相关的配置是否正确.


Redis的延迟定义也是由客户端发送命令到客户端接收命令的时间,这里使用slow log 的方式来进行.

通过添加

slowlog-log-slower-than

slowlog-max-len 

两个参数来设置多长时间的redis 语句会被记录, 默认是slowlog-log-slower-than  10000  slowlog-max-len 为存储多少慢语句后会rotate. 

这是对于reids慢查询的相关设置


由于REDIS 的处理的速度较快,所以网络的延迟也会被提上议程,redis 提供了 latency   --latency-history    --intrinsic-latency 30  三种方式, 其中常用的给定一段时间来进行延迟的探测,通过 intrinsic-latency  来对当前的客户端和系统之间的网络的延迟进行探测.



这样的测试主要的意义在于,保证在REDIS延迟中, 在客户或应用端提出延迟后,的分析中, 在慢语句之间的数字无法对应后,对网络进行分析看是否由于网络造成的问题导致延迟.


下面就是一些在安装中注意的点

1 系统中的透明大页在reids中禁用

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


在redis中或者说大多数数据库中都建议关闭 THP, 包括ORALCE都有一片相关的文字提出ORACLE LINUX 和 LINUX 对于ORACLE 数据库中性能提升的原因之一是他们关掉了 THP, THP产生的原因主要和内存能提供的大容量数量和CPU 能进行CACHE 的内存寻址的数量有关, 如果要硬件上来提高是很难南的,所以LINUX 系统中制造出一个THP, 由于在分配内存的时候可以分配页面的时候超过4KB的标准值,而分配更大的内存来共应用使用, 但对数据库来说就不大适合使用THP的方式来管理内存,在内存中处理数据都是以数据页来体现的,每种数据库都有自己的页面设置,另外在使用THP中包括kswapd、碎片整理和kcompactd这些都负责在虚拟内存中为未来的THP腾出空间,等等都会造成系统的性能的损耗和一些意外的BUG. 所以大部分数据库都建议关闭.

ORACEL 相关的文字

https://blogs.oracle.com/linux/performance-issues-with-transparent-huge-pages-thp


2 tcp-backlog 

在应用与redis连接时,需要使用LISTEN系统调用将套接字放入LISTEN状态时,它需要为该套接字指定一个backlog, 在高并发时是否拥有足够了backlog就是一个问题.


sudo echo "net.core.somaxconn = 65535" >> /etc/sysctl.conf

sudo echo "net.ipv4.tcp_max_syn_backlog = 8192" >> /etc/sysctl.conf


sudo echo "net.core.rmem_max = 16777216"  >> /etc/sysctl.conf

sudo echo "net.core.wmem_max = 16777216"  >> /etc/sysctl.conf

sudo sysctl -p

如果套接字正在监听并处于繁忙状态,那么连接积压将会堆积起来。在发生故障之前,内核将把挂起的连接保存在缓冲区中, 调整缓冲的原因也是如此,虽然说根本不会用到那么多的内存.


3  在大多数的系统中此参数设置为 0 ,适应大多数应用系统, 而在redis 中需要将内存虚拟分配的配置调整为1

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

4  对于SWAP的设置,有些公司将REIDS的SWAP设置为不加载,也就是根本就没有SWAP ,给出的理由是REDIS 为缓存式数据库,不需要SWAP
下面是REDIS 官方的一句话, 请确保你的系统设置了swap, 关键问题和其他数据库要设置SWAP可能有一样的原因,就是在突破内存后,到底要不要REDIS OOM, 显然官方是不希望被OOM KILL REDIS process的.

5 在redis 中设置 maxmemory 的意义是在REDIS 使用系统的内存的限制当中如果达到maxmemory的限制的话,redis 会停止继续写入的工作,提供只读的工作,并给出一个错误写的指令, 而不是失败的信息.



相关文章