开发者
资源
基于鲲鹏服务器的InfluxDB数据库调优参考实践

基于鲲鹏服务器的InfluxDB数据库调优参考实践

鲲鹏处理器数据库influxDB计算商业SMECE

发表于 2026/06/30

0

1 非商用声明

该文档提供的内容为参考实践,仅供用户参考使用,可参考实践文档构建自己的软件,按需进行安全、可靠性加固。

2 方案概述

2.1 背景

鲲鹏920新型号服务器是华为新一代高性能服务器,相比鲲鹏920服务器,它支持开启超线程,通过开启超线程模式,可以虚拟出两倍物理核的CPU,拥有更高的并发性能。

InfluxDB是一款开源、高性能的时序数据库 (TSDB),专为海量带时间戳的数据高效读写、压缩存储和实时分析而设计,它广泛应用于物联网、工业状态监测、应用指标监测等领域,支持高并发写入和快速类SQL查询。

在新能源集控系统中InfluxDB作为在线分析中关键数据库,用于传感数据的实时采集与实时监测,本文则针对鲲鹏920新型号开展InfluxDB数据库的调优。

2.2 方案简介

本参考实践以鲲鹏920新型号为计算底座,主要适用于influxDB数据库在鲲鹏平台上的性能调优,为电力等解决方案场景提供influxDB数据库调优参考实践。

本参考实践部署方案是部署在虚拟机里,再在虚机里起一个influxDB容器,涉及到的软硬件信息如下表所示:

表1 软硬件信息

类别名称
CPU型号Kunpeng 920 7270Z 64C@2.9GHz
虚拟机配置8C8G
虚拟机操作系统openEuler 22.03 LTS SP4
InfluxDB版本2.8.0
Go编译器版本1.24.6

3 调优参考实践

本章按照系统优化、编译优化、BIOS优化的顺序展开。其中,系统侧优化(如绑核、GC等)通常只需调整运行环境与启动参数;编译优化(如Go for openEuler、PGO等)需要重新编译二进制包;BIOS优化(如SMT超线程、CPU高性能模式、CPU预取、内存刷新策略等)则需要重启服务器。

表1 调优手段总览

序号归类调优手段说明
1系统优化绑核与NUMA亲和将进程与内存约束在同一NUMA或同一socket,减少跨NUMA访问内存;鲲鹏多NUMA场景下可优先验证。
2GOGC在GC所占CPU资源与堆占用之间权衡,进程级环境变量注入即可。
3编译优化Go for openEuler编译优化使用Go for openEuler针对鲲鹏的编译优化项,提升Go应用程序性能。
4PGO反馈编译优化基于代表性负载的profile做反馈编译,针对热点函数优化。
5BIOS优化SMT超线程每个物理核分为两个逻辑核,提升整机性能。
6CPU高性能模式设置CPU运行固定运行在标称频率,无动态调频,最大化CPU性能。
7CPU预取使能硬件预取功能,提升内存访问效率
8内存刷新策略设置内存刷新策略为Auto,由系统自动管理内存刷新周期,在保障内存数据可靠性前提下,实现性能最优。

3.1 系统优化

3.1.1 绑核与NUMA亲和

1. 优化思路

NUMA架构下,处理器访问本地内存快于访问远端节点内存,跨NUMA会带来额外延迟与调度开销。鲲鹏服务器常见多socket/多NUMA,若InfluxDB进程在不同NUMA间迁移,易出现跨访问内存、缓存失效与尾延迟抖动等现象。

亲和性(Affinity)是进程要在某个给定的CPU上尽量长时间地运行而不被迁移到其他处理器的倾向性。在多核运行的机器上,每个核本身自己会有缓存,缓存着进程使用的信息,而进程可能会被OS调度到其他核上,CPU Cache命中率就低了,当绑定核后,程序就会一直在指定的核跑,不会由操作系统调度到其他核上。这样能够大大提高CPU Cache的命中率,提高性能。

绑核的原则是优先将进程使用的CPU约束在同一NUMA;若所需核数超过单个NUMA,则尽量约束在同一颗CPU(同一socket)上。虚拟化场景下,还可结合平台的CPU独占、vNUMA/NUMA调度等能力,使vCPU与本地内存对齐。

2. 优化示例

步骤1 查看NUMA拓扑与CPU编号

需先安装工具:

yum install numactl

执行以下命令查看NUMA拓扑:

numactl --hardware

如下所示代表NUMA node0对应的cpu编号是0-63,CPU型号是7270Z(开启超线程),故一个NUMA有64个逻辑核:

node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63

步骤2 查看NUMA节点内存

实际应用场景需考虑业务应用需使用的内存,执行以下命令可查看不同NUMA节点的内存大小:

numactl --hardware

如下所示代表NUMA node0对应的内存大小是128461MB,其中空闲内存109524MB:

node 0 size: 128461 MB
node 0 free: 109524 MB

步骤3 绑核

以虚拟机绑核为例,我们将虚机绑定到16-23号cpu,内存使用8G,内存绑定到NUMA node0上,需在物理机上执行以下命令修改虚拟机配置:

virsh edit <vm_name>

配置示例如下:

<domain type='kvm'>
  <!-- ... 其他配置,如name,memory,vcpu等 ... -->
  <name>vm1</name>
  <memory unit='KiB'>8388608</memory>
  <currentMemory unit='KiB'>8388608</currentMemory>
  <vcpu placement='static'>8</vcpu>

  <!-- 1.CPU绑核 -->
  <cputune>
    <vcpupin vcpu='0' cpuset='16'/>
    <vcpupin vcpu='1' cpuset='17'/>
    <vcpupin vcpu='2' cpuset='18'/>
    <vcpupin vcpu='3' cpuset='19'/>
    <vcpupin vcpu='4' cpuset='20'/>
    <vcpupin vcpu='5' cpuset='21'/>
    <vcpupin vcpu='6' cpuset='22'/>
    <vcpupin vcpu='7' cpuset='23'/>
  </cputune>

  <!-- 2.内存绑定 -->
  <numatune>
    <memnode cellid='0' mode='strict' nodeset='0'/>
  </numatune>

  <!-- 3.CPU模式与虚拟NUMA拓扑 -->
  <cpu mode='host-passthrough' check='none'>
    <numa>
      <cell id='0' cpus='0-7' memory='8388608' unit='KiB'/>
    </numa>
  </cpu>

  <!-- ... 其他配置,如devices等 ... -->
</domain>

修改成功后,需执行以下命令重启虚拟机使得配置生效:

virsh shutdown <vm_name>
virsh start <vm_name>

其他场景的绑核指导可参考基于容器CPU绑核与虚机QoS控制的参考实践,保障关键业务性能和稳定性-技术干货-鲲鹏社区

3.1.2 GOGC优化

1. 优化思路

通过调整Go垃圾回收触发阈值,在GC所占CPU与堆内存占用之间权衡。InfluxDB堆内对象多与时间序列缓冲、索引、缓存相关,GOGC对长时间运行影响明显。Go默认GOGC=100。

2. 优化示例

以服务环境变量注入,避免改代码。

export GOGC=150

调整方向可参考以下,需结合服务器内存使用进行配置:

表1 GOGC参数优化建议

取向GOGC 大致调整可能效果
延迟敏感、内存充裕上调(如 150~200)GC次数减少,CPU中GC占比下降;峰值堆内存可能升高。
内存紧张、可接受更高CPU占用下调(如 50~100)GC更频繁触发,峰值堆内存显著降低;总CPU使用率可能上升,但内存使用更紧凑。

3.2 编译优化

3.2.1 Go for openEuler编译优化

1. 优化思路

毕昇编译器是华为编译器实验室针对鲲鹏处理器架构打造的高性能编译器工具链。它具备高可信、易扩展的特点,并增强了多种编译优化技术,已支持Go语言。

2. 优化示例

步骤1 获取并编译Go for openEuler工具链。

编译前需安装相关依赖:

yum install git golang make -y

安装go1.24.6,可参考以下方式安装:

yum install wget tar -y
wget https://mirrors.aliyun.com/golang/go1.24.6.linux-arm64.tar.gz --no-check-certificate
tar -C /usr/local -xzf go1.24.6.linux-arm64.tar.gz
export GOROOT=/usr/local/go
export PATH=$GOROOT/bin:$PATH

编译Go for openEuler:

# 获取源码 
git clone https://gitcode.com/openeuler/golang.git -b go1.24.6
# 编译Go for openEuler工具链
cd golang/src
./make.bash

步骤2 在编译influxDB程序时加载Go for openEuler,并使能相关的编译器配置选项。

# 需修改为Go for openEuler工具链的安装位置
export GOROOT=path/to/bisheng/gc/golang
export PATH=$PATH:$(go env GOPATH)/bin
export PATH=$GOROOT/bin:$PATH

export GOARM64=v8.2,intrinsicmatchh2,abiinternal
export GOEXPERIMENT=stepopt,atomicvar,revertcopyhashkeys,pageshift14,prefetchmalloc,clearspan,widetrie,reflectrwlock
export GCFLAGS="all=-aggressivedse -aggressivelooprotate -aggressivepatterns -aggressiveprove -ccmp_gen -bytesstringbytesopt -d forceinline=1 -d aarch64ldst=all -d blockpredict=2"
export LDFLAGS="all=-checklinkname=0 -w -funcalign=32"

优化项配置说明如下,具体的优化配置也可参考Go for openEuler优化项详情

表1 Go for openEuler优化项配置说明

环境变量包含优化项描述
GOARM64=v8.2,intrinsicmatchh2,abiinternalhashmap哈希匹配假阳性消除优化、bytealg汇编函数切换消除hashmap短哈希快速匹配时的假阳性现象;将bytealg汇编由ABI0切换为ABIInternal约定
GOEXPERIMENT=stepopt,atomicvar,revertcopyhashkeys,pageshift14,prefetchmalloc,clearspan,widetrie,reflectrwlockstep函数优化、atomic优化、禁用复制哈希值、pagesize优化、内存prefetch优化、span初始化清零、hashtriemap优化、reflect读锁快速路径优化step函数实现;使用atomic替换dmb指令;回退性能劣化提交;扩大堆页大小;mallocgc增加prefetch操作;span首次使用整体清零;降低trie树层高,减少子节点访问;锁优化
GCFLAGS="all=-aggressivedse -aggressivelooprotate -aggressivepatterns -aggressiveprove -ccmp_gen -bytesstringbytesopt -d forceinline=1 -d aarch64ldst=all -d blockpredict=2"DSE优化增强、LoopRotate优化增强、SSA比较指令模式优化、Prove优化增强、条件比较指令优化、forceinline优化、ARM64 LDR/STR指令优化、基本块分支预测重排增强死代码消除(指针偏移、store后load等场景);调整基本块顺序减少跳转;SSA模式匹配优化;消除边界检查;嵌套条件分支转CCMP/CCMN指令;强制内联mallocgc子函数;LDP/STP替换LDR/STR;基本块按分支属性重排
LDFLAGS="all=-checklinkname=0 -w -funcalign=32"函数对齐优化关闭链接名检查、去除DWARF调试信息、函数入口32字节对齐,提升指令缓存命中率

步骤3 使用Go for openEuler构建 InfluxDB v2.8.0。详细依赖与前置条件见官方说明:Building from source(v2.8.0 CONTRIBUTING)

安装依赖:

yum install -y protobuf-compiler pkg-config clang protobuf-devel

安装rust:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source "$HOME/.cargo/env"

编译:

git clone --depth 1 --branch v2.8.0 https://github.com/influxdata/influxdb.git 
cd influxdb 
# Go for openEuler的版本是1.24.6,故此处需替换
sed -i 's/^go 1\.24\.0$/go 1.24.6/' go.mod
sed -i 's/^toolchain go1\.24\.9$/toolchain go1.24.6/' go.mod
go env -w GOPROXY=https://goproxy.cn,direct
go mod tidy
make

编译成功后influxDB二进制包位于bin/linux/influxd目录下。

若编译过程遇到x509证书认证报错,可参考以下镜像证书配置:

cp your_crt.crt /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust extract

3.2.2 PGO反馈编译优化

1. 优化思路

PGO(Profile-Guided Optimization)是一种编译器优化技术。它通过在程序运行时收集性能数据,并在编译阶段使用这些数据来优化程序的性能。PGO需要两次编译过程,第一次编译时在应用代码中插桩,通过运行典型用例和业务,收集应用代码中函数及分支的执行次数信息,第二次编译时根据运行统计信息进一步优化,生成高性能应用。

2. 优化示例

如下是influxDB进行反馈编译的优化流程图:

步骤1 在应用代码中插桩。

# 进入到influxDB源码目录
cd influxdb
# 修改编译源码,增加插桩代码
vim ./cmd/influxd/main.go

插入采集接口,及分别在import和func main()中的最前面添加以下内容:

import (
	"net/http"
	_ "net/http/pprof"
)

func main() {
	http.ListenAndServe(":8000", nil)
}

修改好源码后,使用Go for openEuler进行源码编译,编译命令如下:

make

编译成功后influxDB二进制包位于bin/linux/influxd目录下。

步骤2 在业务负载稳定阶段采集CPU profile。

使用编译好的包进行部署,并进行压测,在业务负载稳定时采集性能数据:

curl -o /tmp/influxdb-cpu.pprof "http://localhost:8000/debug/pprof/profile?seconds=30"

步骤3 根据采集到的profile数据进行反馈优化。

# 进入到influxDB源码目录
cd influxdb
# 修改编译源码,增加编译代码
vim ./GNUmakefile

在编译参数export GO_BUILD=env GO111MODULE=on go build $(GO_BUILD_ARGS) -ldflags "$(LDFLAGS)"中增加pgo选项,如下所示:

-pgo=/tmp/influxdb-cpu.pprof

修改好源码后,使用Go for openEuler重新进行源码编译,此时可去除步骤1中的插桩代码,编译命令如下:

make

编译成功后influxDB二进制包位于bin/linux/influxd目录下。

3.3 BIOS优化

3.3.1 SMT超线程

1. 优化思路

开启SMT超线程,每个物理核分为两个逻辑核,提升整机性能。

注意:该调优项仅适用于鲲鹏920新型号服务器,对于其他鲲鹏服务器暂不支持该配置。

2. 优化示例

1)服务器重启,进入BIOS,依次选择“BIOS->Advanced->Power And Performance Configuration->CPU PM Control”。

2)设置“SMT2”选项为“Enabled”,按F10保存BIOS配置。

3.3.2 CPU高性能模式

1. 优化思路

CPU性能模式通常指将CPU频率固定在最高值,以最大化其性能的设置,开启CPU性能模式,无动态调频,固定在标称频率,可以提升事务处理性能。

说明:Power Policy会受Performance Profile联动配置的影响,即Performance Profile配置后,可能导致Power Policy发生变化,但支持手动修改,配置BIOS时注意保存前检查配置是否符合预期。

2. 优化示例

1)服务器重启,进入BIOS,依次选择“BIOS->Advanced->Power And Performance Configuration”。

2)设置“Power Policy”选项为“Performance”,按F10保存BIOS配置。

3.3.3 CPU预取

1. 优化思路

CPU将内存中的数据读到CPU的高速缓存时,会根据局部性原理,除了读取本次要访问的数据,还会预取本次数据的周边数据到Cache中,如果预取的数据是下次要访问的数据,那么性能会提升,如果预取的数据不是下次要访问的数据,那么会浪费内存带宽。

对于数据比较集中的场景,预取的命中率高,适合打开CPU预取,反之对于数据不集中的场景则需要关闭CPU预取。

2. 优化示例

1)服务器重启,进入BIOS,依次选择“BIOS->Advanced->Power And Performance Configuration->CPU PM Control”。

2)设置CPU Prefetching为Enabled。

3.3.4 内存刷新策略

1. 优化思路

DRAM存储器内部使用电容来存储数据,由于电容有漏电现象,经过一段时间电荷会泄放,导致数据不能长时间存储。因此需要不断充电,这个充电的动作叫做刷新。自动刷新是以“行”为单位进行刷新,刷新操作与读写访问无法同时进行,即刷新时会对内存的性能造成影响。同时温度越高电容泄放越快,器件手册通常要求芯片表面温度在0℃~85℃时,内存需要按照64ms的周期刷新数据,在85℃~95℃时,按照32ms的周期刷新数据。

BIOS中内存刷新速率选项提供了Auto选项,可以根据工作温度自动调节内存刷新速率。相比默认的32ms配置,该选项可以提升内存性能,同时确保工作温度在85℃~95℃时内存数据的可靠性。

2. 优化示例

1)服务器重启,进入BIOS,依次选择“BIOS->Advanced->Memory Configuration”。

2)设置Custom Refresh Rate为Auto。

本页内容