Redis* 优化指南 - 基于第 3 代英特尔® 至强® 可扩展处理器及英特尔® 傲腾™ 持久内存
发布日期: 08/17/2021
概述
Redis*(远程字典服务器)是一款基于内存的开源数据架构存储(依照 BSD 许可),可用作数据库、高速缓存等。Redis 支持诸如字符串、哈希表、列表、集合、带范围查询的有序集合、位图、HLL、地理空间索引和流等各种数据结构。Redis 提供内置复制、Lua 脚本、LUR 淘汰、事务和不同级别的磁盘持久化等功能。Redis 具备高性能和低延迟特点,被广泛用于游戏、视频、新闻、定位、金融等各种领域。Redis 更多的信息请见:https://redis.io/。
图 1 Redis 存储数据图示
英特尔® 傲腾™ 持久内存 (PMem),是一项创新内存技术,是介于内存和存储之间的新类别。英特尔® 持久内存在性能方面与 DRAM 类似,并能像固态硬盘一样持久地存储数据。英特尔持久内存有 128 GB、256 GB 和 512 GB 三种单根容量,每台服务器每个处理器可支持最高达 4 TB 的英特尔持久内存容量,比 DDR 容量大得多,但价格更便宜。
图 2 存储层次结构
英特尔持久内存支持以下两种操作模式:
1) 内存模式:操作系统将英特尔持久内存视为系统的主要内存,DRAM 作为英特尔持久内存的高速缓存。您的应用程序在这个大型易失性内存池中运行之前,它无需对这些应用程序进行任何更改。
2) App-Direct 模式:适用于 DRAM 和英特尔持久内存。在此情况下,英特尔持久内存是一个低延迟、字节可寻址的内存池,需要您的应用程序来管理层次数据存储,并因此更改您的应用程序。
图 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
内存模式配置
- 请依据 OS 版本安装 ipmctl
- 检查 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 访问内存。
2) 使用 numactl 将程序绑定到制定 CPU 内核
通过 numactl -C 0-15 top 命令即是将进程 "top" 绑定到 0~15 CPU 内核上执行。
3) 使用 numastat 查看当前 NUMA 节点的内存访问命中率
numastat 命令可观察各个 NUMA 节点的状态。
- numa_hit 表示节点内 CPU 内核访问本地内存的次数。
- numa_miss 表示节点 CPU 内核访问其他节点内存的次数。跨节点内存访问具有高延迟,并会因此降低性能。所以,numa_miss 的值越低越好。如果过高,则应考虑内核绑定。
性能监控工具 - PCM
PCM (Processor Counter Monitor) 处理器计数监视器可用于监控英特尔 CPU 内核的性能指标。PCM 常用于监控英特尔持久内存的带宽。下载地址:https://github.com/opcm/pcm
$ pcm-memory.x -pmm
图 6 PCM 监控持久内存带宽
通知和免责声明
英特尔技术可能需要支持的硬件、软件或服务激活。
没有任何产品或组件能保证绝对安全。
您的成本和结果可能会有所不同。
英特尔使用代号来标识正在开发且未公开的产品、技术或服务。这些并非“商用”名称,也不会被用作商标
所述产品可能包含设计缺陷或错误(即勘误表),这可能会使产品与已发布的规范有所偏差。可应要求提供当前的勘误表。
产品和性能信息
性能因用途、配置和其他因素而异。请访问 www.Intel.cn/PerformanceIndex 了解更多信息。