Linux内核优化
1.vm.overcommit_memory
##配置位置
vi /etc/sysctl
##Redis推荐将该值设置为1,避免fork的时候,因为内存不够而失败
echo "vm.overcommit_memory=1" >> /etc/sysctl.conf
sysctl vm.overcommit_memory=1
值 | 含义 |
---|---|
0 | 内核将检查是否有足够的可用内存。如果有足够的可用内存,内存申请通过,否则内存申请失败,并把错误返回给应用进程。 |
1 | 表示内核允许超量使用内存直到用完位置 |
2 | 表示内核绝不过量的使用内存,即整个系统地址空间不能超过swap+50%的RAM值,50%是overcommit_ratio默认值,此参数同样支持修改。 |
最佳实践
- Redis设置合理的maxmemory,保证机器有20%~30%的闲置内存
- 集中化管理AOF重写和RDB的bgsave。
- 避免一台机器上有多个master
- 设置vm.overcommit_memory=1.防止极端情况下fork失败
2.swappiness
###立即生效
echo ${bestValue} > /proc/sys/vm/swappiness
###永久生效
echo vm.swappiness=${bestValue} >> /etc/sysctl.conf
值 | 含义 |
---|---|
0 | Linux3.5以及以上:宁愿用OOM Killer也不用swap<br/>Linux3.4以及更早:宁愿用swap也不用OOM Killer |
1 | Linux3.5以及以上:宁愿用swap也不用OOM killer |
60 | 默认值 |
100 | 操作系统会主从使用swap |
最佳实践
- 如果Linux >= 3.5 , vm.swappiness = 1 , 否则vm.swappiness = 0
- 物理内存充足时,使Redis足够快
- 物理内存不足时,避免Redis死掉(如果当前Redis为高可用,死掉比阻塞更好)
3.THP(Transparent huge page)
- 作用:加速fork
- 建议:将其禁用,因为可能会产生更大(512倍)的内存开销
echo never > /sys/kernel/mm/transparent_huagepage/enabled
4.OOM killer
- 作用:内存使用超出,操作系统将按照规则kill掉某些进程
- 配置方法:/proc/${process_id}/oom_adj越小,被杀掉的概率越小
运维经验:
- 不要过度依赖此特性,应该合理管理内存
- 通常在高可用的情况下,被杀掉比僵死更好,因此不要过多依赖oom_adj配置。
5.NTP(Net Time Protocol)
- 避免有多台机器,每台机器的时间都不一致,那么查日志找问题的时候会产生很多困扰。
- 建议实现本地的NTP服务或配置统一的NTP服务
- Redis Cluster或Redis Sentinel依赖选举的时间为本地时间,如果有不一致不会出错
6.ulimit
- redis默认的maxclient=10000,则redis至少需要10032个文件句柄。
- 但是Linux默认只有4096个文件句柄,即Redis默认实际的maxclient=4064
- 可以通过ulimit -n 提升Linux文件句柄数
7.TCP backlog
Redis默认的tcp-backlog值为511,可以修改配置tcp-backlog进行调整,如果Linux的tcp-backlog小于Redis设置的tcp-backlog,那么在Redis启动时会提示Redis的tcp-backlog被迫降至Linux的tcp-backlog
##查看方法
cat /proc/sys/net/core/somaxconn
128
##修改方法
echo 511 > /proc/sys/net/core/somaxconn
安全的Redis
一、全球crackit攻击
- 2015年11月,全球35000+个Redis主机受到攻击
被攻击的机器特征
- Redis所在的机器有外网IP
- Redis以默认端口6379为启动端口,并且对外网开放
- Redis是以root用户启动的
- Redis没有设置密码
- Redis的网卡bind为0.0.0.0或者没有绑定
攻击步骤
- 访问Redis
- flushall
- set crackit id_rsa.pub
- config set dir
- config set dbfilename
- save
- ssh root
二、安全七则
1.设置密码
- 服务器配置:requirepass和masterauth
- 客户端连接:auth命令和-a参数
注意事项
- 密码要足够复杂,防止暴力破解
- masterauth不要忘记
- auth还是通过明文传输,可以通过抓包破解
2.伪装安全命令
- 服务端配置:rename-command为空或随机字符
- 客户端连接:不可用或指定随机字符
注意事项
- 不支持config set动态设置
- RDB和AOF如果包含rename-command之前的命令,将无法使用
- config命令本身是在Redis内核会使用到,不建议设置
3.网卡绑定bind
- 服务端配置:bind限制的是网卡,并不是客户端IP
注意事项:
- bind不支持config set动态配置
- bind 127.0.0.1需要谨慎
- 如果存在外网网卡