首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Redis 开发陷阱及避坑指南!

Linux 配置优化

我们在使用Redis 过程中,可能更多的关注Redis 本身的一些配置优化,如 AOF、RDB 配置、数据结构配置优化等。

但是很少关心Redis 的载体,服务器的优化。而这往往为我们的项目运行带来灾难性的打击。因此服务器优化也是必不可少的。

内存分配控制

overcommit 是 Linux 的一种内存处理机制:Linux 对绝大多数内存申请都会回复 yes,以便运行更多的程序。因为申请内存后,并不会马上使用内存。这种机制就是 overcommit 。

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

日志中 Background save 指的是 bgsave 和 bgrewriteaof 。根据操作系统的配置,如果 overcommit_memory 设置为 0 则可能会造成内存申请失败而导致后台持久化失败。

因此Redis 建议将这个值设置为 1 是为了 fork 操作在低内存下也能执行成功。

设置方法

通过命令修改,立即生效。重启后会失效

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

建议

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

硬盘虚拟内存

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

查看内核版本:

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

设置方法

echo > /proc/sys/vm/swappiness

echo vm.swappiness= >> etc/sysctl.conf

监控swap

查看 Swap 的总体情况

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

实时查看 Swap 的使用

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

查看指定进程的 Swap 情况

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

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

THP 内存页大小

提示告诉我们建议修改 Transparent Huge Pages (THP) 的配置,Linux kernel 在 2.6.38 内核增加了 THP 特性,支持大内存页(2MB)分配,默认开启。

开启后可加快 fork 子进程的速度,但是 fork 操作后,每个内存页从原来的 4KB 变为 2MB,会大幅加重重写期间父进程内存消耗。

方法如下:

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

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

使用NTP 同步时间

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

可以设置定时任务同步时间

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

最大连接数限制

通过 ulimit -a 命令查看和设置当前用户进程的资源数,其中包含 open files 参数,是单个用户同时打开的最大文件描述符个数。虽然Redis 中可以配置最大的客户端连接数(默认 10000) 。

TCP backlog

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

Redis

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

参考文献:

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

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200831A0QM7I00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券