ClickHouse最大QPS到底咋估算?

来源:https://www.cnblogs.com/JavaEdge/p/18087707
-Advertisement-
Play Games

ClickHouse是用於分析的OLAP資料庫,因此典型的使用場景是處理相對較少的請求 — 從每小時幾個到每秒幾十甚至幾百個不等 — 但會影響到大量數據(幾GB/數百萬行)。 但是在其他情況下,它的表現如何?讓我們嘗試用大量小請求來測試ClickHouse如何處理。這將幫助我們更好地瞭解可能的使用場 ...


ClickHouse是用於分析的OLAP資料庫,因此典型的使用場景是處理相對較少的請求 — 從每小時幾個到每秒幾十甚至幾百個不等 — 但會影響到大量數據(幾GB/數百萬行)。

但是在其他情況下,它的表現如何?讓我們嘗試用大量小請求來測試ClickHouse如何處理。這將幫助我們更好地瞭解可能的使用場景範圍和限制。

本文分為兩個部分:

  • 連接基準測試和測試設置
  • 涉及實際數據的最大QPS的場景

環境

對於初始測試,我選擇了一臺舊工作站:

  • 4核 Intel(R) Core(TM) i5-2400 CPU @ 3.10GHz
  • 8GB RAM
  • SSD硬碟
  • CentOS 7

本文中呈現的結果是從該電腦收集的,但當然,很有趣的是在更強大的硬體上重覆這些測試。我把這項任務交給我們的讀者,這樣你就可以在自己的硬體上測試ClickHouse在不同場景下的最大QPS。如果你這樣做了,請分享你的結果!為了運行基準測試,我還創建了一組腳本,可以在Altinity的GitHub上免費獲取:https://github.com/Altinity/clickhouse-sts/。這些腳本需要Docker(我使用的是v18.09)和Bash。要運行測試套件,只需克隆GitHub存儲庫,併在根文件夾中運行‘make test’命令。它會在你的主機上執行所有測試(需要幾個小時),並將結果放入一個CSV文件中,稍後可以在Excel、Pandas或ClickHouse本身中進行分析。當然,你也可以分享你的發現,以便與本文中的結果進行比較。

這些腳本使用了以下工具:

這兩個工具都允許你創建所需併發量的負載(模擬不同數量的併發客戶端),並測量每秒處理的查詢數和延遲百分位數。

關於ClickHouse處理併發請求的幾點說明

預設情況下,ClickHouse可以處理高達4096個入站連接(max_connections在伺服器配置文件中設置),但只會同時執行100個查詢(max_concurrent_queries),因此所有其他客戶端將在隊列中等待。客戶端請求可以保持在隊列中的最長時間由queue_max_wait_ms設置定義(預設為5000或5秒)。這是一個用戶/配置文件設置,因此用戶可以定義較小的值,在隊列過長的情況下提示異常。http連接的長連接超時預設相對較短 — 3秒(keep_alive_timeout設置)。

還有許多高級網路相關設置,用於微調不同的超時、輪詢間隔、監聽回溯大小等設置。

HTTP ping:HTTP伺服器的理論最大吞吐量

首先,讓我們檢查ClickHouse自身使用的HTTP伺服器有多快。換句話說,伺服器可以處理多少個“無所事事”的請求。

對於HTTP,兩種主要情況很重要:

  • 使用保持連接(保持持久連接進行多個請求,而無需重新連接)
  • 不使用保持連接(每個請求都建立新連接)

此外,預設情況下ClickHouse的日誌級別非常詳細(‘trace’)。對於每個查詢,它會嚮日志文件寫入幾行,這對於調試很好,但當然會增加一些額外的延遲。因此,我們還要檢查禁用日誌的相同2種場景。

我們對不同併發級別進行了測試,以模擬不同數量的同時連接的客戶端(一個接一個地發送請求)。每個測試執行15秒,然後取每秒處理的平均請求數。

結果:

img

在X軸上,您可以看到同時連接的客戶端數。在Y軸上,我們有每個特定場景中每秒處理的平均請求數。

好吧,結果看起來不錯:

  • 在每個場景中,在8到64個併發連接之間,QPS的最大值都在那台機器上。
  • 最大吞吐量約為97K QPS,啟用保持連接並禁用日誌。
  • 啟用日誌時,速度要慢大約30%,大約為71K QPS。
  • 兩個不使用保持連接的變體要慢得多(約為18.5 kqps),甚至在這裡看不出日誌開銷。這是預期的,因為使用保持連接,ClickHouse肯定可以處理更多的ping,因為跳過了為每個請求建立連接的額外成本。

現在我們對最大理論可能吞吐量有了感覺,以及ClickHouse Web伺服器可以實現的併發級別。實際上,ClickHouse的HTTP伺服器實現相當快。例如,NGINX在相同的機器上使用預設設置大約可以提供30K每秒。

SELECT 1

讓我們再進一步,檢查一個微不足道的 ‘SELECT 1’ 請求。這樣的查詢在查詢解析階段被‘執行’,因此這將展示‘網路 + 授權 + 查詢解析器 + 格式化結果’的理論最大吞吐量,即真實請求永遠不會更快。

我們將測試使用保持連接和不使用保持連接的http和https選項,以及本地客戶端(安全和非安全)。

結果如下:

img

這些結果與簡單的ping相比顯示了相當大的降級。我們得到了:

  • 最佳情況下約為14K QPS:http & 保持連接。
  • https & 保持連接情況稍差(13K QPS)。在這種情況下,https的開銷並不顯著。
  • http 不使用保持連接時約為10.7 kqps。
  • 本地客戶端(不安全)約為10.1 kqps。
  • 本地客戶端(安全)約為9.3 kqps。
  • 無保持連接的https表現相當差,約為4.3 kqps。

在最高併發級別上,我們註冊了幾十個連接錯誤(即少於0.01%),這很可能是由於操作系統層面的套接字重用問題引起的。ClickHouse在該測試中表現穩定,我沒有註冊到任何明顯的問題。

本地協議顯示的性能比http更差可能會讓人驚訝,但實際上這是預期的:本地TCP/IP更加複雜,具有許多額外的協議特性。它不適合高QPS,而是適合傳輸大塊數據。

此外,在本地客戶端中,隨著併發性增加,QPS會出現相當大的下降,在更高的併發級別(>3000)時系統會變得不響應並返回無結果。這很可能是由於clickhouse-benchmark工具為每個連接使用一個單獨的線程,線程數和上下文切換過多導致的。

現在讓我們看看延遲,即每個客戶端等待答案的時間。這個數字在每個請求中會有所變化,因此圖表顯示了每種情況下延遲的90th percentile。這意味著90%的用戶得到的答案比顯示的數字更快。

延遲(90th percentile)– 1-256 併發級別

img

隨著併發性的增長,延遲的惡化是可以預料的。目前看起來非常不錯:如果您少於256個併發用戶,您可以期望延遲在50毫秒以下。

讓我們看看高併發性會如何影響。

延遲(90th percentile)– >256 併發級別

img

現在延遲的惡化更為顯著,而且本地協議再次顯示出最差的結果。

有趣的是,不使用保持連接的http請求表現非常穩定,並且即使有2K併發用戶,延遲也低於50ms。沒有保持連接時,延遲更加可預測,並且標準差在併發性增加時保持較小,但QPS會略有降低。這可能與Web伺服器的實現細節有關:例如,當使用每個連接一個線程時,線程上下文切換可能會減慢伺服器速度,併在一定併發級別後增加延遲。

我們還檢查了其他設置,如max_concurrent_queriesqueue_max_wait_msmax_threadsnetwork_compression_methodenable_http_compression以及一些輸出格式。在這種情況下調整它們的影響大多是可以忽略的。

多線程的影響

預設情況下,ClickHouse使用多個線程處理更大的查詢,以有效利用所有CPU核心。

然而,如果您有大量併發連接,多線程將會增加上下文切換、重新加入線程和工作同步方面的額外成本。

為了衡量併發連接與多線程之間的相互作用,讓我們來看一下使用預設多線程設置和max_threads=1設置進行的合成選擇,以找到最大的100K個隨機數的差異。

img

結論非常簡單:在高併發場景中實現更高的QPS,使用max_threads=1設置。

未完待續…

本文涵蓋了對ClickHouse的一般連接性測試。我們檢查了伺服器本身的速度有多快,它可以處理多少簡單查詢以及哪些設置會影響高併發場景下的QPS。請查看後續文章,我們將深入估算在鍵值場景中實際查詢的最大QPS,這將為測試案例添加數據。

關註我,緊跟本系列專欄文章,咱們下篇再續!

作者簡介:魔都技術專家兼架構,多家大廠後端一線研發經驗,各大技術社區頭部專家博主。具有豐富的引領團隊經驗,深厚業務架構和解決方案的積累。

負責:

  • 中央/分銷預訂系統性能優化
  • 活動&優惠券等營銷中台建設
  • 交易平臺及數據中台等架構和開發設計

目前主攻降低軟體複雜性設計、構建高可用系統方向。

參考:

本文由博客一文多發平臺 OpenWrite 發佈!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 剛做完一道模板A*,看到這題我直接小腦萎縮了... 阿米諾斯!這怎麼用A*?!——剛開題的我 beeeeeeeeee like 甚至比模板簡單(這是綠的...) 其實會是會但是紙張的是這玩意我不會搞估價函數我草! 然後突然想到能不能把這個狀態下有多少個數字不在目標位置作為估價函數? 我喜歡 \(ID ...
  • 引言 在JDK1.2之前Java並沒有提供軟引用、弱引用和虛引用這些高級的引用類型。而是提供了一種基本的引用類型,稱為Reference。並且當時Java中的對象只有兩種狀態:被引用和未被引用。當一個對象被引用時,它將一直存在於記憶體中,直到它不再被任何引用指向時,才會被垃圾回收器回收。而被引用也就是 ...
  • 拓展閱讀 Devops-01-devops 是什麼? Devops-02-Jpom 簡而輕的低侵入式線上構建、自動部署、日常運維、項目監控軟體 代碼質量管理 SonarQube-01-入門介紹 項目管理平臺-01-jira 入門介紹 缺陷跟蹤管理系統,為針對缺陷管理、任務追蹤和項目管理的商業性應用軟 ...
  • 概述:在C++中,序列點是表達式中確保求值順序的點。其缺失可能導致未定義行為。基礎功能示例演示了自增運算符的序列點,而高級功能示例展示了函數調用的序列點,有助於避免不確定行為。在編寫代碼時遵循序列點規則是確保程式行為可預測的關鍵。 在C++中,序列點是在表達式中保證求值順序的點。未定義的行為通常涉及 ...
  • 概述:C++中的對象切片指通過將派生類對象賦值給基類對象,導致派生部分被“切掉”,只保留基類部分。這可能發生在值傳遞、賦值等操作中。對象切片的基礎功能示例展示了派生類對象賦值給基類對象時的現象,而高級功能示例則展示了通過基類指針實現派生類對象的訪問和多態。 對象切片(Object Slicing)是 ...
  • 效果圖: 方法如下: 1.簡單版(較繁瑣但是直觀): 1.1 定義資料庫模型(models.py)中添加表 class ProductSample(models.Model): # 示例商品表 id = models.AutoField(db_column='ID', primary_key=Tru ...
  • 1、https://leetcode.cn/problems/gas-station/submissions/514930619/?envType=study-plan-v2&envId=top-interview-150 對於這個問題可以這樣來考慮,將數據看作一個環,如果答案唯一,那麼就意味著從任 ...
  • 封裝 高內聚,低耦合 高內聚:類內部操作自己完成,不允許外部干涉。 低耦合:僅暴露少量的方法給外部使用。 封裝(數據的隱藏)通常應禁止直接訪問一個對象中數據的實際表達,而應該通過操作介面來訪問,這稱為信息的隱藏。 封裝的特點 1.提高程式的安全性,保護數據 2.隱藏代碼的實現細節 3.統一介面 4. ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...