一、关闭THP
1.什么是THP,它是用来做什么的?
答:
2.Redis服务为什么要关闭THP?
答:
开启THP后,当Redis做持久化操作时,会降低fork子进程的速度,在操作之后,每个内存页从原来4KB变为2MB,会大幅增加重写期间父进程内存消耗。
同时每次写命令引起的复制内存页单位放大了512倍,会拖慢写操作的执行时间,导致大量写操作慢查询。
3. 如何关闭THP?
答:
cd /sys/kernel/mm
cd transparent_hugepage
cat enabled
默认开启时,中括号会将always包围起来。
[always] madvise never
手动禁用时:
echo never > enabled
echo never > defrag
在启动项/etc/rc.local 中添加shell脚本
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi
4.注意事项
上述路径是CentOS7系统里的位置,在RedHat6以上的系统里,位置是下面这个,注意路径区别。
/sys/kernel/mm/redhat_transparent_hugepage/enabled
二、优化Redis
1、内存分配控制 vm.overcommit_memory
什么是overcommit?
答:Linux操作系统对大部分申请内存的请求都回复yes,以便能运行更多的程序。因为申请内存后,并不会马上使用内存,这种技术叫做overcommit
在文件中设置
vi /etc/sysctl.conf
vm.overcommit_memory = 0|1|2
0:内核将检查系统中是否有足够的可用内存,如果有,内存申请通过,否则失败。返回错误给应用。
1: 内核允许超量使用内存直到用完为止。
2: 表示决不过量的使用内存。
这块常用配置项值为1,主要用于Redis持久化时fork操作。
Redis建议把这个值设置为1,是为了让fork操作能够在低内存下也执行
成功。
如果fork失败,日志里将记录
Cannot allocate memory
2、关于swap分区优化
Redis性能调优的一个重要部分,就是防止Redis在内存里的数据发生swap交换。所谓的swap分区,就是在硬盘里划出一块空间,做为临时备用空间。
当内存空间不足时,会通过算法,将一部分数据放到swap分区中存储。因为硬盘的速度是远远慢于内存的,一但发现数据交换到swap分区,将会严重影响Redis性能。
长见的优化办法:
1. 增加服务器可用物理内存
2. 设置maxmemory 选项,规定Redis最大可以内存数
3. 在/etc/sysctl.conf中修改 swappiness,降底swap分区的使用概率。
关于第3条的操作,现在记录一下。
vi /etc/sysctl.conf
vm.swappiness=60(默认值) ,可以改写为10
如果值等于100 ,将主动使用swap
如果值等于0,宁愿用OOM Killer也不会用swap(Linux 3.5版本以上)
3、OOM Killer
当linux系统可用内存不足时会选择性地杀掉用户进程。
OOM Killer 杀进程的规则:
OOM killer会为每个用户进程设置一个权值,当权值越高时,被kill掉的概率就越高,反之概率越低。
每个进程的权重值存在于proc目录下的oom_score文件中
可以通过ps aux|grep redis 查到redis服务器的进程ID
然后根据进程ID,进入相应目录,找到oom_score文件
cat /proc/进程ID/oom_score
如果人为修改权重,需要操作上述目录下的oom_adj文件,可以改一个比较小的值。
4、系统时钟NTP
NTP(Network Time Protocol) 网络时间协议,保障不同服务器拥有一致的时间。
当使用Redis哨兵或Cluster时,使用了多个节点。
如果各服务器系统时间不一样,记录到日志里的时间点也不一样。 当排查日志时,会很不方便。所以要给每个服务器,设置NTP
添加计划任务,字段有5个,分别代表: 分,小时,日期,月,周
每10分钟,同步一次NTP服务
*/10 * * * * /usr/sbin/ntpdate ntp.xx.com > /dev/null 2>&1
5、进程可打开的最大文件数设置
答:
在Linux操作系统中,将文件句柄,文件描述符,都当作文件来看待。Linux系统对TCP连接也定义为一个文件句柄。
并且对进程可打开的最大文件数量是有限制的。可以通过ulimit -n查看,通常默认1024.
因此对于支撑大量连接的Redis来说需要增大这个值,如设置ulimit -n 65535,防止出现Too many open files错误。
永久修改:
在/etc/security/limits.conf最后增加如下两行记录,下面的两条命令,表示任何人可以打开的最大文件数,其中 soft 代表警告值,hard 设置的大小被超过,就会进行真正的报错。
* soft nofile 65535
* hard nofile 65535
注:
ulimit -a 可以查看当前系统的所有限制值,
ulimit -n 可以查看当前的最大打开文件数。
6、TCP backlog设置
Linux操作系统对于特定端口的TCP连接使用backlog队列保存。
Redis 默认文件里
tcp-backlog=511
如果Redis用于高并发场景,为了防止缓慢连接占用,可适当增大这个设置.比如增加到2048
但是要注意一点,backlog的大小,是以Linux系统设置为主的。还需要进入系统文件设置
vi /etc/sysctl.conf
net.core.somaxconn= 511
wq!保存退出
sysctl -p 让配置生效
如果系统里的net.core.somaxconn 小于redis.conf tcp-backlog的配置大小
Redis会打印如下警告日志:
WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
操作内核参数默认值一般是128(定义了系统中每一个端口最大的监听队列的长度),对于负载很大的服务程序来说大大的不够。一般会将它修改为2048或者更大。
当Redis客户端连接出现拒绝访问时,怀疑是backlog队列溢出导致的问题,可以通过
netstat -s | grep overflowed
统计backlog队列溢出造成的连接拒绝次数。
三、关于配置bind
配置文件里的bind选项 后面填写的IP,是指Redis和哪个网卡进行绑定。
如果只配置192.168.10.1,就只能使用这块网卡进行连接,本机127.0.0.1 都不行
redis-cli -h 192.168.10.1
bind后面可以接受多项配置
bind 192.168.10.1 127.0.0.1