精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

RaftKeeper v2.1.0版本發布,性能大幅提升!

京東云 ? 來源:jf_75140285 ? 作者:jf_75140285 ? 2024-07-15 15:10 ? 次閱讀

RaftKeeper 是一款高新能分布式共識服務,完全兼容 Zookeeper 但性能更出色,更多關于 RaftKeeer 參考Github,我們將 RaftKeeper 大規模應用到 ClickHouse 場景中,用于解決 ZooKeeper 的性能瓶頸問題,同時 RaftKeeper 也可以用于其它大數據組件比如 HBase。

v2.1.0 作為 v2.0.0 后的重要版本,引入了一系列新特性,包括異步創建 snapshot。該版本的最大亮點在于性能優化:寫請求性能提升 11%,讀寫混合場景更是大幅提升了 118% 。本文將從工程細節的角度深入解析新版本的改進與優化。

一、性能優化效果

在性能測試中,我們使用了raftkeeper-bench工具,測試環境為三個節點組成的集群,每個節點配置為 16 核 CPU、32GB 內存和 100GB 存儲空間。測試對象包括 RaftKeeper v2.1.0、RaftKeeper v2.0.4 和 ZooKeeper 3.7.1,均采用默認配置。

測試分為兩組:

第一組測試純 create 操作的性能,create 操作的 value 大小為 100 字節。結果顯示,RaftKeeper v2.1.0 相較于 v2.0.4 性能提升了 11%,相較于 ZooKeeper 性能提升了 143%。

wKgZomaUy2WAdQS0AADauYIyalQ672.png

第二組請求比例為 create-1%、set-8%、get-45%、list-45%、delete-1%。其中,list 請求結果包含 100 個子節點,每個子節點大小為 50 字節;get、set、create 請求的節點 value 大小為 100 字節。結果顯示,RaftKeeper v2.1.0 相較于 v2.0.4 性能提升了 118%,相較于 ZooKeeper 性能提升了 198%。

wKgaomaUy2aAZ-PhAADLBPDZjYg815.png

rk2.1.0 版本在測試中 avgRT 和 TP99 指標均優于 rk2.0.4,具體可以參考測試報告。

二、性能優化

接下來從工程細節的角度,介紹一些 v2.1.0 的優化點。

1. 響應并行序列化

RaftKeeper 被我們廣泛應用到 ClickHouse 中,下圖是一個規模較大的 RaftKeeper 集群的火焰圖,通過火焰圖發現 ResponseThread 線程消耗不少 CPU 時間片,其中大概三分之一時間片用于序列化響應。

wKgZomaUy2iAKXWzAAez_1JQguQ215.png

ResponseThread 負責序列化響應并且轉發給 IO 線程,它是一個單線程,串行執行序列化會增大延遲。我們可以把響應的序列化交給 IO 線程來做,以并發的方式提高吞吐。

同時可以看到sdallocx_default函數占用了不少時間片,該函數是 jemelloc 釋放內存的函數,函數對于時間片的消耗沒有問題,但是該操作在基于 mutex 的同步隊列中執行會增加鎖的時間。

/// responses_queue是一個基于mutex的同步隊列,在tryPop方法中釋放response_for_session會增加lock的時間

復制代碼

解決的方式是在 tryPop 方法前先釋放 response_for_session 的內存空間。

下面的表格展示了優化前后的性能指標,測試共有四組每組使用不同的并發度,其中響應大小為 50bytes,當并發度為 10 的時候,TPS 增加 31%,AvgRT 降低 32%。

wKgaomaUy2iAalpvAABcXLmCMzc751.png

2. 優化 List 請求

依然是同一個 RaftKeeper 集群,通過火焰圖發現,List 請求處理幾乎消耗了 request-processor 線程所有的 CPU 時間片。在 RaftKeeper 的執行鏈路中 request-processor 負責處理用戶的請求,它是一個單線程,所以比較容易成為瓶頸點。

通過火焰圖可以發現兩個瓶頸點:1.為字符串分配內存空間;2.插入 vector。

wKgZomaUy2mAejdPAAF_jyc-r0g487.png

List 請求返回的結果是一個 std::vector動態數組,其內存 layout 如下圖所示,每個成員是一個字符串,每個字符串需要分配一塊動態內存用于保存數據,所以當字符串多的時候需要大量的動態內存分配。

wKgaomaUy2mAQ3SKAAAc_lBtAbI960.png

一個很直觀的優化思路,可以設計一個 compact strings,數據采用緊湊的方式存儲,在以下的設計中,采用兩個連續內存空間,一個用于存儲數據,一個用于存儲 offset,具體參考:CompactStrings實現。

wKgZomaUy2qAdJJlAAAe2TLPHis649.png

優化后從火焰圖方面看 List 請求處理在 CPU 的占比從 5.46%下降到 3.37%,進行 List 請求的 benchmark 測試,TPS 從 45.8w/s 增長到 61.9w/s,同時 TP99 更低。

優化前:

復制代碼

3. 優化無用的系統調用

系統調用會引起用戶態和內核態的上下文切換,往往系統調用函數會有比較大的開銷,我們通過 bpftrace 對 RaftKeeper 進行了 profile

BPFTRACE_MAX_PROBES=1024 bpftrace -p 4179376 -e ' 

復制代碼

發現大量的getsockname和getsockopt系統調用占用了不少開銷。

Execution count:

復制代碼

這些系統調用本不該存在,經過排查發現是在打印日志的時候錯誤的進行了調用。

const auto socket_name = sock.isStream() ? sock.address().toString() : sock.peerAddress().toString();

復制代碼

4. 線程池優化

下圖是一次 benchmark(讀寫 4:6 的比例)RaftKeeper 的火焰圖,進行性能瓶頸分析發現,發現 request-processor 線程的 CPU 時間片大部分時間(超過 60%)消耗在條件變量等待的調用。

wKgaomaUy2uAGQ88AALL6JbEvN0188.png

在 RaftKeeper 的主執行鏈路中 request-processor 線程負責處理用戶請求,它的主要流程可以簡單抽象為:1. 對于寫請求,單線程處理;2. 對于讀請求,通過線程池并發處理,然后調用 request_thread->wait()阻塞等待所有讀取請求完成。

/// 1. process read-request by a thread pool

復制代碼

增加監控指標分別統計讀和寫請求的執行時間發現,在讀請求和寫請求數量幾乎相同的情況下,讀請求的處理延時是寫請求的 3 倍。

因為每個請求的處理時間很短,到這里可以推測出,線程池任務調度的時間不可忽視,所以出現了性能下降。解決方式是去掉線程池,單線程處理讀請求,以下 benchmark 是優化前后 benchmark 結果,TPS 提升 13%。

優化前:

復制代碼

三、Snapshot 優化

1. 異步 snapshot

在 RaftKeeper 整個請求處理鏈路中,創建 snapshot 是在主鏈路中進行處理的,當數據量大的時候會長時間阻塞用戶請求,造成請求超時、leader 切換等引起服務不可用的問題,在我們線上場景中對于 6000w 的數據做 snapshot 需要 180s。

為了解決以上問題,新版本中支持了異步 snapshot,當需要創建 snapshot 的時候首先將整個 DataTree 拷貝一份,這一步在主線程中處理,然后在后臺將拷貝的 DataTree 序列化到磁盤中。

wKgZomaUy2yARXWsAABfwEpzgW8379.png

采用這用方式 6000w 的數據做 snaphot 對用戶的阻塞時間從 180s 降低到了 4.5s,但是這種方案也有一些負面效果,需要額外消耗大于 50%的內存。

為了進一步降低對用戶的阻塞時間,對 DataTree 拷貝進行了進一步優化。DataTree 拷貝其實是一個計算密集型的任務,所以可以采用向量化的方式,同時會遍歷 hashmap 可以適當進行 prefetch。

inline void memcopy(char * __restrict dst, const char * __restrict src, size_t n)

復制代碼

上面的拷貝函數基于 SSE 指令集,優化后 DataTree 拷貝時間從 4.5s 降低到 3.5s。

2. Snapshot 加載速度優化

RaftKeeper 老版本中,啟動服務之后 snapshot 加載速度比較慢,線上一個作為 ClickHouse metadata 存儲的 Raftkeeper 有 6kw 的數據,在 NVMe 磁盤的服務器上加載 snapshot 需要 180s,導致服務啟動速度很慢。

加載 snapshot 主要分兩步,第一步讀取磁盤上的數據,反序列化成節點;第二步遍歷 DataTree 并構建父子關系,其中第一步是并行的,第二步是單線程的。

wKgaomaUy2yAOULmAAC8Yml_fZY584.png

由于第二步是單線程執行,可以改成并行的方式,并行化改造的基礎是 DataTree 是一個二層 HashMap 結構,改造后每個線程負責固定的 bucket,這樣避免了并發問題。具體流程為首先從磁盤讀取數據并按照 bucket 的粒度存儲節點和父子關系,然后填充 DataTree 并構建父子關系。

優化后加載 snapshot 時間從 180s 降低到 99s,之后又通過鎖優化、snapshot 格式優化、減少數據拷貝等手段將時間降低到 22s。

四、上線效果

我們選取線上一個對 ZooKeeper 請求量大的 ClickHouse 集群,在 ClickHouse 測的監控指標看 QPS 大概為 17w/s,其中絕大部分為 List 請求。依次將其從 ZooKeeper 升級到 RaftKeeper v2.0.4 和 v2.1.0,觀察監控指標

wKgZomaUy26AVk7ZAABqnh49Wz0186.png

wKgZomaUy26AJFCuAABak5klZPM516.png

可以看到 RaftKeeper v2.0.4 的表現不及 ZooKeeper(主要原因是該場景下絕大部分請求是 list,v2.0.4 對于 list 請求性能較差),但是 v2.1.0 有比較大幅的優勢。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 內存
    +關注

    關注

    8

    文章

    3004

    瀏覽量

    73900
  • 性能
    +關注

    關注

    0

    文章

    271

    瀏覽量

    18972
  • zookeeper
    +關注

    關注

    0

    文章

    33

    瀏覽量

    3665
收藏 人收藏

    評論

    相關推薦

    nonos sdk V2.1.0中使用混雜模式api,運行時崩潰了怎么解決?

    我正在努力在 nonos sdk V2.1.0 中使用混雜模式 api,并且我*有時*在注冊回調后立即崩潰。從轉儲中可以看出,這似乎位于 sdk 的深處,并且它正在嘗試找到 128 字節緩沖區中的一
    發表于 07-10 08:18

    DLC發布V5.0版本增加哪些測試要求

    次光效提升,平均提升10.8%,提升23%。??1.2相較于一版草稿,部分產品光效要求又做了提升,另外本次草稿
    發表于 02-24 17:32

    求STM8庫函數中文使用手冊要V2.1.0

    前輩們,誰有STM8庫函數中文使用手冊要V2.1.0
    發表于 03-26 14:21

    RT-Thread Studio for VS Code來了 精選資料分享

    來源 | RT-Thread轉眼間RT-Thread Studio V2.1.0已經發布兩個多月了,估計很多用戶已經在翹首期待V2.1.1更新完善版本了,
    發表于 07-20 07:28

    STM32MP151C構建Custom Board“Eco system V2.1.0”發行版時存在不創建devicetree符號鏈接怎么解決?

    大家好基于STM32MP151C芯片構建Custom Board“Eco system V2.1.0”發行版時,存在不創建devicetree符號鏈接的問題。自定義板設備樹的符號鏈接未在
    發表于 01-12 07:05

    串口ISP下載軟件Flash Loader Demonstrator V2.1.0的免費下載

    串口ISP下載軟件Flash_Loader_Demonstrator_V2.1.0:Cortex-M3串口對STM32燒寫程序。
    發表于 11-24 11:41 ?89次下載
    串口ISP下載軟件Flash Loader Demonstrator <b class='flag-5'>V2.1.0</b>的免費下載

    談談FreeRTOS_V 10版本

    談談FreeRTOS_V10版本
    的頭像 發表于 03-12 14:01 ?5258次閱讀

    Oculus Quest V18版本發布 大幅優化用戶體驗

    據外媒vrfocus報道,Oculus近期發布Oculus Quest V18版本,用戶通過使用該版本將能體驗一整套功能完善的全新功能。
    發表于 07-13 15:10 ?1661次閱讀

    RT-Thread Studio V2.1.0發布,支持用戶自制開發板支持包!

    不知不覺已經到了牛年的3月份,春天已經悄悄的來臨,天氣逐漸回暖,萬物復蘇,RT-Thread Studio V2.1.0版本終于可以“破土而出”和大家見面了。為了便于大家參與到Studi...
    發表于 12-16 16:52 ?9次下載
    RT-Thread Studio <b class='flag-5'>V2.1.0</b><b class='flag-5'>發布</b>,支持用戶自制開發板支持包!

    大疆智圖3.4.0版本更新 大幅提升用戶體驗

    4 月28日,大疆智圖迎來 3.4.0 版本更新,新增多項功能:自定義三維重建分塊、自定義三維模型坐標原點、二維可見光及多光譜重建的光照均勻與去霧模式。另外進行了多項功能優化,大幅提升用戶體驗。
    的頭像 發表于 04-29 10:46 ?2777次閱讀

    瑞薩靈活軟件包 (FSP) v2.1.0 用戶手冊

    瑞薩靈活軟件包 (FSP) v2.1.0 用戶手冊
    發表于 02-03 19:28 ?2次下載
    瑞薩靈活軟件包 (FSP) <b class='flag-5'>v2.1.0</b> 用戶手冊

    瑞薩靈活軟件包(FSP) v2.1.0 用戶手冊

    瑞薩靈活軟件包 (FSP) v2.1.0 用戶手冊
    發表于 07-04 20:01 ?0次下載
    瑞薩靈活軟件包(FSP) <b class='flag-5'>v2.1.0</b> 用戶手冊

    Embedded office發布安全插件V1.1版本

    Embedded office很高興地宣布安全插件V1.1版本發布了!現在通過外部設備或不同核心架構的專門通道支持端到端受保護的安全通信。
    的頭像 發表于 02-20 11:12 ?589次閱讀

    ENV-Windows v2.0.0版本發布

    ENV-Windows v2.0.0版本發布
    的頭像 發表于 06-26 08:35 ?634次閱讀
    ENV-Windows <b class='flag-5'>v</b>2.0.0<b class='flag-5'>版本</b><b class='flag-5'>發布</b>

    國產網表級功耗分析EDA大幅提升精度與性能

    (摘要:英諾達隆重推出EnFortius? GPA? V24.08版本,新增波形重放(Waveform Replay)功能,大幅提高功耗分析精度與效率,新版本同時增加了對毛刺功耗的分析
    發表于 09-12 11:22 ?300次閱讀
    國產網表級功耗分析EDA<b class='flag-5'>大幅</b><b class='flag-5'>提升</b>精度與<b class='flag-5'>性能</b>