Redis开发运维的陷阱及避坑指南

原文首发于博客园,做者:后青春期的Keats;地址:https://www.cnblogs.com/keatsCoder/ 转载请注明,谢谢!linux

Linux 配置优化

咱们在使用 Redis 过程当中,可能更多的关注 Redis 自己的一些配置优化,如 AOF、RDB 配置、数据结构配置优化等。可是不多关心 Redis 的载体,服务器的优化。而这每每为咱们的项目运行带来灾难性的打击。所以服务器优化也是必不可少的redis

内存分配控制

Redis启动时,可能会出现下面的日志shell

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

overcommit 是 Linux 的一种内存处理机制:Linux 对绝大多数内存申请都会回复 yes,以便运行更多的程序。由于申请内存后,并不会立刻使用内存。这种机制就是 overcommit 。服务器

而 overcommit_memory 是用来设置内存分配策略的,有三种取值网络

含义
0 内核检查是否有足够可用内存,有则经过。没有则申请失败,并返回错误给进程
1 表示内核容许超量使用内存直到用完为止
2 表示内核毫不过量的使用内存

日志中 Background save 指的是 bgsave 和 bgrewriteaof 。根据操做系统的配置,若是 overcommit_memory 设置为 0 则可能会形成内存申请失败而致使后台持久化失败。所以 Redis 建议将这个值设置为 1 是为了 fork 操做在低内存下也能执行成功。数据结构

设置方法

经过命令修改,当即生效。重启后会失效并发

sysctl vm.overcommit_memory=1

再将改动写入系统配置文件,使其永久有效app

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

建议

采用 Redis 建议的配置是为了在极端状况下 Linux 能够挤出来一些内存供 Redis 备份,可是更建议优先配置好 maxmemory ,给机器留 20%~30% 的空闲内存运维

硬盘虚拟内存

swap 是指当物理内存不足时,拿出部分硬盘空间当 SWAP 分区(虚拟成内存)使用。咱们都知道硬盘的读写速度相对于内存实在是太鸡肋,对于高并发、高吞吐的应用来讲,磁盘IO通长会成为系统瓶颈。Linux 系统中 swappiness 的值控制操做系统使用 swap 的倾向程度。tcp

查看内核版本:

uname -sr
说明
0 内核版本 3.5 及以上 宁愿使用 OOM Killer 也不使用 SWAP;内核版本 3.4 及更早则反之
1 内核版本 3.5 及以上 宁愿使用 OOM Killer 也不使用 SWAP
60 默认值
主动使用 SWAP

PS:OOM Killer 是指当 Linux 发现操做系统内存不足时,主动杀死一些非内核进程的操做

设置方法

echo {value} > /proc/sys/vm/swappiness

echo vm.swappiness={value} >> etc/sysctl.conf

监控swap

查看 Swap 的整体状况

free -m

1587991406036

最后一行即展现了 Swap 的使用状况,一共 2047 Mb,以使用 0 Mb,空闲 2047 Mb

实时查看 Swap 的使用

1587991665139

参数 si 表示 swap in ,so 表示 swap out 在个人机器上都是 0 表示没有使用交换

查看指定进程的 Swap 状况

经过 ps -ef |grep redis 查看 Redis 进程号,例如 1621

经过 cat /proc/1621/smaps | grep Swap 命令查看每一个内存块 Redis Swap 的使用状况

THP 内存页大小

Redis 启动时可能会看到下面的日志

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.

提示告诉咱们建议修改 Transparent Huge Pages (THP) 的配置,Linux kernel 在 2.6.38 内核增长了 THP 特性,支持大内存页(2MB)分配,默认开启。开启后可加快 fork 子进程的速度,可是 fork 操做后,每一个内存页从原来的 4KB 变为 2MB,会大幅加剧重写期间父进程内存消耗。同时每次写命令引发的复制内存页单位放大了512倍。会拖慢写操做的执行时间。形成大量的写操做慢查询所以 Redis 日志中建议禁用它。方法以下:

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

另外在 /etc/rc.local 中追加

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

对于某些发行版本(例如红帽6以上)配置文件不在这个位置(在 /sys/kernel/mm/redhat_transparent_hugepage/enabled),可是 Redis 检查 THP 是写死的此位置,因此虽然这么修改后 Redis 不报警然而实际是没有做用的,须要注意。应该改动对应位置的值

使用NTP 同步时间

在集群或哨兵环境中,多台服务器使用相同的网络时间协议同步时间能更方便的阅读日志,排查问题

能够设置定时任务同步时间

crontab -u //设定某个用户的cron服务
crontab -l //列出某个用户cron服务的详细内容
crontab -r //删除某个用户的cron服务
crontab -e //编辑某个用户的cron服务
crontab -i //打印提示,输入yes等确认信息

添加每小时执行一次的任务

0 * * * * /usr/sbin/ntpdate cn.pool.ntp.org > dev/null 2>&1

最大链接数限制

经过 ulimit -a 命令查看和设置当前用户进程的资源数,其中包含 open files 参数,是单个用户同时打开的最大文件描述符个数。虽然 Redis 中能够配置最大的客户端链接数(默认 10000) 。Redis 内部最多使用 32 个文件描述符。当 open files = 4096 时,Redis 最大提供 4096-32=4064 个链接。由于它不能突破操做系统的限制。若是须要,使用以下命令修改:

ulimit -Sn {max-open-files}

TCP backlog

tcp backlog 配置的是 tcp 握手时候的队列大小。若是该值太小。会致使高并发场景下部分链接第三次握手ACK被丢弃。关于 backlog

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

Redis 启动时,会告诉咱们系统配置中该值是 128,而 Redis 511。这个 511 是没用的,由于系统比这个小。须要修改系统 backlog 的值

echo 511 > /proc/sys/net/core/somaxconn

参考文献:

《Redis开发与运维》 --- 付 磊 张益军

相关文章
相关标签/搜索