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
|