学习

我们喜欢 Redis,因为它速度快(而且有趣!),因此在开始考虑扩展 Redis 时,我们首先要确保已尽一切努力最大限度地提高其性能。

让我们首先看看一些重要的调整参数。

最大客户端#

Redis 的默认最大客户端数为 10,000 个;达到最大值后,Redis 将对所有新连接返回错误。如果您有大量连接(或大量应用程序实例),则可能需要提高此值。您可以在 Redis 配置文件中设置最大同时客户端数

maxclients 20000

最大内存#

默认情况下,Redis 没有最大内存限制,因此它将使用所有可用的系统内存。如果您使用复制,则需要限制内存使用量,以便为复制输出缓冲区留出开销。为系统保留一些内存也是一个好主意。大约 25% 的开销。您可以在 Redis 配置文件中更新此设置

# memory size in bytes
maxmemory 1288490188

设置 TCP-BACKLOG#

Redis 服务器使用 tcp-backlog 的值来指定完整连接队列的大小。

Redis 将此配置作为 listen(int s, int backlog) 调用的第二个参数传递。

如果您有许多连接,则需要将此值设置得高于默认值 511。您可以在 Redis 配置文件中更新此值

# TCP listen() backlog.
#
# In high requests-per-second environments you need an high backlog in order
# to avoid slow clients connections issues. Note that the Linux kernel
# will silently truncate it to the value of /proc/sys/net/core/somaxconn so
# make sure to raise both the value of somaxconn and tcp_max_syn_backlog
# in order to get the desired effect.
tcp-backlog 65536

正如 redis.conf 中的注释所述, somaxconn 和 tcp_max_syn_backlog 的值可能也需要在操作系统级别进行增加。

设置只读副本配置#

扩展 Redis 的一种简单方法是添加只读副本,并将负载从主服务器上卸下。当您的工作负载以读为主(而不是以写为主)时,这种方法最有效。您可能希望副本可用,并且即使复制尚未完成,也仍然可以提供陈旧数据。您可以在 Redis 配置中更新此设置

slave-serve-stale-data yes

您还需要阻止对副本进行任何写入操作。您可以在 Redis 配置中更新此设置

slave-read-only yes

内核内存#

在高负载下,偶尔会由于内存分配而导致性能下降。这正是 Redis 创建者 Salvatore 过去在博客中所写的内容。性能问题与透明巨页有关,如果需要,您可以在操作系统级别禁用透明巨页。

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

内核网络栈#

如果您计划在高性能环境中处理大量连接,我们建议您调整以下内核参数

vm.swappiness=0                       # turn off swapping
net.ipv4.tcp_sack=1                   # enable selective acknowledgements
net.ipv4.tcp_timestamps=1             # needed for selective acknowledgements
net.ipv4.tcp_window_scaling=1         # scale the network window
net.ipv4.tcp_congestion_control=cubic # better congestion algorithm
net.ipv4.tcp_syncookies=1             # enable syn cookies
net.ipv4.tcp_tw_recycle=1             # recycle sockets quickly
net.ipv4.tcp_max_syn_backlog=NUMBER   # backlog setting
net.core.somaxconn=NUMBER             # up the number of connections per port
net.core.rmem_max=NUMBER              # up the receive buffer size
net.core.wmem_max=NUMBER              # up the buffer size for all connections

文件描述符限制#

如果您未为 Redis 用户设置正确数量的文件描述符,您将看到指示“Redis 无法设置最大打开文件数...”的错误。您可以在操作系统级别增加文件描述符限制。

以下是在 Ubuntu 上使用 systemd 的示例

/etc/systemd/system/redis.service
[Service]
...
User=redis
Group=redis
...
LimitNOFILE=65536
...

然后,您需要重新加载守护进程并重新启动 redis 服务。

启用 RPS(接收数据包转向)和 CPU 偏好#

我们可以提高性能的一种方法是阻止 Redis 在处理任何网络流量的相同 CPU 上运行。这可以通过为我们的网络接口启用 RPS 并为我们的 Redis 进程创建一些 CPU 亲和性来实现。

以下是一个示例。首先,我们可以在 CPU 0-1 上启用 RPS

$ echo '3' > /sys/class/net/eth1/queues/rx-0/rps_cpus

然后,我们可以将 redis 的 CPU 亲和性设置为 CPU 2-8

# config is set to write pid to /var/run/redis.pid
$ taskset -pc 2-8 `cat /var/run/redis.pid`
pid 8946's current affinity list: 0-8
pid 8946's new affinity list: 2-8