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
含义
0Linux3.5以及以上:宁愿用OOM Killer也不用swap<br/>Linux3.4以及更早:宁愿用swap也不用OOM Killer
1Linux3.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需要谨慎
    • 如果存在外网网卡

4.开启Linux防火墙

5.定期备份数据

6.不使用默认端口,防止被弱攻击杀掉

7.使用非root用户启动

热点Key的发现

1.客户端

2.代理端

3.服务端

4.机器收集

5.方案比对

Last modification:June 4, 2019
如果觉得我的文章对你有用,请随意赞赏