qdrant适配鲲鹏920麒麟系统


qdrant适配鲲鹏920麒麟系统

项目中遇到的一个qdrant适配兼容的问题的解决办法,记录一下

遇到的问题

项目组反馈在信创环境中部署大模型产品时遇到: Unsupported system page size问题

系统环境为:

硬件:Kunpeng920

系统:Kylin-4.19.88

PAGE_SIZE为65535

79d86edfdf02370e4ccd075bf3b518ca

搜搜Issues,问题还是挺多的,但大多都是建议自己加JEMALLOC_SYS_WITH_LG_SIZE=16来解决。

https://github.com/qdrant/qdrant/pull/7370

image-20251014114101937

自己动手丰衣足食

了解完问题后,开始着手编译,然而新的问题又来了,项目环境不能联网,我.........

那就在X86下搞吧,首先是环境准备,在X86上编译ARM64下的rust包,想想都懵逼,rust只是听过,没咋用

咋办,上AI大法,哈

先说踩过的屎坑,没经验还是吃过不少亏的,首先默认AI会直接给你用GNU的gcc,结果就是在4.19内核下找不到GLIBC,嘿嘿

rust的构建参数都是build.rs动态生成的,想要在里头自己加,别人不知道,反正我是懵逼的,没辙,生啃吧,

也试过docker下构建,但感觉比本地还麻烦,主要是对messense/rust-musl-cross这个玩意不熟,各类的编译问题,还是环境设置的问题,在docker下设置里头环境的配置,想想还是算了,继续折腾本地。

环境准备:

系统:Ubuntu22.04

musl相关依赖

git clone https://github.com/richfelker/musl-cross-make.git

config.mak

1
2
3
4
5
TARGET = aarch64-linux-musl

OUTPUT = /usr/local

JOBS = $(nproc)

make -j$(nproc)

make install

image-20251017090250920

Qdrant构架脚本(本地构建)

如下:

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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#!/usr/bin/env bash
set -e

# ============================================
# 🚧 Qdrant ARM64 交叉编译脚本(Ubuntu 22.04)
# 作者: ChatGPT (GPT-5)
# 功能: 在 x86_64 主机上构建适用于 ARM64 (aarch64) 的 Qdrant 可执行文件
# ============================================

TARGET="aarch64-unknown-linux-musl"
OUTPUT_DIR="target/${TARGET}/release"
QDRANT_BIN="${OUTPUT_DIR}/qdrant"

echo "==========================================="
echo "🚀 Qdrant ARM64 交叉编译启动"
echo "👉 目标架构: ${TARGET}"
echo "👉 系统环境: $(lsb_release -ds) / $(uname -m)"
echo "==========================================="

# --------------------------------------------
# [1/6] 安装依赖
# --------------------------------------------
echo "📦 [1/6] 安装交叉编译工具链与依赖..."
sudo apt update
sudo apt install -y \
build-essential curl git pkg-config cmake clang \
gcc-aarch64-linux-gnu g++-aarch64-linux-gnu \
libssl-dev libclang-dev

# --------------------------------------------
# [2/6] 确保 Rust 环境
# --------------------------------------------
if ! command -v rustup >/dev/null 2>&1; then
echo "🦀 安装 rustup..."
curl https://sh.rustup.rs -sSf | sh -s -- -y
source "$HOME/.cargo/env"
fi

echo "🦀 Rust 版本:"
rustc --version
cargo --version

echo "📡 添加 ARM64 目标..."
rustup target add ${TARGET}

# --------------------------------------------
# [3/6] 设置交叉编译环境变量
# --------------------------------------------
echo "⚙️ [3/6] 设置交叉编译环境变量..."
export CC_aarch64_unknown_linux_musl=aarch64-linux-musl-gcc
export CXX_aarch64_unknown_linux_musl=aarch64-linux-musl-g++
export AR_aarch64_unknown_linux_musl=aarch64-linux-musl-ar
export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_LINKER=aarch64-linux-musl-gcc

# RocksDB 在新 GCC 下需要强制 include <cstdint>
export JEMALLOC_SYS_WITH_LG_PAGE=16
export CXXFLAGS="-std=c++17 -include cstdint"
export LDFLAGS="-Wl,-z,max-page-size=0x10000"

# --------------------------------------------
# [4/6] 开始构建 Qdrant
# --------------------------------------------
echo "🛠️ [4/6] 开始交叉编译 Qdrant..."
cargo build --release --target ${TARGET}

# --------------------------------------------
# [5/6] 验证结果
# --------------------------------------------
echo "🔍 [5/6] 验证编译产物架构..."
file "${QDRANT_BIN}"

# --------------------------------------------
# [6/6] 总结输出
# --------------------------------------------
echo ""
echo "✅ 编译完成!"
echo "📦 可执行文件路径: ${QDRANT_BIN}"
echo ""
echo "你可以将文件复制到 ARM 设备运行,例如:"
echo "scp ${QDRANT_BIN} user@arm-device:/usr/local/bin/qdrant"
echo "ssh user@arm-device '/usr/local/bin/qdrant --version'"
echo ""
echo "✨ 编译过程结束。"
echo "==========================================="

Docker镜像构建

官方其实也提供了dockerfile,根据内容可以直接修改Dockerfile中修改对应配置进行docker镜像构建

当前的版本是1.15.5, 大概是115行左右,如图

image-20251017090509176
1
2
3
4
5
docker buildx build \
--platform linux/arm64 \
-t qdrant-arm64:jemalloc16 \
. \
--load