從background_pool_size參數(shù)烙如,看clickhouse啟動流程之load table分析

image.png

google翻譯一下:
設(shè)置在表引擎中執(zhí)行后臺操作的線程數(shù)(例如么抗,在MergeTree引擎表中的合并)。此設(shè)置是從ClickHouse服務(wù)器啟動時的默認(rèn)配置文件中應(yīng)用的厅翔,無法在用戶會話中進(jìn)行更改乖坠。通過調(diào)整此設(shè)置,可以管理CPU和磁盤負(fù)載刀闷。較小的池使用較少的CPU和磁盤資源熊泵,但是后臺進(jìn)程的執(zhí)行速度較慢,這最終可能會影響查詢性能甸昏。

更改它之前顽分,還請查看相關(guān)的MergeTree設(shè)置,例如number_of_free_entries_in_pool_to_lower_max_size_of_merge和number_of_free_entries_in_pool_to_execute_mutation施蜜。

從描述上看卒蘸,這個值是針對所有表的一個限制。實(shí)際工程實(shí)踐中這個值的控制粒度是什么樣子的翻默?我們PS -T 查看線上一個ch服務(wù):

     161 AsyncBlockInput
      1 AsyncMetrics
     32 BackgrProcPool
     16 BgDistSchPool
      1 BgDistSchPool/D
     16 BgSchPool
      1 BgSchPool/D
      9 clickhouse-serv
      1 CMD
      2 ConfigReloader
      2 ExterLdrReload
      4 HTTPHandler
    86 QueryPipelineEx
      1 SessionCleaner
      1 SystemLogFlush
     14 TCPHandler

發(fā)現(xiàn)這個叫BackgrProcPool的線程數(shù)和線上設(shè)置值匹配缸沃,于是代碼入手看看這個參數(shù)是如何控制后臺merge線程數(shù)的。

首先修械,代碼中找到可能設(shè)置"BackgrProcPool"名字的類趾牧。

BackgroundProcessingPool(int size_,
        const PoolSettings & pool_settings = {},
        const char * log_name = "BackgroundProcessingPool",
        const char * thread_name_ = "BackgrProcPool");

BackgroundProcessingPool::BackgroundProcessingPool(int size_,
        const PoolSettings & pool_settings,
        const char * log_name,
        const char * thread_name_)
    : size(size_)
    , thread_name(thread_name_)
    , settings(pool_settings)
{
    logger = &Logger::get(log_name);
    LOG_INFO(logger, "Create " << log_name << " with " << size << " threads");

    threads.resize(size);
    for (auto & thread : threads)
        thread = ThreadFromGlobalPool([this] { threadFunction(); });
}

對于每個表,原來clickhouse都會通過一個global的線程池來調(diào)度這些任務(wù):

//github.com/ClickHouse/src/Storages/StorageMergeTree.h
class StorageMergeTree : public ext::shared_ptr_helper<StorageMergeTree>, public MergeTreeData {
...
private:
  /// Task handler for merges, mutations and moves.
    BackgroundProcessingPool::TaskHandle merging_mutating_task_handle;
    BackgroundProcessingPool::TaskHandle moving_task_handle;

    std::vector<MergeTreeData::AlterDataPartTransactionPtr> prepareAlterTransactions(
        const ColumnsDescription & new_columns, const IndicesDescription & new_indices, const Context & context);

    void loadMutations();
...
}
//github.com/ClickHouse/src/Storages/StorageMergeTree.cpp
void StorageMergeTree::startup()
{
    clearOldPartsFromFilesystem();

    /// Temporary directories contain incomplete results of merges (after forced restart)
    ///  and don't allow to reinitialize them, so delete each of them immediately
    clearOldTemporaryDirectories(0);

    /// NOTE background task will also do the above cleanups periodically.
    time_after_previous_cleanup.restart();
    if (!getSettings()->disable_background_merges)
        merging_mutating_task_handle = global_context.getBackgroundPool().addTask([this] { return mergeMutateTask(); });
    if (areBackgroundMovesNeeded())
        moving_task_handle = global_context.getBackgroundMovePool().addTask([this] { return movePartsTask(); });
}

//github.com/ClickHouse/src/Interpreters/Context.cpp
BackgroundProcessingPool & Context::getBackgroundPool()
{
    auto lock = getLock();
    if (!shared->background_pool)
        shared->background_pool.emplace(settings.background_pool_size);
    return *shared->background_pool;
}

//github.com/ClickHouse/src/Core/Settings.h
M(SettingUInt64, background_pool_size, 16, "Number of threads performing background work for tables (for example, merging in merge tree). Only has meaning at server startup.", 0) \

上述代碼分析基于20.3.15版本肯污,下面的分析基于代碼20.12.5版本翘单。
20.12.5版本優(yōu)化了后臺任務(wù)子模塊的實(shí)現(xiàn):
https://github.com/ClickHouse/ClickHouse/pull/15983

clickhouse啟動的時候,會load所有的表蹦渣,把表按引擎級別在后臺啟動merge服務(wù)哄芜。


chtest.png

由上序列圖分析,可以看到柬唯,ch后臺merge job的調(diào)度认臊,依賴于一個global的pool context,這個pool的大小锄奢,是tables級別的美尸。

至于我們的老朋友Too many parts 這個錯誤,和我們的線程設(shè)置大小雖然有點(diǎn)關(guān)系斟薇,但更多時候并不是直接原因师坎,這里ch的架構(gòu)師alexy也給出了解釋:
https://github.com/ClickHouse/ClickHouse/issues/11193

image.png

寫在最后:

ch大量應(yīng)用了c++的新特性,一個不小心就掉到c++的語法糖中一發(fā)而不可收拾堪滨,越來越像python的寫法看似隨心所欲胯陋,其背后是ch團(tuán)隊(duì)對于操作系統(tǒng)、機(jī)器特性的深入理解。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末遏乔,一起剝皮案震驚了整個濱河市义矛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌盟萨,老刑警劉巖凉翻,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異捻激,居然都是意外死亡制轰,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門胞谭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來垃杖,“玉大人,你說我怎么就攤上這事丈屹〉鞣” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵旺垒,是天一觀的道長彩库。 經(jīng)常有香客問我,道長先蒋,這世上最難降的妖魔是什么侧巨? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮鞭达,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘皇忿。我一直安慰自己畴蹭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布鳍烁。 她就那樣靜靜地躺著叨襟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪幔荒。 梳的紋絲不亂的頭發(fā)上糊闽,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機(jī)與錄音爹梁,去河邊找鬼右犹。 笑死,一個胖子當(dāng)著我的面吹牛姚垃,可吹牛的內(nèi)容都是我干的念链。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼掂墓!你這毒婦竟也來了谦纱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤君编,失蹤者是張志新(化名)和其女友劉穎跨嘉,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吃嘿,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡祠乃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了唠椭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片跳纳。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖贪嫂,靈堂內(nèi)的尸體忽然破棺而出寺庄,到底是詐尸還是另有隱情,我是刑警寧澤力崇,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布斗塘,位于F島的核電站,受9級特大地震影響亮靴,放射性物質(zhì)發(fā)生泄漏馍盟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一茧吊、第九天 我趴在偏房一處隱蔽的房頂上張望贞岭。 院中可真熱鬧,春花似錦搓侄、人聲如沸瞄桨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽芯侥。三九已至,卻和暖如春乳讥,著一層夾襖步出監(jiān)牢的瞬間柱查,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工云石, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留唉工,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓汹忠,卻偏偏與公主長得像酵紫,于是被迫代替她去往敵國和親告嘲。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容