ARMv8.0下duckdb的安装与编译过程-解决 Failed to allocate block of 2048 bytes

发布时间 2023-10-21 06:03:56作者: 济南小老虎

ARMv8.0下duckdb的安装与编译过程-解决 Failed to allocate block of 2048 bytes


背景

duckdb 是一个很流行的单机版数据库引擎
同事下载了相关的预编译的二进制, 发现duckdb会报错如下:
"Out of Memory Error: Failed to allocate block of 2048 bytes"
详细的错误信息为: 
./duckdb
v0.9.0 0d84ccf478
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
D select 1 ;
Error: unable to open database ":memory:": Out of Memory Error: Failed to allocate block of 2048 bytes

简单的验证

github 上面很多类似的错误提示信息的issue
大部分都指向了 ARMv8的 64KB的页大小问题

需要注明
x86大部分的页大小是 4KB
但是aarch64的页面大小却是 64KB
验证方法
getconf PAGESIZE
65536

大部分报错都提示与页大小强相关. 
解决方法也比较简单:
编译时增加参数为:
-DBUILD_JEMALLOC_EXTENSION=0 
就可以解决这个问题.

一波三折

看到问题issue其实还是很高兴的
直接进行了相关的操作

git clone https://github.com/duckdb/duckdb
cd duckdb
cmake -DBUILD_JEMALLOC_EXTENSION=0 
time make

等待了30分钟后(ARM编译比较慢)
duckdb 9.2 的编译结果依旧是报错

看到issue里面说需要切换到最新分支, 直接懵逼了
这个已经是 2023.10.20 时最新的分支了 . 依旧报错. 
自己在9.1 9.2 的两个版本进行了多次编译, 耗费了接近一天的时间(这个是支线工作)
依旧不行

问题解决

为了解决上面的问题
自己按照issue里面提的 直接下载了 v0.5.0 的的预编译包,发现是可以的
但是同事反馈, 这个预编译包很多特定有丢失. 

这两个场景很容易猜测到是不是 9.0的版本出现了比较坑的Bug
为了验证. 晚上开始进行一下版本降级的编译与测试

步骤为
cd duckdb
mkdir build8.0 build8.1 build9.0

[root@BM119 duckdb]# cd duckdb/
[root@BM119 duckdb]# ll
总用量 220
drwxr-xr-x 13 root root    311 10月 21 00:00 benchmark
drwxr-xr-x  9 root root    305 10月 19 15:12 build
drwxr-xr-x  9 root root    305 10月 20 22:35 build8.0
drwxr-xr-x  9 root root    305 10月 20 23:14 build8.1
drwxr-xr-x  9 root root    305 10月 21 00:26 build9.0

然后进入到不同的版本build 里面执行相关命令
比如 build8.0
执行命令为:
cd duckdb 
git checkout v0.8.0
cd build8.0
cmake -DBUILD_JEMALLOC_EXTENSION=0  ..
time make

需要注意 
第一步的 git checkout v0.8.0 将duckdb的版本进行进行一下切换. 到具体的版本号上面
cmake 在build8.0的子目录下面,通过 .. 获取上一级目录的资源信息. 
然后再build8.0 的目录下面执行make, 就会产生特定版本的duckdb的二进制

checktout 的提示为:
之前的 HEAD 位置是 0d84ccf478 Merge pull request #9101 from carlopi/i686
HEAD 目前位于 e8e4cea5ec Merge pull request #7550 from hannes/httpfsstaticopensslforsure

然后cmake时会展示版本信息
[root@BM119 build]# cmake ..
-- git hash e8e4cea5ec, version v0.8.0
CMake Warning at CMakeLists.txt:443 (message):
  Please use a recent compiler for debug builds

结论

duckdb的 v0.9.0 以及之后的版本aarch64编译后会报错
v0.8.1的版本增加了 -DBUILD_JEMALLOC_EXTENSION=0 后还是可以正常运行的
应该是官方的bug. 可能duckdb v0.9.0 忘记考虑这个场景了. 
其实可以提一个issue 让duckdb官方处理 !-_-!
验证效果

[root@BM119 build8.1]# ./duckdb
v0.8.1 6536a77232
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
D select 1;
┌───────┐
│   1   │
│ int32 │
├───────┤
│     1 │
└───────┘
D

问题解决.