如何解決 ClickHouse OOM

1. 前言

Out Of Memory (OOM)到目前為止已經(jīng)出現(xiàn)了 40 年。大概就是當(dāng)某個(gè)應(yīng)用想要使用的內(nèi)存超過了現(xiàn)有可用的內(nèi)存總和嘿悬,本文將不會(huì)具體進(jìn)行贅述。為了防止發(fā)生OOM 脚祟,采取了各種各樣的方式绍在,最常見的就是,當(dāng)申請(qǐng)內(nèi)存時(shí)斗锭,發(fā)現(xiàn)無法申請(qǐng)所需要的內(nèi)存地淀,系統(tǒng)主動(dòng) kill 當(dāng)前內(nèi)存占用最大的應(yīng)用。

這樣帶來的好處是岖是,當(dāng)前應(yīng)用可以正常使用了帮毁。但是,缺點(diǎn)也是顯而易見的:會(huì)讓當(dāng)前最大內(nèi)存占用的應(yīng)用無法正常運(yùn)行豺撑。

在數(shù)據(jù)庫(kù)中烈疚,這尤為常見。比如聪轿,在一臺(tái)數(shù)據(jù)庫(kù)服務(wù)器中運(yùn)行了 MySQL Server 爷肝,同時(shí)要對(duì)這個(gè)數(shù)據(jù)庫(kù)進(jìn)行備份,而執(zhí)行 mysqldump 或者 xtrabackup 或者 mydumper 等等備份命令時(shí)陆错,由于機(jī)器內(nèi)存不足以運(yùn)行備份命令灯抛,而 kill 掉了內(nèi)存占用最大的 MySQL Server。這帶來的后果就很直接了音瓷,業(yè)務(wù)讀寫失敗对嚼。

同樣的,當(dāng)下的 OLAP 驕子 ClickHouse 也是存在這種問題绳慎,那么他的 OOM 一般是如何引起的呢纵竖,又要如何避免呢?

2. 發(fā)生 OOM 的原因

OOM 是什么我們已經(jīng)知道了偷线,那么磨确,ClickHouse OOM 的原因其實(shí)應(yīng)該主要分為

  • 查詢導(dǎo)致 OOM

  • 寫入導(dǎo)致 OOM

查詢導(dǎo)致 OOM 比較好理解,就是声邦,當(dāng)某個(gè) query 要讀取的數(shù)據(jù)量過大了乏奥,內(nèi)存不夠用。

寫入會(huì)導(dǎo)致 OOM 可能大家不是很理解亥曹,有人如果認(rèn)為 insert into select 是屬于寫入導(dǎo)致 OOM 邓了,這應(yīng)該不算全對(duì)恨诱,畢竟還進(jìn)行了查詢。所以骗炉,接下來照宝,我們仔細(xì)區(qū)分一下這兩類原因。

2.1. 查詢導(dǎo)致OOM

比如某個(gè)大數(shù)據(jù)量的表做聚合排序( GROUP BYORDER BY)操作句葵,導(dǎo)致需要將大量的數(shù)據(jù)讀取到內(nèi)存中厕鹃,然后按照 SQL 要求進(jìn)行分組和排序。數(shù)據(jù)對(duì)內(nèi)存的消耗基本是 數(shù)據(jù):內(nèi)存> 1:1 的乍丈。也就是剂碴,如果有 1GB 數(shù)據(jù)需要做聚合排序操作,那么他需要的內(nèi)存是要超過 1GB 的轻专。數(shù)據(jù)量越大忆矛,所需內(nèi)存會(huì)更加巨大。常見的機(jī)器是無法滿足這種需求的请垛。

2.2. 寫入導(dǎo)致OOM

對(duì)于大多數(shù)小內(nèi)存的數(shù)據(jù)庫(kù)服務(wù)器來說催训,如果一次寫入的batch過大都有可能會(huì)引起OOM。但是宗收,對(duì)于 ClickHouse 來說漫拭,可能卻不是這樣。并發(fā)線程數(shù)目20 镜雨,每個(gè)線程只寫入一行嫂侍,每行寫入的列只有 15 個(gè)儿捧。都有可能引發(fā) OOM 荚坞。

可能看到這里會(huì)覺得 ClickHouse 一定設(shè)計(jì)的不合理,要不然為什么如此小的數(shù)據(jù)寫入都會(huì)引發(fā) OOM 呢菲盾?

如果會(huì)有這樣的問題颓影,說明不是很理解 ClickHouse 。ClickHouse 支持多種表引擎懒鉴。其中有一個(gè) MergeTree 族群表引擎诡挂,MergeTree 在 ClickHouse 的地位基本等同于 Innodb 在 MySQL 的地位。MergeTree 引擎是基于 LSM 算法實(shí)現(xiàn)的临谱。每次寫入就會(huì)生成一個(gè)小文件璃俗,然后 ClickHouse Server 再去合并每個(gè)小文件到數(shù)據(jù)文件中。關(guān)于 MergeTree 原理將會(huì)在后面的文章中進(jìn)行詳細(xì)介紹悉默。

理解了MergeTree的 merge 工作后城豁,就比較清晰了。當(dāng)多個(gè)線程每次只寫入一行數(shù)據(jù)時(shí)抄课, insert query 的每個(gè)列會(huì)生成兩個(gè)文件唱星。因此雳旅,按照上面的寫入方式,計(jì)算出消耗的內(nèi)存為:

2MB * 15 * 20 = 600 MB

600MB 可能不大间聊,但是攒盈,換算一下百分比,如果機(jī)器內(nèi)存是 8GB 哎榴,8GB 的 10% 內(nèi)存也只有 800MB 左右呀型豁。而一個(gè)數(shù)據(jù)庫(kù)機(jī)器,一般負(fù)載下內(nèi)存占用達(dá)到機(jī)器的 70% 左右尚蝌。如果突然來這么一次20行數(shù)據(jù)的寫入偷遗,內(nèi)存就會(huì)飆升 10% ,我想這會(huì)是很令人疑惑的一件事驼壶。而且氏豌,如果有人在 AP 中一次寫入只包含一行數(shù)據(jù),那他可能確實(shí)沒有理解 AP 數(shù)據(jù)庫(kù)的精髓所在热凹。

3. 如何避免 OOM

OOM 的原因我們簡(jiǎn)單分析過了泵喘,主要是查詢和不正當(dāng)寫入導(dǎo)致的。因此般妙,避免 OOM 也就變得簡(jiǎn)單起來纪铺。

3.1. 避免查詢時(shí) OOM

對(duì)于如何避免查詢時(shí)發(fā)生 OOM ,數(shù)據(jù)庫(kù)常見的做法就是外排到磁盤碟渺。比如鲜锚,眾所周知的,MySQL 查詢慢了苫拍,就去 explain芜繁,看到結(jié)果有臭名昭著的 Using filesort 而剛好要排序的數(shù)據(jù)量大于session的 sort_buffer 時(shí),就會(huì)自動(dòng)使用磁盤排序了绒极。

而 ClickHouse 的做法也是比較類似骏令。同樣也有 setting 進(jìn)行控制:

max_bytes_before_external_group_by:The max_bytes_before_external_group_by setting determines the threshold RAM consumption for dumping GROUP BY temporary data to the file system. If set to 0 (the default), it is disabled.

max_bytes_before_external_sort:If there is not enough RAM, it is possible to perform sorting in external memory (creating temporary files on a disk). Use the setting max_bytes_before_external_sort for this purpose. If it is set to 0 (the default), external sorting is disabled. If it is enabled, when the volume of data to sort reaches the specified number of bytes, the collected data is sorted and dumped into a temporary file. After all data is read, all the sorted files are merged and the results are output. Files are written to the /var/lib/clickhouse/tmp/ directory in the config (by default, but you can use the tmp_path parameter to change this setting).

3.2. 避免寫入時(shí) OOM

而避免寫入時(shí)OOM ,就不應(yīng)該在強(qiáng)求 ClickHouse 來實(shí)現(xiàn)了垄提。而是需要對(duì)業(yè)務(wù)做一些修改榔袋,比如,降低并發(fā)線程數(shù)铡俐;每個(gè) insert 中采用更大的 batch 凰兑。畢竟,我們同樣不能苛責(zé)向小型 MySQL Server 服務(wù)器 一次寫入 10萬(wàn)行數(shù)據(jù)時(shí)性能不佳呀审丘。

本作品采用 知識(shí)共享署名 4.0 國(guó)際許可協(xié)議 進(jìn)行許可吏够。 轉(zhuǎn)載時(shí)請(qǐng)注明原文鏈接。From TCeason

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市稿饰,隨后出現(xiàn)的幾起案子锦秒,更是在濱河造成了極大的恐慌,老刑警劉巖喉镰,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件旅择,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡侣姆,警方通過查閱死者的電腦和手機(jī)生真,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捺宗,“玉大人柱蟀,你說我怎么就攤上這事⊙晾鳎” “怎么了长已?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)昼牛。 經(jīng)常有香客問我术瓮,道長(zhǎng),這世上最難降的妖魔是什么贰健? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任胞四,我火速辦了婚禮,結(jié)果婚禮上伶椿,老公的妹妹穿的比我還像新娘辜伟。我一直安慰自己,他們只是感情好脊另,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布导狡。 她就那樣靜靜地躺著,像睡著了一般尝蠕。 火紅的嫁衣襯著肌膚如雪烘豌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天看彼,我揣著相機(jī)與錄音,去河邊找鬼囚聚。 笑死靖榕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的顽铸。 我是一名探鬼主播茁计,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了星压?” 一聲冷哼從身側(cè)響起践剂,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎娜膘,沒想到半個(gè)月后逊脯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡竣贪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年军洼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片演怎。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡匕争,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出爷耀,到底是詐尸還是另有隱情甘桑,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布歹叮,位于F島的核電站扇住,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏盗胀。R本人自食惡果不足惜艘蹋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望票灰。 院中可真熱鬧女阀,春花似錦、人聲如沸屑迂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)惹盼。三九已至庸汗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間手报,已是汗流浹背蚯舱。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留掩蛤,地道東北人枉昏。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像揍鸟,于是被迫代替她去往敵國(guó)和親兄裂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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