在国产ARM64环境下从源码编译Greptime DB及构建Docker镜像实践

背景

在国产化环境(KylinOS V10 SP2 + Kunpeng 920)部署 GreptimeDB 0.17.2 时,遇到了 jemalloc 内存分配错误:

复制代码
greptime            | <jemalloc>: Unsupported system page size
greptime            | <jemalloc>: Unsupported system page size
greptime            | <jemalloc>: Unsupported system page size
greptime            | memory allocation of 16 bytes failed

这个问题本质上是 ARM64 架构下内存页大小与默认 jemalloc 配置不匹配导致的。解决方案是从源码重新编译 Greptime DB 并构建适配的 Docker 镜像。

环境准备

1. Rust 环境配置

首先需要配置 Rust 工具链,使用国内镜像加速:

shell 复制代码
echo 'export RUSTUP_UPDATE_ROOT=https://mirrors.aliyun.com/rustup/rustup' >> ~/.bashrc
echo 'export RUSTUP_DIST_SERVER=https://mirrors.aliyun.com/rustup' >> ~/.bashrc
source ~/.bashrc
# 安装 rust
curl --proto '=https' --tlsv1.2 -sSf https://mirrors.aliyun.com/repo/rust/rustup-init.sh | sh
source ~/.cargo/env

配置 Cargo 镜像源(~/.cargo/config.toml):

toml 复制代码
[source.crates-io]
replace-with = 'aliyun'
[source.aliyun]
registry = "sparse+https://mirrors.aliyun.com/crates.io-index/"
[net]
git-fetch-with-cli = true
[target.aarch64-unknown-linux-gnu]
linker = "clang"

2. 交叉编译工具链

shell 复制代码
# 临时切换为默认源,解决 loongarch64 下载问题
export RUSTUP_DIST_SERVER='https://static.rust-lang.org'
export RUSTUP_UPDATE_ROOT='https://static.rust-lang.org/rustup'
rustup toolchain install stable
rustup install nightly-2025-05-19
source ~/.bashrc
rustup target add aarch64-unknown-linux-gnu
cargo install cross
docker pull ghcr.io/cross-rs/aarch64-unknown-linux-gnu:main

编译 GreptimeDB

关键步骤是设置正确的 jemalloc 页大小参数:

shell 复制代码
export JEMALLOC_SYS_WITH_LG_PAGE=16
cross build --release -F dashboard --target=aarch64-unknown-linux-gnu

前一步骤完成之后,会生成cross-custom-greptimedb:aarch64-unknown-linux-gnu-3e5a9-pre-build镜像,后续的编译在这个镜像中完成。

如果编译过程有中断,可以使用以下命令继续编译。

shell 复制代码
/usr/bin/docker run --userns host \
  -e JEMALLOC_SYS_WITH_LG_PAGE \
  -e 'PKG_CONFIG_ALLOW_CROSS=1' \
  -e 'XARGO_HOME=/xargo' \
  -e 'CARGO_HOME=/cargo' \
  -e 'CARGO_TARGET_DIR=/target' \
  -e 'CROSS_RUNNER=' \
  -e TERM \
  -e 'USER=root' \
  -e 'GITHUB_PROXY_URL=https://gh-proxy.org/https://github.com/' \
  -e 'CARGO_BUILD_JOBS=2' \
  -e 'CARGO_INCREMENTAL=0' \
  --rm --user 0:0 \
  -v /root/.xargo:/xargo:z \
  -v /root/.cargo:/cargo:z \
  -v /cargo/bin \
  -v /mnt/d/code/rust/greptimedb:/project:z \
  -v /root/.rustup/toolchains/nightly-2025-05-19-x86_64-unknown-linux-gnu:/rust:z,ro \
  -v /mnt/d/code/rust/greptimedb/target:/target:z \
  -w /project -i -t \
  cross-custom-greptimedb:aarch64-unknown-linux-gnu-3e5a9-pre-build \
  sh -c 'PATH=$PATH:/rust/bin cargo build --release -F dashboard --target=aarch64-unknown-linux-gnu'

构建 Docker 镜像

创建 Dockerfile:

dockerfile 复制代码
FROM ubuntu:22.04
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get \
    -y install ca-certificates curl && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*
ADD greptime-0.17.2-linux-aarch64.tar.gz /
WORKDIR /greptime
ENV PATH /greptime/bin/:$PATH
ENV MALLOC_CONF="prof:true,prof_active:false"
ENTRYPOINT ["greptime"]

构建镜像:

shell 复制代码
docker build -t greptimedb:0.17.2-arm64 .

总结

在国产 ARM64 环境下部署 GreptimeDB 需要特别注意内存分配器的配置。通过从源码编译并设置正确的 jemalloc 参数,可以成功构建适配的 Docker 镜像。

相关推荐
哆啦A梦15886 小时前
Springboot整合MyBatis实现数据库操作
数据库·spring boot·mybatis
Zzzzmo_6 小时前
【MySQL】JDBC(含settings.xml文件配置/配置国内镜像以及pom.xml文件修改)
数据库·mysql
hjxu20166 小时前
【OpenClaw 龙虾养成笔记一】在远程服务器,使用Docker安装OpenClaw
服务器·笔记·docker
FirstFrost --sy7 小时前
MySQL内置函数
数据库·mysql
2401_879693877 小时前
将Python Web应用部署到服务器(Docker + Nginx)
jvm·数据库·python
reembarkation7 小时前
光标在a-select,鼠标已经移出,下拉框跟随页面滚动
java·数据库·sql
eggwyw7 小时前
MySQL-练习-数据汇总-CASE WHEN
数据库·mysql
星轨zb8 小时前
通过实际demo掌握SpringSecurity+MP中的基本框架搭建
数据库·spring boot·spring security·mp
treacle田8 小时前
达梦数据库-配置本地守护进程dmwatcher服务-记录总结
数据库·达梦数据库·达梦数据库local数据守护
wyt5314298 小时前
Redis的安装教程(Windows+Linux)【超详细】
linux·数据库·redis