ApacheKafka基準測試:每秒寫入2百萬(在三臺廉價機器上)(二)

青衫無名發表於2017-05-18

生產者吞吐量與儲存資料

許多訊息系統的隱藏危險之一是,對於在記憶體中保留的資料,它們工作的很好。但當資料備份不消耗(因此需要儲存在磁碟上)時,它們的吞吐量下降一個數量級(或更多)。這意味著只要您的消費者保持訊息佇列及時清掉,事情就可以正常執行。但是一旦它們滯後,整個訊息層將備份未消耗的資料。備份導致資料進入磁碟,這反過來會導致效能下降到一個速率,這意味著訊息傳遞系統不能再跟上傳入的資料,並把它們備份或者直接掛掉。這是非常可怕的,因為在許多情況下,佇列的終極目的是優雅地處理這樣的情況。

由於Kafka對於未消費的訊息,總是保證O(1)的效能。

為了測試這個實驗,讓我們執行一段更長的時間,並在儲存的資料集增長時繪製結果:

該圖實際上顯示了效能方面的變化,但跟資料大小沒有影響,寫入TB資料後跟最初寫入幾百MB效能一樣好。

這種差異是由於Linux的I / O管理設施批處理資料,然後定期重新整理。我們在Kafka生產叢集配置上設定得更好。http://kafka.apache.org/documentation.html#hwandos

消費者吞吐量

現在讓我們將注意力轉向消費者吞吐量。

注意,複製因子不會影響此測試的結果,因為消費者只能從一個副本讀取,無視副本數量。同樣,生產者的確認級別也不重要,因為消費者只讀取完全確認的訊息(即使生產者不等待完全確認)。這是為了確保消費者看到的任何訊息是在leader切換(如果當前leader失敗)之後。

單個消費者

90452條記錄/秒(89.7 MB /秒)

第一次測試,我們將在一個執行緒從我們的6分割槽3副本主題消費5000萬條訊息。

kafka的消費者是非常高效的。它通過從檔案系統直接獲取日誌塊來工作。它使用sendfile API直接通過作業系統傳輸,而無需通過應用程式複製此資料的開銷。這個測試實際上是從日誌頭部開始,所以它正在做真正的I / O讀取。然而,在生產環境中,消費者幾乎完全從作業系統頁面快取中讀取,因為它正在讀取剛剛由一些生產者寫入的資料(因此仍然被快取)。實際上,如果您在生產伺服器上執行I / O stat,看到即使消耗了大量資料,也沒有任何物理讀取。

對於期望的Kafka,消費者廉價是很重要的。一方面,副本自身就是消費者,所以讓消費者便宜,使得複製便宜。另外,這樣可以將資料處理變成一種廉價的操作,因此我們不需要緊緊控制可擴充套件性。

三個消費者

2615968個記錄/秒(249.5 MB /秒)

讓我們重複同樣的測試,但是執行三個並行的消費者程式,每個程式在不同的機器,並且消耗同一主題。

如預期的那樣,基本是線性擴充套件。(不奇怪,因為我們的模型中的消費者是如此簡單)。

生產者和消費者

795064記錄/秒(75.8 MB /秒)

上述測試只包括生產者和消費者獨立執行。現在我們來做更符合實際情況的事情,一起執行。實際上,在技術上已經這樣做了,因為我們的副本複製是把伺服器當作消費者來實現的。

我們來執行測試。對於此測試,我們將在六分割槽3副本主題上執行一個生產者和一個消費者,這些主題將開始為空。生產者使用非同步複製。報告的吞吐量是消費者吞吐量(生產者吞吐量的上限)。

正如我們預期的那樣,結果基與只有生產者的情況相同 – 消費者相當便宜。

訊息大小的影響/

之前報告的是100位元組的小訊息。較小的訊息是訊息系統更難的問題,因為它們會放大系統記錄的開銷。改變記錄大小,在按照條數/秒和MB /秒中繪製吞吐量來證明。


正如預期,這個圖表顯示由於資料變大,我們每秒可以傳送的記錄的原始記錄條數減少。但是,如果在MB /秒圖中,隨著訊息變大,實際使用者資料的總位元組吞吐量增加:

使用10個位元組的訊息,實際上被CPU來限制,因為是獲取鎖和傳送訊息入隊操作,不能最大限度地發揮網路效能。然而,從100位元組開始,網路開始飽和(儘管MB / sec持續增加,因為固定大小的位元組與傳送總位元組佔比的越來越小)。

端到端延遲

2ms(中位數)

3毫秒(99百分位數)

14毫秒(99.9百分位數)

關於吞吐量,我們已經談到了很多,但是什麼是訊息傳遞的延遲?

也就是說,我們傳送給消費者的訊息需要多長時間?

對於這個測試,我們將建立生產者和消費者,並針對生產者向kafka叢集傳送訊息需要多長時間,被消費者接收進行多次計時。

注意,Kafka只有所有同步副本確認訊息時,才向消費者發出訊息。無論是使用同步還是非同步複製,這個測試將給出相同的結果。因為該設定隻影響生產者的確認。

重複測試

如果你想在自己的機器上嘗試這些基準測試,完全沒問題。正如我所說,我大多隻是使用我們與Kafka一起提供的預裝效能測試工具,並且主要使用伺服器和客戶端的預設配置。您也可以在此處檢視有關配置和命令的更多詳細資訊https://gist.github.com/jkreps/c7ddb4041ef62a900e6c。

轉載自 併發程式設計網 – ifeve.com


相關文章