StarRocks BE服務常見問題處理看這篇就夠了


背景

在我們支持客戶的過程中,發現一些客戶在部署和使用StarRocks過程中,遇到BE服務的問題,一般不太清楚應該怎樣排查?關注哪些指標?超過多少是不合理的狀態等。本文從部署到使用過程中,分享StarRocks BE服務常見問題以及處理辦法,希望能幫助大家更好的理解和使用StarRocks。

常見問題及處理方法

部署

下面是部署的一些check項,也可直接使用附錄中的Base_check.sh腳本
  1. 查看CPU是否支持AVX2指令集(因為目前StarRocks的向量化引擎依賴)
#該命令有輸出表示CPU是支持avx2的
cat /proc/cpuinfo |grep avx2
  1. 端口檢查
如果下面指令有輸出表示默認的端口已經被占用,則需要重新配置端口在fe.conf或be.conf中
FE
ss -antpl|grep -E '8030|9010|9020|9030'
BE
ss -antpl|grep -E '9060|9050|8040|8060'
  1. 配置必要的內核參數
關閉swap
echo 0 | sudo tee /proc/sys/vm/swappiness
內核允許分配所有的物理內存
echo 1 | sudo tee /proc/sys/vm/overcommit_memory
 

BE服務宕機

目前StarRocks2.0+版本已經修復了OOM的問題,建議老版本的用戶可以升級到2.0+版本

頻繁掛掉

如果BE服務掛掉,拉起后還是掛掉,可以在有問題的be服務be.conf中添加以下配置先禁用compaction,然后再重新拉起BE服務,觀察是否還會掛。
max_compaction_concurrency=0
如果做了上述操作,BE服務不會由於OOM宕機的話,可以確認原因就是由於compaction導致,可能在此之前導入過大批量的數據。可以嘗試調整max_compaction_concurrency=1先讓之前導入的數據合並完成(如圖starrocks_fe_tablet_max_compaction_score監控項低於50表示當前compaction是沒有壓力的)。之后可以根據根據max_compaction_concurrency=1時的內存占用適當調整該參數(調整完注意觀察參數)。

查詢或導入報錯:there is no ScanNode backend

show backends查看BE狀態
1)如果BE狀態為Alive,可能是BE節點hung住,可以嘗試重啟BE服務恢復
2)如果BE狀態為False,查看dmesg -T判斷be服務是不是由於oom掛掉了(類似這樣的日志:Out of memory: Kill process xxx (starrocks_be))
a)如果是oom
  • 可以先查看/proc/sys/vm/overcommit_memory是否配置為1,若不是先修改該配置為1
  • 可在be.conf中配置mem_limit=xx%限制BE最大使用內存占比
  • 可以查看下當前並行度(show variables like '%parallel_fragment_exec_instance_num')和單個sql內存限制(show variables like '%exec_mem_limit'),當前單個be內存使用也會受限於並行度*exec_mem_limit,可以根據BE節點內存調整這兩個變量
b)如果不是oom,需要具體查看be.out日志,在官方論壇 StarRocks數據庫論壇 提帖子或者在https://github.com/StarRocks/starrocks/issues提issue
 

附錄

#!/bin/bash


function cpu_check(){
    echo ""
    echo "############################ CPU檢查 #############################"
    cat /proc/cpuinfo |grep avx2 2>&1 >/dev/null
    if [ $? -ne 0 ];then
        echo -e "\033[31mcpu not support vector\033[0m"
    else
        echo -e "\033[32msuccess\033[0m"
    fi
}

function jdk_check(){
    echo ""
    echo "############################ JDK檢查 #############################"
    if [ -z $JAVA_HOME ];then
        echo -e "\033[31mJAVA_HOME not set\033[0m"
    else
        echo -e "\033[32msuccess\033[0m"
    fi
}

function swap_check(){
    echo ""
    echo "############################ swap檢查 #############################"
    swap_number=$(cat /proc/sys/vm/swappiness)
    if [ $swap_number -ne 0 ];then
        echo -e "\033[31mswap not close,please \"echo 0 | sudo tee /proc/sys/vm/swappiness\"\033[0m"
    else
        echo -e "\033[32msuccess\033[0m"
    fi
}

function kernel_check(){
    echo ""
    echo "############################ 參數檢查 #############################"
    oom_number=$(cat /proc/sys/vm/overcommit_memory)
    if [ $oom_number -ne 1 ];then
        echo -e "\033[31mplease \"echo 1 | sudo tee /proc/sys/vm/overcommit_memory\",details in https://www.kernel.org/doc/Documentation/vm/overcommit-accounting\033[0m"
    else
        echo -e "\033[32msuccess\033[0m"
    fi
}

function fe_port_check(){
    echo ""
    echo "############################ FE 端口檢查 #############################"
    # default port 8030,9010,9020,9030
    ports=$(ss -antpl|grep -E '8030|9010|9020|9030'|wc -l)
    if [ $ports -ge 0 ];then
        echo -e "\033[31mFe ports already used,please use \"ss -antpl|grep -E '8030|9010|9020|9030'\" check and reconfig.\033[0m"
    else
        echo -e "\033[32msuccess\033[0m"
    fi
}

function be_port_check(){
    echo ""
    echo "############################ BE 端口檢查 #############################"
    # default port 9060,9050,8040,8060
    ports=$(ss -antpl|grep -E '9060|9050|8040|8060'|wc -l)
    if [ $ports -ge 0 ];then
        echo -e "\033[31mBe ports already used,please use \"ss -antpl|grep -E '9060|9050|8040|8060'\" check and reconfig.\033[0m"
    else
        echo -e "\033[32msuccess\033[0m"
    fi
}

function check(){
    cpu_check
    jdk_check
    swap_check
    kernel_check
    fe_port_check
    be_port_check
}

check

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM