【安装】REDIS-4.0.0 on CentOS 6.8

时间:2021-11-08 16:17:04

1、获取redis-4.0.0源代码

[thomaschen@localhost Downloads]$ curl -o redis-4.0.0.tar.gz http://download.redis.io/releases/redis-4.0.0.tar.gz

2、解压源代码

[thomaschen@localhost Downloads]$ tar -zxvf redis-4.0.0.tar.gz

3、编译和安装redis

[thomaschen@localhost Downloads]$ su
Password:
[root@localhost Downloads]$cd redis-4.0.0 & make
[root@localhost redis-4.0.0]# cd src && make install PREFIX=/usr/local/redis 

4. 复制默认配置文件

[root@localhost redis-4.0.0]# mkdir -p /usr/local/redis/conf
[root@localhost redis-4.0.0]# cp redis.conf /usr/local/redis/conf

5. 启动redis

[root@localhost redis-4.0.0]# cd /usr/local/redis
[root@localhost redis]# bin/redis-server ./conf/redis.conf 12708:C 19 Jul 02:37:37.935 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
12708:C 19 Jul 02:37:37.935 # Redis version=4.0.0, bits=64, commit=00000000, modified=0, pid=12708, just started
12708:C 19 Jul 02:37:37.935 # Configuration loaded
12708:M 19 Jul 02:37:37.936 * Increased maximum number of open files to 10032 (it was originally set to 1024).
                _._
           _.-``__ ''-._
      _.-``    `.  `_.  ''-._           Redis 4.0.0 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 12708
  `-._    `-._  `-./  _.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |           http://redis.io
  `-._    `-._`-.__.-'_.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |
  `-._    `-._`-.__.-'_.-'    _.-'
      `-._    `-.__.-'    _.-'
          `-._        _.-'
              `-.__.-'

12708:M 19 Jul 02:37:37.938 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
12708:M 19 Jul 02:37:37.938 # Server initialized
12708:M 19 Jul 02:37:37.938 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
12708:M 19 Jul 02:37:37.938 # 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.
12708:M 19 Jul 02:37:37.938 * DB loaded from disk: 0.000 seconds
12708:M 19 Jul 02:37:37.938 * Ready to accept connections

 

5.WARNING FIX

  从上面redis启动之后的控制台打出的信息来看,有3条WARNING信息。他们分别如下:

5.1. WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.

解决方式:

第一种:无需重启系统即可生效;但重启以后信息丢失
[root@localhost ~]# echo 511 >/proc/sys/net/core/somaxconn

第二种:即可生效,重启不会丢失
1. 编辑/etc/sysctl.conf文件,在其后追加
net.core.somaxconn = 511

2. sysctl.conf生效
[root@localhost ~]# sysctl -p

原理:

对于一个TCP连接,Server与Client需要通过三次握手来建立网络连接.当三次握手成功后,  我们可以看到端口的状态由LISTEN转变为ESTABLISHED,接着这条链路上就可以开始传送数据了.每一个处于监听(Listen)状态的端口,都有自己的监听队列.监听队列的长度,与如下两方面有关:一个是 somaxconn参数;另一个是使用该端口的程序中listen()函数.故而somaxconn会限制了接收新 TCP 连接侦听队列的大小。对于一个经常处理新连接的高负载 web服务环境来说,默认的 128 太小了。大多数环境这个值建议增加到 1024 或者更多。 服务进程会自己限制侦听队列的大小,常常在它们的配置文件中有设置队列大小的选项。大的侦听队列对防止拒绝服务 DoS 攻击也会有所帮助。

redis配置文件中有个参数,tcp-backlog默认值是511,而系统默认的somaxconn是128,所以redis启动以后报出这个warnning

 

5.2. WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.

解决办法:

第一种:无需重启系统即可生效;但重启以后信息丢失
[root@localhost ~]# echo 1 > /proc/sys/vm/overcommit_memory

第二种:即可生效,重启不会丢失
1. 编辑/etc/sysctl.conf文件,在其后追加
vm.overcommit_memory=1

2. sysctl.conf生效
[root@localhost ~]# sysctl -p

原理

内核参数overcommit_memory 确定了内存分配策略,可选值为[0、1、2]
0: 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1: 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2: 表示内核允许分配超过所有物理内存和交换空间总和的内存

 进程通常调用malloc()函数来请求分配内存,Linux支持超量分配内存,以允许分配比可用RAM加上交换内存的请求。Linux对大部分申请内存的请求都回复"yes",以便能跑更多更大的程序。因为申请内存后,并不会马上使用内存。这种技术叫做Overcommit。当linux发现内存不足时,会发生OOM killer(OOM=out-of-memory)。它会选择杀死一些进程(用户态进程,不是内核线程),以便释放内存。当oom-killer发生时,linux会选择杀死哪些进程?选择进程的函数是oom_badness函数(在mm/oom_kill.c中),该函数会计算每个进程的点数(0~1000)。点数越高,这个进程越有可能被杀死。每个进程的点数跟oom_score_adj有关,而且oom_score_adj可以被设置(-1000最低,1000最高)。

 

5.3. 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.

 解决办法 

第一种方法:重启生效,不会丢失
1. 编辑/etc/rc.local,在最后新增如下内容:
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
   echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
2. 重新启动系统
[root@localhost redis]# reboot

第二种方法:及时生效,重启丢失
[root@localhost redis]# echo never > /sys/kernel/mm/transparent_hugepage/enabled

 原理

正常来说,有两种方式来增加内存,可以管理的内存大小:
1.增大硬件内存管理单元的大小。
2.增大page的大小。
第一个方法不是很现实,现代的硬件内存管理单元最多只支持数百到上千的page表记录,并且,对于数百万page表记录的维护算法必将与目前的数百条记录的维护算法大不相同才能保证性能,目前的解决办法是,如果一个程序所需内存page数量超过了内存管理单元的处理大小,操作系统会采用软件管理的内存管理单元,但这会使程序运行的速度变慢。

从redhat 6(centos,sl,ol)开始,操作系统开始支持 Huge Pages,也就是大页。简单来说, Huge Pages就是大小为2M到1GB的内存page,主要用于管理数千兆的内存,比如1GB的page对于1TB的内存来说是相对比较合适的。

THP(Transparent Huge Pages)是一个使管理Huge Pages自动化的抽象层。目前需要注意的是,由于实现方式问题,THP会造成内存锁影响性能,尤其是在程序不是专门为大内内存页开发的时候,简单介绍如下:操作系统后台有一个叫做khugepaged的进程,它会一直扫描所有进程占用的内存,在可能的情况下会把4kpage交换为Huge Pages,在这个过程中,对于操作的内存的各种分配活动都需要各种内存锁,直接影响程序的内存访问性能,并且,这个过程对于应用是透明的,在应用层面不可控制,对于专门为4k page优化的程序来说,可能会造成随机的性能下降现象。