Redis* 优化指南 - 基于第 3 代英特尔® 至强® 可扩展处理器及英特尔® 傲腾™ 持久内存

发布日期: 08/17/2021

概述

Redis*(远程字典服务器)是一款基于内存的开源数据架构存储(依照 BSD 许可),可用作数据库、高速缓存等。Redis 支持诸如字符串、哈希表、列表、集合、带范围查询的有序集合、位图、HLL、地理空间索引和流等各种数据结构。Redis 提供内置复制、Lua 脚本、LUR 淘汰、事务和不同级别的磁盘持久化等功能。Redis 具备高性能和低延迟特点,被广泛用于游戏、视频、新闻、定位、金融等各种领域。Redis 更多的信息请见:https://redis.io/。

redis 存储图

图 1 Redis 存储数据图示

英特尔® 傲腾™ 持久内存 (PMem),是一项创新内存技术,是介于内存和存储之间的新类别。英特尔® 持久内存在性能方面与 DRAM 类似,并能像固态硬盘一样持久地存储数据。英特尔持久内存有 128 GB、256 GB 和 512 GB 三种单根容量,每台服务器每个处理器可支持最高达 4 TB 的英特尔持久内存容量,比 DDR 容量大得多,但价格更便宜。

存储金字塔

图 2 存储层次结构

英特尔持久内存支持以下两种操作模式:

1) 内存模式:操作系统将英特尔持久内存视为系统的主要内存,DRAM 作为英特尔持久内存的高速缓存。您的应用程序在这个大型易失性内存池中运行之前,它无需对这些应用程序进行任何更改。

2) App-Direct 模式:适用于 DRAM 和英特尔持久内存。在此情况下,英特尔持久内存是一个低延迟、字节可寻址的内存池,需要您的应用程序来管理层次数据存储,并因此更改您的应用程序。

redis 和持久内存

图 3 内存模式(Memory mode)与 App-Direct 模式(AD mode)

在内存模式下,您的应用程序无需任何更改即可运行。由于易于使用,采用内存模式的 Redis 得到了广泛应用。

本文档提供 Redis 使用内存模式时各性能优化项的配置建议。

本文档适用于双路第 3 代英特尔® 至强® 可扩展处理器和英特尔® 傲腾™ 持久内存200系列。

英特尔® 傲腾™ 持久内存配置

英特尔® 傲腾™ 持久内存 DIMM 槽位配置

持久内存配置

图 4 持久内存 DIMM 槽位配置

  • 第 3 代英特尔® 至强® 可扩展处理器(代号Ice Lake/Whitley)每个 CPU 有 16 个 DDR4 插槽
  • 英特尔® 傲腾™ 持久内存200系列每个 CPU 最多可配置 16 个
  • 配置容量比例 (DRAM : Pmem) 通常为 1:4 到 1:16, 最小 1:2

内存模式配置

  1. 请依据 OS 版本安装 ipmctl
  2. 检查 dimm 信息
$ ipmctl show -dimm

        3.配置内存模式

$ ipmctl create -f -goal MemoryMode=100

       4.重启服务器

$ shutdown -r now

       5.查看当前内存大小

$ numactl -H

检查持久内存大小

图 5 检查当前内存大小

BIOS 设置

BIOS 可优化配置项及推荐值如下:

配置项

推荐值

超线程

禁用

硬件预取器

启用

L2 RFO 预取禁用

禁用

邻近高速缓存预取

启用

DCU 流预取器

启用

DCU IP 预取器

启用

LLC 预取

启用

总内存加密 (TME)

禁用

SNC (Sub NUMA)

禁用

基于 UMA 的集群

Hemisphere(2 个集群)

200 系列持久内存带宽加速 (MBB)

18000

200 系列持久内存 Turbo/内存带宽加速功能 (MBB) 功率限制(单位 MW)

18000

持久内存 QoS

禁用持久内存 QoS 功能

持久内存性能设置

BW 已优化

持久内存 FastGo 配置

自动

适用于 AD 的 Snoop 模式

禁用

适用于 2LM 的 Snoopy 模式

禁用

启动性能模式

最高性能

Turbo 模式

启用

硬件 P-State

原生模式

本地/远程阈值

自动

Linux* 优化配置

网络配置

在 Redis 应用场景中,性能通常会更多地受到网络带宽的限制,而非内存和英特尔持久内存的性能限制。因此,当您在网络上运行 Redis 时,您需要具备尽可能高的网络带宽的网卡。推荐带宽在 10GB/s 以上。

Disk 配置

  • 设置相应磁盘预读大小
echo 4096 > /sys/block/sd<x>/queue/read_ahead_kb

CPU 配置

  • 设置相应的 CPU 为性能模式
cpupower -c <cpulist> frequency-set --governor performance
  • 设置能耗/性能偏差
x86_energy_perf_policy performance
  • 设置处理器 P-State 的最小值
echo 100 > /sys/device/system/cpu/intel_pstate/min_perf_pct

内核设置

  • 设置相应的 CPU 内核参数
sysctl -w kernel.sched_domain.cpu<x>.domain0.max_newidle_lb_cost=0

sysctl -w kernel.sched_domain.cpu<x>.domain1.max_newidle_lb_cost=0
  • 设置调度粒度
sysctl -w kernel.sched_min_granularity_ns=10000000

sysctl -w kernel.sched_wakeup_granularity_ns=15000000
  • 设置虚拟内存参数
sysctl -w vm.dirty_ratio = 40

sysctl -w vm.swappiness = 10

sysctl -w vm.dirty_background_ratio=10

Redis* 设置

Redis 在内存模式下设置

内存模式下,应用不需要做任何改动就可运行,因此只要下载和编译 open source 的 Redis 运行即可。

1)下载源代码

Github 网址:https://github.com/redis/redis

2)编译命令(更多详情请参阅 https://github.com/redis/redis README.md)

$ make

另外,对于每个运行的 Redis 实例,为了减少跨 Numa 节点的访问而影响性能,可以通过 numactl 和 taskset 将不同 Redis 实例绑定到不同插槽和不同内核上。

numactl -C <cpu>./redis-server ./redis.conf > ./redis.log

相关工具

ipmctl

ipmctl 是一个平台实用程序,用于配置和管理英特尔持久内存,支持以下功能:

  • 发现
  • 配置
  • 固件管理
  • 安全功能管理
  • 健康监测
  • 性能追踪
  • 调试和故障排除

1.具体用法可以参考:

https://software.intel.com/en-us/articles/quick-start-guide-configure-intel-optane-dc-persistent-memory-on-linux

2. ipmctl 需要 libsafec 作为依赖组件。以下是 libsafec 和 ipmctl 的 repo 文件

https://copr.fedorainfracloud.org/coprs/jhli/ipmctl/repo/epel-7/jhli-ipmctl-epel-7.repo

https://copr.fedorainfracloud.org/coprs/jhli/safeclib/repo/epel-7/jhli-safeclib-epel-7.repo

3.安装方式:

  • 包管理器安装:
$ yum install ipmctl
  • 源代码安装:

源代码下载地址: https://github.com/intel/ipmctl

numactl

numactl 工具可用于检查当前服务器的 NUMA 节点的配置和状态。它可将程序绑定到运行相应程序的指定 CPU 内核。

1.安装方式:

$ yum -y install numactl numastat

2.命令使用举例:

1) 使用 numactl 检查当前服务器的 NUMA 配置

numactl 性能结果显示,示例服务器已划分为四个 NUMA 节点。每个节点包含 16 个 CPU 内核,各节点的内存大小约为 64GB。与此同时,此命令还提供了不同节点之间的距离。距离越远,内存访问跨 NUMA 节点的延迟越高。应用程序运行时应减少跨 NUMA 访问内存。

redis numa 读数

2) 使用 numactl 将程序绑定到制定 CPU 内核

通过 numactl -C 0-15 top 命令即是将进程 "top" 绑定到 0~15 CPU 内核上执行。

redis 绑定

3) 使用 numastat 查看当前 NUMA 节点的内存访问命中率

numastat 命令可观察各个 NUMA 节点的状态。

numastat 命令

  • numa_hit 表示节点内 CPU 内核访问本地内存的次数。
  • numa_miss 表示节点 CPU 内核访问其他节点内存的次数。跨节点内存访问具有高延迟,并会因此降低性能。所以,numa_miss 的值越低越好。如果过高,则应考虑内核绑定。

性能监控工具 - PCM

PCM (Processor Counter Monitor) 处理器计数监视器可用于监控英特尔 CPU 内核的性能指标。PCM 常用于监控英特尔持久内存的带宽。下载地址:https://github.com/opcm/pcm

$ pcm-memory.x -pmm

 

检查 PCM

图 6 PCM 监控持久内存带宽

 


通知和免责声明

英特尔技术可能需要支持的硬件、软件或服务激活。

没有任何产品或组件能保证绝对安全。

您的成本和结果可能会有所不同。

英特尔使用代号来标识正在开发且未公开的产品、技术或服务。这些并非“商用”名称,也不会被用作商标

所述产品可能包含设计缺陷或错误(即勘误表),这可能会使产品与已发布的规范有所偏差。可应要求提供当前的勘误表。

产品和性能信息

1

性能因用途、配置和其他因素而异。请访问 www.Intel.cn/PerformanceIndex 了解更多信息。