TPC TiKV:Hackathon 中最硬核项目是如何炼成的?| TPC 战队访谈
數(shù)據(jù)庫(kù)調(diào)優(yōu)可以使數(shù)據(jù)庫(kù)應(yīng)用運(yùn)行得更快,但對(duì)于很多人來(lái)說(shuō),對(duì)數(shù)據(jù)庫(kù)內(nèi)核進(jìn)行調(diào)優(yōu)是一項(xiàng)很有挑戰(zhàn)的“技術(shù)活”,是只屬于少部分內(nèi)核研發(fā)們的“游戲”。但即使是他們,對(duì)數(shù)據(jù)庫(kù)內(nèi)核進(jìn)行性能調(diào)優(yōu),也充滿了不確定性,它需要綜合考慮各種復(fù)雜因素,如硬件層面的 CPU、 I/O、 內(nèi)存和網(wǎng)絡(luò),以及軟件層面關(guān)于操作系統(tǒng)、中間件、數(shù)據(jù)庫(kù)參數(shù)等配置,還有運(yùn)行在數(shù)據(jù)庫(kù)上的各種查詢和命令等。在本次 Hackathon 2021 比賽中,TPC 戰(zhàn)隊(duì)就完成了這一項(xiàng)“挑戰(zhàn)”,采用 bottom-up 的設(shè)計(jì)思路,更好地利用硬件資源,使用 TPC (thread-per-core) 線程模型優(yōu)化了 TiKV 的寫(xiě)入性能、性能穩(wěn)定性和自適應(yīng)能力。TPC 戰(zhàn)隊(duì)也憑借這一硬核項(xiàng)目一舉斬獲了三等獎(jiǎng)與技術(shù)潛力獎(jiǎng)。
“該項(xiàng)目是本屆 Hackathon 中最硬核的項(xiàng)目,我給了非常高的分?jǐn)?shù)。 TPC 在其中做了非常多的工作,我預(yù)感到后續(xù)落地的難度,他們用了 io uring,不過(guò)貌似也遇到了不少的坑,后面也可以選擇 AIO 或者單獨(dú)的異步線程機(jī)制。因?yàn)橛昧诵碌?raft engine(這個(gè)會(huì)在 TiDB 5.4 GA),也很方便做 parallel log write,充分利用多隊(duì)列 IO 特性。這個(gè)特性在 Cloud 上面也是很關(guān)鍵的,因?yàn)?EBS 這些盤(pán)單線程寫(xiě)入 IOPS 其實(shí)真不高。另外,我看他們后面還會(huì)去掉 KV RocksDB 的 WAL,這樣幾個(gè)線程池就真能合并,只做計(jì)算操作,IO 操作都完全變成異步了?!薄u(píng)委唐劉TPC 戰(zhàn)隊(duì)由來(lái)自 TiDB 分布式事務(wù)研發(fā)團(tuán)隊(duì)的陳奕霖與趙磊組成,其中,陳奕霖從 2019 年就參加 TiDB Hackathon ,并憑借線程池項(xiàng)目拿了當(dāng)年的一等獎(jiǎng),而彼時(shí)他還是一名剛剛進(jìn)入 PingCAP 的實(shí)習(xí)生。如今已畢業(yè)的他,留在 PingCAP 繼續(xù)做事務(wù)相關(guān)的研發(fā)工作,已經(jīng)是一名 TiDB Hackathon 老選手了。
TiDB Hackathon 的魅力
陳奕霖:其實(shí)對(duì)于 PingCAPer 而言, Hackathon 是一個(gè)發(fā)現(xiàn)更多可能性的機(jī)會(huì)。我們平時(shí)工作中都有著很多緊迫的項(xiàng)目,沒(méi)機(jī)會(huì)探索 TiDB 更多新的可能性,Hackathon 就給予這樣的機(jī)會(huì)。在平時(shí)的工作場(chǎng)景中,我們經(jīng)常會(huì)產(chǎn)生一些想法,但沒(méi)機(jī)會(huì)去嘗試。 在 Hackathon 中就可以將這些想法實(shí)踐出來(lái),并通過(guò) DEMO 展示它的效果與潛力,如果實(shí)現(xiàn)得好,最后還有可能落地進(jìn)入生產(chǎn)代碼。
項(xiàng)目靈感來(lái)源
陳奕霖:趙磊非??释鲞@個(gè)項(xiàng)目,項(xiàng)目靈感也主要來(lái)源于他。平時(shí)在做內(nèi)核開(kāi)發(fā)以及解決一些用戶問(wèn)題時(shí),我們發(fā)現(xiàn) TiKV 的整體性能比較一般,并且有著很強(qiáng)的不確定性,難以調(diào)優(yōu)。趙磊在研究另一款數(shù)據(jù)庫(kù)產(chǎn)品的代碼時(shí),發(fā)現(xiàn)那個(gè)架構(gòu)中的一些技術(shù)其實(shí)可以有效提升 TiKV 的性能。所以就想把該產(chǎn)品架構(gòu)思路中用到的一些技術(shù)應(yīng)用到 TiKV 來(lái),看是否能提升 TiKV 的性能以及穩(wěn)定性。
TPC 項(xiàng)目的首要目的在于性能提升,TiKV 對(duì)于資源的利用一直不是很好,如對(duì) CPU 或 IO 資源利用不充分,通過(guò)該架構(gòu)可以通過(guò)并發(fā)寫(xiě) WAL 實(shí)現(xiàn)對(duì) IO 資源的充分利用。線程池方面的新架構(gòu)也可以比較合理地去規(guī)劃 CPU 的資源使用,特別是在云環(huán)境下,可以讓 TiKV 得到更穩(wěn)定、更可預(yù)期的性能。
比賽中的異步協(xié)作
陳奕霖:我們差不多在元旦假期才開(kāi)始做初步開(kāi)發(fā)工作,與平常工作時(shí)差不多,我們大部分時(shí)間還是異步化的協(xié)作,我有什么進(jìn)展就直接同步給趙磊,這個(gè)過(guò)程可能會(huì)通過(guò)郵件或 Github 通知進(jìn)行。開(kāi)發(fā)過(guò)程主要分為兩大塊:一方面是改 TiKV 本身的 raftstore ,這是趙磊做的。另一方面是關(guān)于 Raft engine, TiKV 用來(lái)存儲(chǔ) Raft 日志的一個(gè)組件,我來(lái)它的異步化以及寫(xiě)的并發(fā)化。
其中,Raftstore 包含兩個(gè) thread pool:
- store pool 用于處理 raft message、append log 等,raft log 會(huì)寫(xiě)入 raft db;
- apply pool 用于處理 committed log,數(shù)據(jù)會(huì)寫(xiě)入 kv db,目前 raft db 和 kv db 均使用 RocksDB,之后 raft db 會(huì)切換到 raft-engine。
?
RocksDB 無(wú)法很好利用現(xiàn)代高速硬盤(pán),它的 foreground write (WAL) 只能提供 1 個(gè) I/O depth 且 write group 間同步、排隊(duì)的消耗很大,而 NMVe SSD 等高速硬盤(pán)需要高的 I/O depth 來(lái)打滿 IOPS,或者大的 I/O size 加上不那么高的 I/O depth 來(lái)打滿 bandwidth,但大的 I/O size 不適合 OLTP 系統(tǒng),因?yàn)閿€大 batch 通常意味著高延遲。
?
為了優(yōu)化 TiKV 的 disk 使用,raft engine 需要支持并發(fā)寫(xiě) WAL 或者拆分 raft db 來(lái)并行寫(xiě)多個(gè) WAL 文件,為了更公平和 upstream TiKV 做性能對(duì)比,本次 Hackathon 沒(méi)有對(duì)數(shù)據(jù)模型做很大改動(dòng),會(huì)實(shí)現(xiàn)并行寫(xiě) WAL,不會(huì)拆分 raft db。而為了最大化 disk 壓力、更好的 CPU 使用率以及更好的性能穩(wěn)定性,TPC 選擇使用 async I/O 來(lái)實(shí)現(xiàn)該功能。
Store pool 實(shí)現(xiàn)了上述功能后,它的性能應(yīng)該會(huì)大幅優(yōu)于 apply pool,但可能會(huì)消耗更多的資源從而影響整體的性能,如消耗了更多的 CPU 和 disk I/O 資源導(dǎo)致 apply pool 變慢、積攢太多 committed logs 導(dǎo)致 OOM 等,且整個(gè) pipeline 的性能受限于最慢的一個(gè)階段,需要根據(jù)最慢的階段做 back pressure,如調(diào)整 store pool 和 apply pool 的線程數(shù)量從而保證速度匹配。但拆分多個(gè)線程池實(shí)在是不易用、不靈活,為了避免手動(dòng)調(diào)優(yōu),我們將 store pool 和 apply pool 合并為單個(gè)線程池。為了實(shí)現(xiàn)這一目標(biāo),raft engine 使用 async I/O 也是必需的,kv db 同樣需要使用 async I/O,但 kv db 理論上可以不寫(xiě) WAL,因?yàn)閿?shù)據(jù)可通過(guò) raft log 回放且該功能已有方案,在 Hackathon 上會(huì)強(qiáng)行去掉 kv db 的 WAL。除了 async I/O 外,還需要實(shí)現(xiàn) CPU scheduler 來(lái)保證當(dāng) CPU 成為瓶頸時(shí),單個(gè)線程內(nèi)不同任務(wù)成比例地使用資源,如原來(lái) store pool 和 apply pool 的任務(wù)各使用 50% 的 CPU 資源。
有了 CPU scheduler 后可以把更多的線程池合并在一起從而實(shí)現(xiàn)真正的 unified thread pool,如 gRPC thread pool、scheduler worker pool、unified read pool、RocksDB background threads、backup thread pool 等,CPU scheduler 會(huì)給每個(gè)原先 thread pool 的任務(wù)分配一定比例的資源,且可動(dòng)態(tài)調(diào)整,從而提升資源緊張時(shí)的性能穩(wěn)定性,實(shí)現(xiàn)自適應(yīng),避免手動(dòng)調(diào)參。
遇到的最大技術(shù)困難
陳奕霖:這一次我們用的各種技術(shù)都是特別激進(jìn)和核心的技術(shù),遇到了很多依賴庫(kù)或者 Linux 內(nèi)核的一些意外情況,編寫(xiě)時(shí)有一些東西并不符合預(yù)期。比如說(shuō)我們用的 thread per core 庫(kù),當(dāng)我們想要根據(jù) latency 去做搶占的時(shí)候,它在絕大多數(shù)的內(nèi)核上都不能工作。
此外,我們?cè)?AWS 上嘗試了很多種內(nèi)核。當(dāng)使用 AWS Linux 默認(rèn)提供的內(nèi)核配合 IO uring ,遇到很多問(wèn)題。后來(lái),我們輾轉(zhuǎn)到一個(gè)更新的內(nèi)核上終于可以使用了。另一方面是文件系統(tǒng),我們常用的有 ext4 和 xfs 兩種文件系統(tǒng),它們?cè)诋惒綄?xiě)的行為有一些區(qū)別,我們也是嘗試多種內(nèi)核以及換不同的文件系統(tǒng)后,才終于找到某一種組合,基本符合我們對(duì)于異步寫(xiě)的行為預(yù)期。我們整體過(guò)程中遇到的最大問(wèn)題,就是用的的技術(shù)太不成熟了,遇到了很多內(nèi)核方面的坑,這方面其實(shí)還挺痛苦的。
比賽過(guò)程中有什么遺憾?
陳奕霖:比較遺憾的是時(shí)間比較緊,對(duì)整個(gè)系統(tǒng)的調(diào)優(yōu)還沒(méi)有調(diào)到比較好的程度,最后效果比我們想象中的要差一點(diǎn)。在整個(gè)過(guò)程中,我們花了大量的時(shí)間讓這個(gè)項(xiàng)目跑起來(lái),讓它基本符合我們的預(yù)期。
比賽中有一個(gè)有趣的事,我其實(shí)一直都不清楚隊(duì)伍的宣言是什么,后來(lái)到現(xiàn)場(chǎng)才發(fā)現(xiàn)隊(duì)旗下面的小字寫(xiě)的是“冠軍被我內(nèi)定 or 小丑竟是我自己”,結(jié)果在 Hackathon 的前幾天,我突然發(fā)現(xiàn)趙磊把他的頭像改成了小丑……
本次比賽體驗(yàn)
陳奕霖:之前趙磊跟我們分享其他技術(shù)架構(gòu)時(shí),還只是一個(gè)理念或者概念層面上的,實(shí)際運(yùn)用到 TiDB 上會(huì)怎么樣? TiKV 的問(wèn)題究竟是不是在這里?其實(shí)我們也不是很清楚。通過(guò)這次 Hackathon ,我們證明了這個(gè)想法一定程度是對(duì)的,是確實(shí)有用的,TiKV 也因此得到了改進(jìn)。我想這也是 TPC 這個(gè)項(xiàng)目給 TiKV 這個(gè)產(chǎn)品的進(jìn)化驗(yàn)證了一條正確的路。
對(duì)項(xiàng)目未來(lái)有什么期待?
陳奕霖:我覺(jué)得如果直接把這次在 Hackathon 上使用的技術(shù)棧應(yīng)用到 TiKV 上,可能還不是特別可行。就像唐劉老師在評(píng)價(jià)中提到的,我們用 io uring 遇到了很多問(wèn)題,但是其實(shí)可以轉(zhuǎn)而求其次去使用 Linux AIO 之類(lèi)的。同時(shí),像 Raft engine 這個(gè)東西,它的異步化未來(lái)也是可以推進(jìn)的。這個(gè)項(xiàng)目比較大的作用就是指明了 TiKV 可能的演進(jìn)方向。
總結(jié)
以上是生活随笔為你收集整理的TPC TiKV:Hackathon 中最硬核项目是如何炼成的?| TPC 战队访谈的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 为什么app会被常常攻击?如何预防攻击?
- 下一篇: 安装了PS2022 后,画笔工具使用延迟