RocksDB* 优化指南 - 基于第 3 代英特尔® 至强® 可扩展处理器

概述

本指南面向已经了解 RocksDB* 的用户,提供了硬件和软件的指导和系统设置,在大多数情况提供最佳性能。然而,由于 RocksDB* 可以多种方式部署,本指南提供仅为参考使用案例,我们希望用户能够仔细考虑这些设置。

第 3 代英特尔® 至强® 可扩展处理器提供了业界领先的工作负载优化平台,并内置了人工智能加速功能,从多云到智能边缘,再返回数据中心,构建了一个无缝的高性能平台,帮助加速数据的变革。有助于本工作负载应用提升的有:

  • 增强的性能
  • 更多的英特尔® Ultra Path Interconnect
  • DDR4 内存的速率和容量的提升
  • 英特尔® Security Essentials 和英特尔® Security Libraries for Data Center
  • 英特尔® Speed Select Technology
  • 支持英特尔® 傲腾™ 持久内存 200 系列

RocksDB* 介绍

RocksDB* 项目起源于 Facebook* 的一个实验项目, 该项目旨在开发一个与快速存储器(尤其是闪存)存储数据性能相当的数据库软件,以应对高负载服务。RocksDB 借鉴了开源项目 LevelDB* 的重要代码和 Apache* HBase* 项目的重要思想。源代码可回溯至 LevelDB 1.5 分支。

RocksDB 支持各种各样的配置,并可针对不同的生产环境(仅内存、闪存、硬盘或 HDFS)进行调优。它还支持各种数据压缩算法,以及用于生产环境故障排查的工具。RocksDB 主要旨在为快速存储应用程序和高工作负载服务实现出色的性能。因此,此数据库系统需要充分利用闪存内存和 RAM 的读写速度。RocksDB 需要支持高效的 "Point lookup" 和 "range scan" 操作,需要支持配置各种参数在高压力的随机读、随机写或者二者流量都很大时性能调优。

关于 RocksDB 的更多信息,请访问 RocksDB wiki 主页。

持久内存介绍

持久内存的出现改变了原有存储的层次结构。与英特尔® 至强® 可扩展处理器一起提供的英特尔® 傲腾™ 持久内存(简称持久内存或 PMem)的性能类似于 DRAM,并且像 SSD 那样持久地存储数据, 同时持久内存比 DDR 内存容量更大,价格也更为便宜。下图显示了新的存储层次结构在容量、价格和性能上的对比情况。图 1 显示了新内存/存储层次结构中的容量、价格和性能对比。

内存金字塔

图 1 内存/存储架构中的容量、价格和性能对比

持久内存有 128GB、256GB 和 512GB 三种单根容量。每台服务器单个处理器可以支持的持久内存容量最高可达 4TB。持久内存主要有两种工作的方式, 内存模式和应用直接访问模式,持久内存上的应用场景有以下 3 种:

应用模式

 

内存模式(Memory Mode)

系统 DRAM(近内存)作为持久内存(远内存)的高速缓存,当 DRAM 中有数据命中时,系统与 DRAM 的性能类似。但是,如果数据不在 DRAM 中(即“近内存高速缓存缺失”),则将从持久内存读取数据,并在 DRAM 中缓存数据。内存模式下,应用不需要做任何改动。但是这种模式,DRAM 的空间在系统中不可见,对于应用是一种浪费。内存模式可能无法满足部分应用程序的要求,这些应用程序依赖 DRAM 的速度来满足某些性能要求

App-Direct 模式

在此模式下,持久内存和 DRAM 空间可由系统管理。在这种方式下,持久内存和 DRAM 的空间同时可以由系统来管理。英特尔的持久内存开发套件 (PMDK),可用于持久性功能。持久内存的 App-Direct 模式往往是通过 mmap 对 PMem-aware文件系统实现的。这种情况下将没有系统调用,没有上下文切换,中断。所以内核中对于匿名页的 Copy-on-write 也不支持。

在 Linux* Kernel 5.1 及更高版本中,App-Direct 模式可以将管理的持久内存空间交给 MMU 管理。这样从系统中可以将持久内存作为一个和 DRAM 相类似的匿名空间,可以将持久内存看着是一个较慢、较大的内存节点

持久内存现在已发展到第 2 代。有关本产品的更多信息,请参阅英特尔官网的英特尔® 傲腾™ 持久内存主页。

硬件调优

本指南针对 RocksDB 在第 3 代英特尔® 至强® 可扩展处理器以及英特尔傲腾持久内存 200 系列上的使用。 部分内容可能适用于搭载英特尔傲腾持久内存 100 系列的第 2 代英特尔至强可扩展处理器。

您可以在英特尔的官网上找到支持不同英特尔傲腾持久内存模式(内存模式 [MM]、App-Direct 模式 [AD] 和双模式 [DM])的操作系统列表。Linux* 内核必须为 v4.19 或以上版本。如果要运行基于 KMEM DAX 的 Linux 内核,需要 5.1 或以上版本。

BIOS 设置

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

配置项

建议值

超线程

禁用

硬件预取器

启用

L2 RFO 预取禁用

禁用

邻近高速缓存预取

启用

DCU 流预取器

启用

DCU IP 预取器

启用

LLC 预取

启用

全内存加密 (TME)

禁用

SNC (Sub NUMA)

禁用

基于 UMA 的集群

Hemisphere (2 个集群)

启动性能模式

最高性能

Turbo 模式

启用

硬件 P-State

原生模式

本地/远程阈值

自动

 

持久内存相关设置

配置项

建议值

说明

内存带宽提升平均功率 (mW)

15000

持久内存 200 系列

内存带宽提升功能启用

启用

持久内存 200 系列

内存带宽提升平均功率限制 (mW)

18000

持久内存 200 系列

内存带宽提升平均功率时间常数 (ms)

15000

持久内存 200 系列

持久内存 QoS

启用

请根据平台类型以及附件 QoA 表中的持久内存配置选择对应选项。

DDR 对比 DDRT 策略

BW 已优化

(AD 模式)

内存模式推荐使用平衡配置文件

FastGo 配置

禁用

NTWrite 在 AD 模式下可加速

适用于 AD 的 Snoop 模式

启用

持久内存 100 系列要求下列设置:

Atos* 禁用

适用于 2LM 的 Snoopy 模式

启用

持久内存 100 系列要求下列设置:

Atos* 禁用

 

QoS 附表 1:英特尔傲腾持久内存 100 系列平台

配置式

描述

备注

DCPMM QoS 已禁用

功能已禁用

推荐禁用“运行”。测试启用此选项是否能提升性能。默认从 536.D14 禁用

DCPMM QoS 配置文件 1

6 个模块,每个插槽 4 个模块(已优化)

 

DCPMM QoS 配置文件 2

每个插槽 2 个模块(已优化)

 

DCPMM QoS 配置文件 3

每个插槽 1 个模块(已优化)

从 534.D01 开始可用

 

QoS 表 2:英特尔傲腾持久内存 200 系列平台

配置式

描述

备注

禁用持久内存 QoS 功能

功能已禁用

推荐禁用“运行”。测试启用此选项是否能改进您的应用程序。

配置 1

8+8(DRAM + 持久内存)

 

配置 2

8+4、8+2、8+1(DRAM + 持久内存)

 

英特尔傲腾持久内存 200 系列硬件设施

非易失性设备控制 (ndctl) 和 daxctl

ndctl 程序用于管理 Linux 内核中的 libnvdimm(非易失性内存设备)子系统和命名空间。daxctl 程序为已创建的任何 devicedax 命名空间提供枚举和配置命令。使用 devicedax 命名空间时需要 daxctl。具体命令请参考 ndctl 用户指南

以下介绍几种 ndctl 和 daxctl 的安装方式:

  • 包管理器安装
$ yum install ndctl

$ yum install daxctl
  • 源码安装

下载源代码

依赖包:

kmod-devel libudev-devel libuuid-devel json-c-devel

bash-completion libtool ruby asciidoc xmlto

安装步骤:

$ ./autogen.sh

$ ./configure CFLAGS='-g -O2' --prefix=/usr --sysconfdir=/etc --libdir=/usr/lib64

$ make -j & make install

IPMCTL

IPMCTL 是用于配置和管理英特尔傲腾持久内存的平台实用程序。它支持以下功能:

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

关于如何使用 IPMCTL 的详细信息,请参阅网页中的持久内存配置介绍指南。IPMCTL 需要 libsafec 作为依赖组件。将 repo 文件用于 libsafecIPMCTL

包管理器安装:

$ yum install ipmctl

源代码安装:

下载源代码

平台与版本推荐:

使用英特尔傲腾持久内存 100 系列在平台上安装时的推荐版本:v1.X.X

使用英特尔傲腾持久内存 100 系列在平台上安装时的推荐版本:v2.X.X

PMDK 安装

从 githab 下载 PMDK

源代码安装:

$ git clone https://github.com/pmem/pmdk

$ cd pmdk

$ git checkout tags/1.10

$ make

内存模式设置

步骤 1: 创建目标

$ ipmctl create -f -goal memorymode=100

步骤 2:重启服务器

$ shutdown -r now

创建完成后,可以通过 numactl 命令查看当前的内存大小。

内存大小

图 2 内存大小

App-Direct (AD) 模式设置

Filesystem-DAX (fsdax)

Filesystem-DAX(fsdax)是默认的命名空间模式。如果在使用 ndctl create-namespace 创建新命名空间时没有配置其他选项,则会创建块设备 (/dev/pmemX[.Y]),此设备可支持 Linux 文件系统(目前支持 xfsext4)的 DAX 功能。DAX 从 I/O 路径中删除页面缓存,并允许 mmap(2) 在持久内存介质中建立直接映射。DAX 功能使超出页面缓存容量的工作负载或工作集可以扩展到持久性内存的容量。适合页面缓存或执行批量数据传输的工作负载可能无法从 DAX 中获益。

持久内存 AD

图 3 App Direct 模式

步骤 1: 创建目标

$ ipmctl create -f -goal (default is AD mode if no parameter is added)

$ ipmctl create -f -goal persistentmemorytype=appdirect

步骤 2:重启服务器

$ shutdown -r now

步骤 3:创建 namespace, 默认为 fsdax 模式

$ ndctl create-namespace (When running the command once, one PMem will be generated)

步骤 4:设备格式化

$ mkfs.ext4 /dev/pmem0

$ mkfs.ext4 /dev/pmem1

步骤 5:挂载设备

$ mount -o dax /dev/pmem0 /mnt/pmem0

$ mount -o dax /dev/pmem1 /mnt/pmem1

 

RocksDB fsdax

图 4 fsdax

KMEM DAX

KMEM DAX 支持 Linux 内核 5.1 及以上版本。KMEM DAX 补丁还可以移植到内核的以往版本中。不过这需要额外的配置。可以直接使用较新的内核以能够快速支持 KMEM DAX 的这个特性。检查系统是否支持 KMEM DAX 的步骤如下所示。如果系统不支持,您可以升级内核,或使用 KMEM DAX 内核补丁,并将其添加至现有内核中。

$ cat /boot/config-5.4.32 | grep KMEM

RocksDB KMEM DAX

图 5 内核可支持 KMEM DAX 功能

以下为创建 KMEM DEX 的步骤:

步骤 1: 创建目标

$ ipmctl create -f -goal persistentmemorytype=appdirect

步骤 2:重启服务器

$ shutdown -r now

步骤 3: 创建 namespace 为 devdax 模式

$ ndctl create-namespace --mode=devdax --map=mem -r 0

步骤 4:设置 NUMA node

$ daxctl reconfigure-device dax0.0 --mode=system-ram

NUMA 节点

图 6 在 KMEM DAX 中创建 NUMA 节点

注 1dax_pmem_compat 如果存在,则会在 modprobe 中禁用。已部署 dax_pmem 模块,以便将其转化为 /sys/bus/dax 模型,v5.1 之前的内核版本可能不支持该模型。在此情况下,如果内核尚未更新,该命令会返回 “nop”,/sys/class/dax 会更改为 /sys/bus/dax,因为它启用了设备 DAX 实例的备用驱动程序,尤其是 dax_kmem 驱动程序。然后重启系统,让配置生效。请参阅 ndctl 和 daxctl 的相关文档

如果 dax_pmem_core 不是 dax_pmem,可以通过以下命令进行转换:

$ daxctl migrate-device-model

 

注 2:仅在新创建的节点离线之后才能移除命名空间。

$ daxctl offline-memory dax0.0

 

内存配置/设置

内存通道至少要有 1 条 DIMM DRAM 和 1 条 DIMM 持久性内存。参考 2.2。

存储/磁盘配置/设置

没有特别配置要求。

网络配置

由于在 Redis 的应用场景中性能通常受限于网络的带宽而不是在内存和持久内存的性能,所以跨网络运行 Redis 要求网卡的带宽越大越好,建议在 10GB/s 以上。

软件调优

软件配置的调优是必不可少的。从操作系统到 RocksDB 的配置设置,许多都是为通用的应用而设计的,默认设置需要调整从而达到最佳性能。

Linux Kernel 优化配置

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

RocksDB 架构

RocksDB 是基于 LSM-Tree 算法实现的,对硬盘和固态硬盘友好的应用软件。

RocksDB 写流程:每次插入和更新都首先附加到 WAL,然后插入 Memtable 进行排序。如果 Memtable 已满,它将被转换为不可变 Memtable,并且数据将作为 SST 文件在后台刷新到 0 级。类似的,当一个级别已满,后端会触发“合并”,将 SST 文件中的数据与键范围重叠的更高级别的 SST 文件合并。合并的数据将采用新的 SST 文件,并将其写入更高级别,同时失效的数据将被丢弃。由于更高的级别比低级别大 10 倍,合并会导致严重的写入放大,并占用大量的存储带宽。这是 LSM 树的主要性能问题。

读取操作从 Memtable 搜索开始。然后,会在 SST 文件中执行逐级搜索,直至发现块数据。如果块数据已位于块高速缓存中,那么数据会直接从高速缓存中读取(缓存命中)。否则,数据将从 SST 文件加载到块高速缓存并进行读取(缓存未命中)。块数据是读取操作的 I/O 最小单位,通常会大于键值对。因此,会出现一定程度的读取放大。

 

RocksDB 调优

RocksDB 编译

编译环境

安装 g++,确保 g++ 版本足够新。

yum install gcc48-c++

依赖库

  • gflags
git clone https://github.com/gflags/gflags.gitcheckout v2.0  

cd gflags

./configure && make && make install

gflags 的版本更新需要 cmake 进行编译:

mkdir build

cmake ..

make&&make install
  • snappy
yum install snappy snappy-devel
  • zlib
yum install zlib zlib-devel
  • bzip2
yum install bzip2 bzip2-devel
  • lz4
yum install lz4-devel
  • zstandard:
wget https://github.com/facebook/zstd/archive/v1.1.3.tar.gz

mv v1.1.3.tar.gz zstd-1.1.3.tar.gzzxvf zstd-1.1.3.tar.gz

cd zstd-1.1.3

make && make install
  • memkind

memkind v1.10.0 或以上版本是建立 block cache 分配器所必需的。关于 memkind 的更多信息,请参阅 GitHub memkind 主页

yum --enablerepo=PowerTools install memkind-devel

RocksDB 编译

克隆 RocksDB

git clone https://github.com/facebook/rocksdb.git

编译静态库,发行模式,并获取 librocksdb.a

make static_lib

编译动态库,获取 librocksdb.so,发行模式,并获取 lbrocksdb.so

make shared_lib

在持久内存中优化 RocksDB

AD 上的存储

持久内存的 App Direct 模式可支持直接从应用程序中读取和写入文件。因此,SST 文件可直接存储到持久内存中。操作系统的默认 IO 模式是缓存 IO(页面缓存)。在内核 4.19 以上版本支持持久内存感知文件系统。这可以支持文件系统使用 I/O 子系统的块设备驱动程序,或直接将持久内存用于绕过 I/O 子系统的字节可寻址负载/存储内存。这是持久内存中最快、最简短的数据访问方式。此方法不需要 I/O 操作,支持以更快的速度写入少量数据,从而实现比传统块设备更高的性能。传统上,块存储设备需要文件系统来访问设备的原始块大小,并更改数据库,然后才能将整个数据块写回设备。

RocksDB 存储 1

基于以上原理,将 Rocksdb 的数据文件直接放在持久内存上会直接获得收益。如下图所示,只需要将 db 和 WAL 路径指向持久内存即可,无需修改代码。

RocksDB 存储 2

Rocksdb 为了提高读性能设置了 block cache。同时,可以设置 Direct I/O 来直接存储设备而不使用系统的 page cache。如果 Block Cache 中可以检索到想要的数据,即称之为 "cache hit"。否则,会触发 "cache miss"。因此,block cache 的 hit rate 对读性能有很大的影响。

RocksDB 写优化

利用 PMDK 库的函数,还可以对 RocksDB 在持久内存上性能进行深度优化.

WAL

RocksDB 中的每个更新操作都会写到两个地方:

  1. 一个内存数据结构,名为 memtable (后面会被刷盘到 SST 文件)。
  2. 写到磁盘上的 WAL 日志。在出现崩溃的时候,WAL 日志可以用于完整的恢复 memtable 中的数据,以保证数据库能恢复到原来的状态。

在默认配置中,RocksDB 通过每次写入操作后在 WAL 调用 fflush 来保证一致性。

使用持久内存时,可使用 mmap 函数来映射 WAL 文件到相应的虚拟内存空间,以便进行读写,并使用 NT-Store 命令来提高写入效率。

RocksDB WAL

KVS

Key-value separate (KVS) 方案可以有效改善 RocksDB 后台 compaction 所产生的开销。在 KVS 解决方案中,SST 文件构成键值数据结构,其值存储为指向驻留在持久内存中的实际值数据的指针。因此,过程中,原先需要合并以及重新写入大量的值,现在仅需要对指针进行操作。

针对 KVS,在 RocksDB 中,大数据存储在持久内中,并使用 libpmemobj 库作为 PMDK 的一部分。使用了以下功能:

  • pmemobj_create:用于创建池空间,以便在持久内存中存储值
  • pmem_memcpy_persist:用于将数据复制并刷新到持久内存中
  • pmemobj_free:用于释放池空间

KVS 解决方案,对于产生大量写入和压缩操作,以及较大 value 的应用场景很有收益。折衷是读取性能不佳。

RocksDB 读优化

分层

在部分客户端应用程序中,整体的数据集可能会很大。因此,RocksDB 中低级别的数据可存储在持久内存中,高级别的数据可存储在非易失性内存主机控制器接口规范* (NVMe*) 上。这种优化方案的好处是,级别较低的数据通常都是较新和较热的数据,利用持久内存自身性能比 SSD 高的优势,整体提升 RocksDB 的性能。同时,也为用户提供了一种冷数据使用低成本介质存储的方案。

RocksDB 分层

动态 LRU

在上一节提到的分层方案的基础上,还可以利用改变 block cache 中LRU队列中数据的优先级来提高缓存命中率。正如本文中所述,持久内存的数据访问比固态硬盘相对更快。因此,当固态硬盘中存在块高速存储未命中时,该数据需从固态硬盘的数据文件中读取,这会降低整体性能。

RocksDB 动态

因此,可以对 LRU 的中加载的 cache 数据进行调整。其原理为将最热的 Meta block 的优先级设置为最高,SSD 中数据的优先级其次,持久内存中数据的优先级最低。这样做的好处是提高了 SSD 中数据的缓存命中率。更多信息请参阅 GitHub pmem-rocksdb 主页。

细粒度

传统文件系统采用 4k 的块大小进行去屑,而字节可寻址配置则在持久内存中提供。因此,较小的块大小和 mmap 可用于改进读取性能。这种方案减少了读放大,同时绕过了 block cache。而 index 元数据可以从持久内存移到 DRAM 中。

RocksDB 细粒度

通过测试,设备为一台配置英特尔至强 8269C CPU 的服务器(24 个内核,64GB 内存,4 个交错 128G AEP 设备),所有测试都在单个处理器上运行。使用 RocksDB 的默认基准测试工具 DBBench 进行读写性能测试。在定长 16 字节的随机 Key 分布下发出读写请求,使用 128、512 和 1024 字节的不同值大小。 采用 16 个线程用于后台 compaction,并设置了 8 个子 compaction 线程(在 level 0 并发 compaction),以避免在 level 0写停滞。 其他配置为 DBBench 的默认值。由于不需要块高速缓存,因此与 NVMe 固态硬盘相比,读取性能提升速度提升了很多倍。这也大大节省了 DRAM 的使用量。

持久内存上的块高速缓存

BlockCache 默认是在 DRAM 上分配的。可使用 PR #6214 引入的 MemkindKmemAllocator 在持久内存上分配块高速缓存,从 v6.10 开始便已合并到 RocksDB 中。将 Block Cache 放在持久内存上将可以配置分配更大的缓存(最大可达 TB),这对于大工作集的应用很有用。持久内存工作在易失性模式,而且缓存在重新启动时不具有持久性(与 DRAM 上的 Block Cache 的行为相同)。

该分配器希望持久内存被设置为 KMEM DAX 模式,并且它在内部使用 memkind 库进行分配。版本 1.10.0 的 memkind 库需要对 KMEM DAX 的支持。在创建 LRU 缓存时,需要指定分配器(如果没有指定分配器,将使用默认的 DRAM 分配器)。

#include "rocksdb/cache.h"

#include "memory/memkind_kmem_allocator.h"

NewLRUCache(

capacity /*size_t*/,

6 /*cache_numshardbits*/,

false /*strict_capacity_limit*/,

false /*cache_high_pri_pool_ratio*/,

std::make_shared<MemkindKmemAllocator>());

PlainTable 优化

PlainTable 是一个 RocksDB SST 文件格式,针对低延迟纯内存或者非常低延迟的媒介进行了优化优势:

优势:

  • 一个内存中的索引会被建立,使用二分法 + 哈希的方法替代直接二分查找
  • 绕过快缓存,来避免块拷贝和 LRU 缓存机制带来的浪费
  • 查询的时候避免任何内存拷贝(mmap) 限制:

局限:

  • 文件大小需要小于 31bits 整形
  • 数据压缩不支持
  • delta 编码不支持
  • 不支持 Iterator.Prev()
  • 无前缀 Seek 不支持
  • 加载表比构建索引慢
  • 只支持 mmap 模式

PlainTable 的共同特征使其非常适合持久存储。PlainTable 使用 mmap(内存映射文件)来避免页面缓存,并避免将上下文切换到内核中。在此解决方案中,libpmem 用于优化 io_posix.c 文件中的正态表。pmem_memcpy_nodrain 用于优化写入和刷新性能。基于非临时 (NT) 写入指令集的 pmem_memcpy_nodrain 可以绕过高速缓存,而不是刷新它。更多信息请参阅 GitHub pmem-rocksdb 主页。

RocksDB 普通表

RocksDB 引擎

Kvrocks*

kvrocks 是一个开源键值数据库。它基于 rocksdb 并与 Redis 协议兼容。与 Redis 相比,旨在降低内存成本并提高功能。复制和存储功能的设计收到 rocksplicatorblackwidow 的启发,kvrocks 包括以下主要功能:

  • Redis 协议,用户可以使用 Redis 客户端访问 kvrocks
  • 命名空间,类似于redis db,但每个命名空间使用令牌
  • 复制:使用 MySQL 等 binlog 进行异步复制
  • 高可用性,当主服务器或从服务器发生故障时,支持 redis 前哨进行故障转移
  • Codis 协议,用户可以使用 codis 代理和仪表板来管理 kvrock

Kvrocks 基础性能

kvrocks 下的各种场景的基础性能作为参考

  • NVMe:使用 NVMe SSD 作为数据存储设备
  • 持久内存:使用持久内存作为数据存设备
  • Ramfs:使用内存文件系统作为数据存储设备
  • dummy: 在读写函数中,将 RocksDB engine 置空,测量上层结构的性能

通常,NVMe SSD 的性能最低,ramfs 的性能比持久内存和 NVMe SSD 要高一倍左右,dummy 的性能是 NVMe SSD 和持久内存的多倍。通过 dummy 的观察,可以知道性能优化的瓶颈在哪里。

kvrocks 写入性能

WAL mmap 优化

通过 WAL mmap 优化后,持久内存上的写性能比 NVMe SSD 高出两倍左右。用户也可以通过火焰图分析看到 WAL 优化后, 减轻了写入的压力。

KVM 优化方案

KVM 的结果可以看出,对于大值有明显的效果。延迟降低很多,且非常平坦。因此,KVM 适合于值较大的场景。

Kvrocks 读取性能

Fine Grained 优化方案

Fine Graine 方案将 block size 设置为 256 Byte,这个数值正是第 1 代和第 2 代持久内存对介质写入的粒度。相对于原先的 4k,读取性能分别有多倍提升。

相关工具

性能监控工具 - PCM

PCM(处理器计数器监视器) 可用于监控英特尔 CPU 内核的性能指标。PCM 常用于监控持久内存的带宽。

$ pcm-memory.x -pmm

总结

RocksDB 与英特尔傲腾持久内存结合使用是一种非常实用的应用方式。英特尔傲腾持久内存的大容量存储支持业务使用 RocksDB 更大的数据集,通过优化,能得到非常好的性能。

意见反馈

我们非常重视您的反馈。如果您对本指南有任何意见和建议(正面或负面),或正在查找本指南未包含的内容,请与我们联系。

 


通知和免责声明

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

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

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

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

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

© 英特尔公司。英特尔、英特尔标志和其他英特尔标识是英特尔公司或其子公司的商标。文中涉及的其它名称及商标属于各自所有者资产。

产品和性能信息

1

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