2.5.13 nonavx2 crash

【详述】
由于环境原因,需要在不支持AVX2指令集的机器上,通过容器的形式部署StarRocks。
参考以下内容,进行镜像的制作:

2023年中旬,已制作过2.2.13版本的不支持AVX2指令集的镜像,并可以正常运行。
近期,尝试制作2.5.13版本的镜像,发现如下情况:

  1. 启动服务初期,运行正常。在客户端中执行SHOW BACKENDS\G,BE节点状态正常
  2. 运行一段时间后,服务崩溃,be.out中日志内容如下
start time: Mon Dec 18 04:00:14 UTC 2023
2.5.13 RELEASE (build )
query_id:00000000-0000-0000-0000-000000000000, fragment_instance:00000000-0000-0000-0000-000000000000
tracker:process consumption: 154748672
tracker:query_pool consumption: 0
tracker:load consumption: 0
tracker:metadata consumption: 996870
tracker:tablet_metadata consumption: 382340
tracker:rowset_metadata consumption: 497277
tracker:segment_metadata consumption: 28501
tracker:column_metadata consumption: 88752
tracker:tablet_schema consumption: 28724
tracker:segment_zonemap consumption: 19426
tracker:short_key_index consumption: 0
tracker:column_zonemap_index consumption: 34720
tracker:ordinal_index consumption: 19184
tracker:bitmap_index consumption: 0
tracker:bloom_filter_index consumption: 0
tracker:compaction consumption: 0
tracker:schema_change consumption: 0
tracker:column_pool consumption: 1738354
tracker:page_cache consumption: 832
tracker:update consumption: 458
tracker:chunk_allocator consumption: 1458600
tracker:clone consumption: 0
tracker:consistency consumption: 0
*** Aborted at 1702872917 (unix time) try "date -d @1702872917" if you are using GNU date ***
PC: @          0x6018f0d ra_init
*** SIGILL (@0x6018f0d) received by PID 860 (TID 0x7fb0125f5700) from PID 100765453; stack trace: ***
    @          0x592ed42 google::(anonymous namespace)::FailureSignalHandler()
    @     0x7fb156473630 (unknown)
    @          0x6018f0d ra_init
    @          0x42fafd0 starrocks::DelVector::_add_dels()
    @          0x42fb78c starrocks::DelVector::add_dels_as_new_version()
    @          0x414562b starrocks::TabletUpdates::_apply_rowset_commit()
    @          0x4147512 starrocks::TabletUpdates::do_apply()
    @          0x49b43d5 starrocks::ThreadPool::dispatch_thread()
    @          0x49aee7a starrocks::Thread::supervise_thread()
    @     0x7fb15646bea5 start_thread
    @     0x7fb155a8696d __clone
    @                0x0 (unknown)
  1. BE服务的stdout如下:
ERROR 1064 (HY000) at line 1: Unexpected exception: Same backend already exists[127.0.0.1:9050]

对比2.2.13和2.5.13,制作镜像过程中的差异点如下

  • 源文件:分别为2.2.13与2.5.13的tar.gz文件
  • 编译环境
    • 2.2.13(运行正常):starrocks/dev-env:branch-2.2(该镜像线上已不存在)
    • 2.5.13(运行不正常):starrocks/dev-en-centos7:2.5-latest

想咨询社区老师,问题的原因是什么?在现有环境下,可以如何解决?

【StarRocks版本】:2.5.13
【集群规模】例如:1fe(1 follower)+1be(fe与be混部)
【机器信息】
CPU某核的信息如下

processor	: 7
vendor_id	: GenuineIntel
cpu family	: 6
model		: 45
model name	: Intel(R) Xeon(R) CPU E5-2665 0 @ 2.40GHz
stepping	: 7
microcode	: 0x5003604
cpu MHz		: 2393.998
cache size	: 20480 KB
physical id	: 0
siblings	: 8
core id		: 7
cpu cores	: 8
apicid		: 14
initial apicid	: 14
fpu		: yes
fpu_exception	: yes
cpuid level	: 13
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat clflush mmx fxsr sse sse2 ht syscall nx lm constant_tsc rep_good nopl cpuid tsc_known_freq pni ssse3 cx16 sse4_1 sse4_2 popcnt hypervisor lahf_lm pti
bugs		: cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs itlb_multihit mmio_unknown
bogomips	: 4787.99
clflush size	: 64
cache_alignment	: 64
address sizes	: 46 bits physical, 48 bits virtual
power management:

【联系方式】社区群12 - srrookie

用非AVX机器把thirdparty编译一下

谢谢老师。我找了一台不支持avx2指令集的机器进行编译,但依然有上述问题。我再简述下操作步骤:

  1. 执行cat /proc/cpuinfo | grep avx,我返回结果——该环境CPU应该不支持AVX2指令集
  2. 下载2.5.13的代码
  3. 拉取starrocks/dev-env-centos7:2.5.13镜像,并启动容器,挂载2.5.13的代码
  4. 修改代码中build.sh内AVX2相关参数,以及thirdparty/build-thirdparty.sh中FORCE_AVX2参数(FALSE/OFF)
  5. 执行sh build.shsh thirdparty/build-thirdparty.sh进行编译
  6. 将output文件夹中的内容拷贝出来,制作镜像

我也是在测试no avx2的环境,2.5版本碰到了同样的问题,运行一小会就crash了。我是用的starrocks/dev-env-centos7:2.5.17 这个docker image构建的。

会不会和构建镜像有关系,得在no-avx2的宿主机上直接构建才有效?

老师您好,我看官方的常见crash帖中,有提到类似报错:常见 Crash / BUG / 优化 查询 ,提示需要关闭AVX2的支持。但是我已经按照流木老师的帖子执行了操作,是否因为在2.5中,还有其他地方的build脚本中,需要修改和AVX相关的参数?

croaringbitmap这个三方库强制打开了avx2指令, 可以在非avx2机器上的dev-env里重新编译一下这个三方库替换镜像里自带的编译好的库.

@lvlouisaslia 谢谢老师。thirdparty/build-thirdparty.shbuild_croaringbitmap 是不是就是编译该第三方库的步骤(https://github.com/StarRocks/starrocks/blob/2.5.17/thirdparty/build-thirdparty.sh#L678-L701 )?

我看在执行脚本中,已经调用了这个函数(https://github.com/StarRocks/starrocks/blob/2.5.17/thirdparty/build-thirdparty.sh#L1046 )。在该函数,我更改了如下参数(https://github.com/StarRocks/starrocks/blob/2.5.17/thirdparty/build-thirdparty.sh#L697C29-L697C29

    -DFORCE_AVX=FALSE \

显式地修改了参数。与此同时,也找了一台非avx2的机器(以下命令没有返回结果):

> cat /proc/cpuinfo | grep -o 'avx[^ *]'

但是依然会遇到如上报错。

请问是否我对您提到的

重新编译一下这个三方库替换镜像里自带的编译好的库

理解有误?正确的操作方式是?

@trueeyu 刘老师您好,在常见Crash中,我看您提到了不支持avx2导致的BE crash现象和建议。
我现在遇到了类似问题,其他老师在这个帖子中的楼上也有相关建议。其中提到可能是croaringbitmap强制打开avx2指令导致的。
我在这一层提到了编译时进行操作,不知道您有没有建议,是哪一步参数的改动有误或遗漏,导致编译后的结果依然无法在nonavx2环境运行?

需要重新编译下这个第三方库,默认用Docker镜像编译的话,不会编译这个库的。

感谢 @trueeyu@lvlouisaslia 老师,您们提到的"需要重新编译"是否是因为如下原因。

当我使用官方的starrocks/dev-env-centos7镜像启动容器环境进行编译时,该环境已经执行sh ./thirdparty/build-thirdparty.sh 编译了第三方库:

  1. 根据thirdparty/vars.sh中定义,下载第三方库,其中包含CRoaring-1.1.3;
  2. 通过thirdparty/build-thirdparty.sh脚本,在tool-chain镜像内编译第三方库。此间会编译croaringbitmap
  3. 官方在构建dev-env镜像时可能是在支持avx2指令集的环境中,根据该逻辑,在编译时设置FORCE_AVX2为true,即 @lvlouisaslia 老师提到的信息的出处

croaringbitmap这个三方库强制打开了avx2指令


@trueeyu 重新编译croaringbitmap的话,具体的步骤是否如下?

  1. 在不支持avx2指令集的环境中,挂载starrocks相关版本源码后,进入dev-env容器内
  2. 手动编辑thirdparth/build-thirdparty.sh 文件,注释其他函数,仅保留build_croaringbitmap 这一步
  3. 在starrocks源码根目录下,执行sh ./thirdparty/build-thirdparty.sh 命令(此时应仅编译croaringbitmap)
  4. 编译成功后,结果在./thirdparty/installed/include/roaring目录下,将以上内容复制、替换。
cp -a ./thirdparty/installed/include/roaring /var/local/thirdparth/installed/include/roaring
  1. 完成替换后,继续执行sh ./build.sh 以及 sh ./fs_broker/apache_hdfs_broker/build.sh 进行编译。

我尝试按照上述步骤操作,但构建的镜像还是有主楼相关的错误。想请教老师还有哪里有问题,麻烦了(对编译的这些库以及标准做法不是很了解lol)。

若需要编译可在不支持AVX2指令集CPU的机器上运行的StarRocks,以2.5.13 为例,具体步骤如下(编译环境不限制CPU是否支持AVX2指令集)。

  1. 下载StarRocks对应分支/tag的源码
  2. 修改./build.sh 文件,设置为USE_AVX2=OFF
  3. 修改./thirdparty/build-thirdparty.sh:
  4. 启动dev-env服务,并将代码挂载,如docker run -it -v /app/starrocks-2.5.13/:/root/starrocks-2.5.13 --env STARROCKS_VERSION=2.5.13 --name starrocks-image -d starrocks/dev-env-centos7:2.5.13
  5. 执行docker exec -it starrocks-image /bin/bash,进入容器内
  6. 执行cd /root/starrocks-2.5.13 && sh ./thirdparty/build-thirdparty.sh,对CRoaring以新的入参(取消FORCE_AVX)重新进行编译
  7. 执行 cp -f ./thirdparty/installed/lib/libroaring.a /var/local/thirdparty/installed/lib

至此,完成了对croaringbitmap库的替换
8. 执行sh ./build.shsh ./fs_brokers/apache_hdfs_broker/build.sh ,编译StarRocks。输出结果分别在./output以及./fs_brokers/apache_hdfs_broker/output文件夹内

若条件允许,可在7完成后退出容器,对使用的镜像重新打标签,上传至自己的registry,方便后续使用。

docker tag starrocks/dev-env-centos7:2.5.13 TARGET_IMAGE[:TAG]

赞,我们把这个编译方法放到官方文档里,方便需要的用户查看。

@trueeyu 谢谢老师。多问一个问题,dev-env-[centos7|ubuntu]和之前的dev-env镜像有什么区别?之前使用dev-env:branch-2.2是没有这个问题的(不过该镜像dockerhub中已经不存在了)。

dev-env-centos7 对应main

dev-env-centos7:branch-3.2
dev-env-centos7:branch-3.1
dev-env-centos7:branch-2.5

对应不同版本的编译

@trueeyu 我没有表述清楚。我是指官方提供的编译环境镜像,当前的名称是dev-env-[centos7|ubuntu]。截至到去年,官方提供的镜像名称是dev-env(没有操作系统的后缀)。使用该镜像时,无需上述调整,仅修改StarRocks源码中build.sh文件的部分参数,即可编译出能在非avx2环境正常运行的内容。
想请教的是,dev-env-centos7和dev-env(该镜像已经在starrocks dockerhub内找不到了)这两个有什么区别?

2.2 这样编译的话,也会Crash,2.2没Crash,是因为没有用到主键模型?

1赞

我猜大概是croaringbitmap版本升级后, 对应avx2的runtime检查做得不好, 变成force_avx2打开了.

其它库都可以在avx2 CPU上编译, 在runtime时通过cpuset决定要不要调用avx2版本的函数入口.

1赞