Tendis 在银河麒麟 V10 SP3 + 鲲鹏 ARM64(QEMU 模拟)环境下的适配验证与性能评估
Tendis 在银河麒麟 V10 SP3 鲲鹏 ARM64QEMU 模拟适配与验证记录环境Windows Intel i5-13600K QEMU 全系统模拟 ARM64目标验证 Tendis 是否能够在银河麒麟 V10 SP3 SP3 鲲鹏 ARM64 环境离线部署运行结论可以编译、可以运行、可以通信但存在明显 ARM RocksDB 性能特征差异需要针对性调优一、项目背景最终部署目标环境银河麒麟高级服务器操作系统 V10 SP3 2403CPU鲲鹏 ARM64当前开发环境Windows 11Intel i5-13600KQEMU 全系统模拟 ARM64由于缺少真实鲲鹏物理机因此采用 QEMU 模拟整机环境进行前置验证确保编译链可用依赖可满足服务可启动基础功能可运行性能具备参考价值非最终值二、技术验证方案2.1 选型对比方案优点缺点Docker QEMU简单与真实系统差异较大QEMU 全系统 ARM64最接近真实环境性能偏差较大最终选择QEMU 全系统 ARM64 银河麒麟 V10 SP32.2 QEMU 启动环境关键启动参数qemu-system-aarch64.exe-Mvirt-cpucortex-a72-m8192-smp8-biosD:\Dev\Tools\qemu\share\edk2-aarch64-code.fd-driveifvirtio,fileD:\Dev\Env\kylin-arm64.qcow2,formatqcow2-cdromD:\Dev\Projects\ISO\Kylin-Server-V10-SP3-2403-Release-20240426-ARM64.iso-devicevirtio-gpu-pci-deviceqemu-xhci-deviceusb-kbd-deviceusb-mouse-nicuser,modelvirtio-net-pci,hostfwdtcp::2222-:22-nographic三、系统安装与基础环境3.1 系统信息查看架构uname-m输出aarch64查看系统版本cat/etc/os-release关键输出Kylin Linux Advanced Server V10(Halberd)3.2 网络问题修复初始状态网卡 disconnected无 IP修复操作nmcli connection up emp0s1恢复后 IP10.0.2.15验证网络连通性ping-c410.0.2.23.3 基础依赖安装安装编译及工具链依赖yuminstall-ygcc gcc-cmakecmakegitwgetcurltarunzipzipopenssl-devel zlib-devel四、第一个核心问题GCC 版本过低默认 GCC 版本gcc--versiongcc7.3.0问题Tendis 依赖 C17 特性GCC 7.3 对 C17 支持不完整编译会报错。解决方案手动安装 GCC 8.4 到 /usr/local/gcc-8.4并在 CMake 时显式指定编译器路径。cmake-DCMAKE_C_COMPILER/usr/local/gcc-8.4/bin/gcc-DCMAKE_CXX_COMPILER/usr/local/gcc-8.4/bin/g..注GCC 8.4 安装包需提前从可信源获取或通过源码编译安装离线环境可提前准备 RPM 包。五、源码编译问题修复记录5.1 submodule 未拉取源码中的第三方依赖如 RocksDB以 git submodule 形式管理克隆时需一并拉取gitsubmodule update--init--recursive5.2 C_STANDARD17 不兼容错误信息C_STANDARD issetto invalid value17原因CMake 版本较低不识别 C_STANDARD 17。修复将 CMakeLists.txt 中的标准改为 C11Tendis 实际可用 C11 编译。set(CMAKE_C_STANDARD11)5.3 缺少编译 ldb_tendis.cpp 时报错error:setwis not a member ofstderror:setfillis not a member ofstd修复在该文件头部添加 #include 。sed-i1i #include iomanip\src/tendisplus/tools/ldb_tendis.cpp5.4 ldb_tendis 链接失败错误undefined reference: rocksdb::Iterator该工具是辅助 CLI不影响 Tendis 服务主程序。若仅需服务端可单独编译 tendisplus 目标maketendisplus5.5 RocksDB patch 未应用编译时报错rocksdb/tendis_extension.h: No suchfileor directory原因Tendis 对 RocksDB 有定制补丁需先打补丁才能生成扩展头文件。修复步骤cdsrc/thirdparty/rocksdb/rocksdb patch-p1../../patch/0002-add-latency-statistic-log.patch打补丁后重新编译 RocksDB 和 Tendis。六、Tendis 服务启动验证使用默认配置文件启动$ ./build/bin/tendisplus tendisplus.conf报错因为目录不存在IO error: No suchfileor directory: Whilemkdirifmissing: ./home/db/catalog说明dir./home/dblogDir./home/logdumpdir./home/dump但 ./home/db 这个父目录不存在所以 RocksDB 创建 catalog 失败了。直接执行mkdir-p./home/dbmkdir-p./home/dumpmkdir-p./home/log然后确认ls-ld./home ./home/db ./home/dump ./home/log重新启动./build/bin/tendisplus tendisplus.conf然后立即执行ps-ef|greptendisplus启动成功。6.3 端口监听确认ss-lntp|grep51002输出示例LISTEN0128127.0.0.1:51002 *:* users:((tendisplus,pid1234,fd10))确认服务已成功监听在默认端口 51002。七、Redis 协议兼容性验证使用 Redis 客户端连接 Tendis 并执行 PING./src/redis-cli-h127.0.0.1-p51002ping报错无法执行二进制文件: 可执行文件格式错误基本只有一个原因❗ 这个 redis-cli 是 x86_64 编译的你现在是 ARM64鲲鹏确认 redis-cli 架构file./bin/redis-cli直接测协议Redis RESPtelnet127.0.0.151002然后输入ping或者更标准 RESP*1$4PING返回PONG编译ARM64 redis-clicd/rootwgethttps://download.redis.io/releases/redis-7.2.4.tar.gztar-xvfredis-7.2.4.tar.gzcdredis-7.2.4只编 redis-cli不用全量 Redismakeredis-climake-j$(nproc)redis-cliMALLOClibc检查是否是 ARM64filesrc/redis-cli输出ELF64-bit LSB executable, aarch64直接使用./src/redis-cli-h127.0.0.1-p51002ping八、性能测试确认 benchmark 工具./src/redis-benchmark--help如果有输出说明OK。报错因为刚才只编译了redis-cli重新全量编译make-j$(nproc)测试指标QPS (Queries Per Second)这些测试会输出 Redis 每秒能处理多少请求数值越高性能越好。通常单机 Redis 的 QPS 能达到 10 万左右。基础压测重点./src/redis-benchmark-h127.0.0.1-p51002-tset,get-n100000-c50用Redis/Tendis 自带的压测工具redis-benchmark测试两种操作读写总请求数20万次50个客户端并发连接。SET 性能每秒处理 880 次写请求指标数值含义avg56 ms平均一次写 56msp95111 ms95%请求 111msp99136 ms99%请求 136msmax224 ms最慢 224msGET 性能每秒处理 1296 次读请求指标数值含义avg37 ms平均一次读 37msp9579 ms95%请求 79msp99101 ms99%请求 101msmax181 ms最慢 181ms模拟真实负载更关键小并发读写混合./src/redis-benchmark-h127.0.0.1-p51002-tset,get,incr-n200000-c100用Redis/Tendis 自带的压测工具redis-benchmark测试三种操作读写原子自增总请求数20万次100个客户端并发连接。指标数值含义avg136.177 ms平均一次请求 136.177msp95239.999 ms95% 请求 239.999msp99278.015 ms95% 请求 278.015msmax422.143 ms最慢 422.143ms高并发测试看极限./src/redis-benchmark-h127.0.0.1-p51002-tset,get-n500000-c200用Redis/Tendis 自带的压测工具redis-benchmark测试两种操作读写总请求数50万次200个客户端并发连接。指标数值含义avg162.770 ms平均一次写 162.770msp95285.439 ms95% 请求 285.439msp99322.559 ms99% 请求 322.559msmax436.479 ms最慢 436.479ms延迟测试./src/redis-benchmark-h127.0.0.1-p51002-tset-n100000-c10-q用Redis/Tendis 自带的压测工具redis-benchmark测试一种操作写总请求数10万次10个客户端并发连接并以精简模式输出结果。指标数值含义吞吐量737.75 req/s每秒处理 737.75 次 SET 写请求p509.631 msec50% 的请求在 9.631ms 内完成即中位数延迟