Kafka提供了很是多有用的工具,如Kafka設計解析(三)- Kafka High Availability (下)中提到的運維類工具——Partition Reassign Tool,Preferred Replica Leader Election Tool,Replica Verification Tool,State Change Log Merge Tool。本章將介紹Kafka提供的性能測試工具,Metrics報告工具及Yahoo開源的Kafka Manager。git
$KAFKA_HOME/bin/kafka-producer-perf-test.sh
該腳本被設計用於測試Kafka Producer的性能,主要輸出4項指標,總共發送消息量(以MB爲單位),每秒發送消息量(MB/second),發送消息總數,每秒發送消息數(records/second)。除了將測試結果輸出到標準輸出外,該腳本還提供CSV Reporter,即將結果以CSV文件的形式存儲,便於在其它分析工具中使用該測試結果github
$KAFKA_HOME/bin/kafka-consumer-perf-test.sh
該腳本用於測試Kafka Consumer的性能,測試指標與Producer性能測試腳本同樣。web
Kafka使用Yammer Metrics來報告服務端和客戶端的Metric信息。Yammer Metrics 3.1.0提供6種形式的Metrics收集——Meters,Gauges,Counters,Histograms,Timers,Health Checks。與此同時,Yammer Metrics將Metric的收集與報告(或者說發佈)分離,能夠根據須要自由組合。目前它支持的Reporter有Console Reporter,JMX Reporter,HTTP Reporter,CSV Reporter,SLF4J Reporter,Ganglia Reporter,Graphite Reporter。所以,Kafka也支持經過以上幾種Reporter輸出其Metrics信息。服務器
使用JConsole經過JMX,是在不安裝其它工具(既然已經安裝了Kafka,就確定安裝了Java,而JConsole是Java自帶的工具)的狀況下查看Kafka服務器Metrics的最簡單最方便的方法之一。架構
首先必須經過爲環境變量JMX_PORT設置有效值來啓用Kafka的JMX Reporter。如export JMX_PORT=19797
。而後便可使用JConsole經過上面設置的端口來訪問某一臺Kafka服務器來查看其Metrics信息,以下圖所示。運維
使用JConsole的一個好處是不用安裝額外的工具,缺點很明顯,數據展現不夠直觀,數據組織形式不友好,更重要的是不能同時監控整個集羣的Metrics。在上圖中,在kafka.cluster->Partition->UnderReplicated->topic4下,只有2和5兩個節點,這並不是由於topic4只有這兩個Partition的數據是處於複製狀態的。事實上,topic4在該Broker上只有這2個Partition,其它Partition在其它Broker上,因此經過該服務器的JMX Reporter只看到了這兩個Partition。異步
Kafka Manager是Yahoo開源的Kafka管理工具。它支持以下功能:socket
管理多個集羣工具
方便查看集羣狀態性能
執行preferred replica election
批量爲多個Topic生成並執行Partition分配方案
建立Topic
刪除Topic(只支持0.8.2及以上版本,同時要求在Broker中將delete.topic.enable
設置爲true)
爲已有Topic添加Partition
更新Topic配置
在Broker JMX Reporter開啓的前提下,輪詢Broker級別和Topic級別的Metrics
監控Consumer Group及其消費狀態
支持添加和查看LogKafka
安裝好Kafka Manager後,添加Cluster很是方便,只需指明該Cluster所使用的Zookeeper列表並指明Kafka版本便可,以下圖所示。
這裏要注意,此處添加Cluster是指添加一個已有的Kafka集羣進入監控列表,而非經過Kafka Manager部署一個新的Kafka Cluster,這一點與Cloudera Manager不一樣。
Kafka的一個核心特性是高吞吐率,所以本文的測試重點是Kafka的吞吐率。
本文的測試共使用6檯安裝Red Hat 6.6的虛擬機,3臺做爲Broker,另外3臺做爲Producer或者Consumer。每臺虛擬機配置以下:
CPU:8 vCPU, Intel(R) Xeon(R) CPU E5-2680 v2 @ 2.80GHz,2 Sockets,4 Cores per socket,1 Thread per core
內存:16 GB
磁盤:500 GB
開啓Kafka JMX Reporter並使用19797端口,利用Kafka-Manager的JMX polling功能監控性能測試過程當中的吞吐率。
本文主要測試以下四種場景,測試的指標主要是每秒多少兆字節數據,每秒多少條消息。
這組測試不使用任何Consumer,只啓動Broker和Producer。
實驗條件:3個Broker,1個Topic,6個Partition,無Replication,異步模式,消息Payload爲100字節。
測試項目:分別測試1,2,3個Producer時的吞吐量。
測試目標:如Kafka設計解析(一)- Kafka背景及架構介紹所介紹,多個Producer可同時向同一個Topic發送數據,在Broker負載飽和前,理論上Producer數量越多,集羣每秒收到的消息量越大,而且呈線性增漲。本實驗主要驗證該特性。同時做爲性能測試,本實驗還將監控測試過程當中單個Broker的CPU和內存使用狀況
測試結果:使用不一樣個數Producer時的總吞吐率以下圖所示
由上圖可看出,單個Producer每秒可成功發送約128萬條Payload爲100字節的消息,而且隨着Producer個數的提高,每秒總共發送的消息量線性提高,符合以前的分析。
性能測試過程當中,Broker的CPU和內存使用狀況以下圖所示。
(點擊放大圖像)
由上圖可知,在每秒接收約117萬條消息(3個Producer總共每秒發送350萬條消息,平均每一個Broker每秒接收約117萬條)的狀況下,一個Broker的CPU使用量約爲248%,內存使用量爲601 MB。
實驗條件:3個Broker,1個Topic,6個Partition,無Replication,異步模式,3個Producer。
測試項目:分別測試消息長度爲10,20,40,60,80,100,150,200,400,800,1000,2000,5000,10000字節時的集羣總吞吐量。
測試結果:不一樣消息長度時的集羣總吞吐率以下圖所示:
由上圖可知,消息越長,每秒所能發送的消息數越少,而每秒所能發送的消息的量(MB)越大。另外,每條消息除了Payload外,還包含其它Metadata,因此每秒所發送的消息量比每秒發送的消息數乘以100字節大,而Payload越大,這些Metadata佔比越小,同時發送時的批量發送的消息體積越大,越容易獲得更高的每秒消息量(MB/s)。其它測試中使用的Payload爲100字節,之因此使用這種短消息(相對短)只是爲了測試相對比較差的狀況下的Kafka吞吐率。
實驗條件:3個Broker,1個Topic,無Replication,異步模式,3個Producer,消息Payload爲100字節。
測試項目:分別測試1到9個Partition時的吞吐量。
測試結果:不一樣Partition數量時的集羣總吞吐率以下圖所示:
由上圖可知,當Partition數量小於Broker個數(3個)時,Partition數量越大,吞吐率越高,且呈線性提高。本文全部實驗中,只啓動3個Broker,而一個Partition只能存在於1個Broker上(不考慮Replication。即便有Replication,也只有其Leader接受讀寫請求),故當某個Topic只包含1個Partition時,實際只有1個Broker在爲該Topic工做。如以前文章所講,Kafka會將全部Partition均勻分佈到全部Broker上,因此當只有2個Partition時,會有2個Broker爲該Topic服務。3個Partition時同理會有3個Broker爲該Topic服務。換言之,Partition數量小於等於3個時,越多的Partition表明越多的Broker爲該Topic服務。如前幾篇文章所述,不一樣Broker上的數據並行插入,這就解釋了當Partition數量小於等於3個時,吞吐率隨Partition數量的增長線性提高。
當Partition數量多於Broker個數時,總吞吐量並未有所提高,甚至還有所降低。可能的緣由是,當Partition數量爲4和5時,不一樣Broker上的Partition數量不一樣,而Producer會將數據均勻發送到各Partition上,這就形成各Broker的負載不一樣,不能最大化集羣吞吐量。而上圖中當Partition數量爲Broker數量整數倍時吞吐量明顯比其它狀況高,也證明了這一點。
實驗條件:3個Broker,1個Topic,6個Partition,異步模式,3個Producer,消息Payload爲100字節。
測試項目:分別測試1到3個Replica時的吞吐率。
測試結果:以下圖所示:
由上圖可知,隨着Replica數量的增長,吞吐率隨之降低。但吞吐率的降低並不是線性降低,由於多個Follower的數據複製是並行進行的,而非串行進行。
實驗條件:3個Broker,1個Topic,6個Partition,無Replication,異步模式,消息Payload爲100字節。
測試項目:分別測試1到3個Consumer時的集羣總吞吐率。
測試結果:在集羣中已有大量消息的狀況下,使用1到3個Consumer時的集羣總吞吐量以下圖所示:
由上圖可知,單個Consumer每秒可消費306萬條消息,該數量遠大於單個Producer每秒可消費的消息數量,這保證了在合理的配置下,消息可被及時處理。而且隨着Consumer數量的增長,集羣總吞吐量線性增長。
根據Kafka設計解析(四)- Kafka Consumer設計解析所述,多Consumer消費消息時以Partition爲分配單位,當只有1個Consumer時,該Consumer須要同時從6個Partition拉取消息,該Consumer所在機器的I/O成爲整個消費過程的瓶頸,而當Consumer個數增長至2個至3個時,多個Consumer同時從集羣拉取消息,充分利用了集羣的吞吐率。
實驗條件:3個Broker,1個Topic,6個Partition,無Replication,異步模式,消息Payload爲100字節。
測試項目:測試1個Producer和1個Consumer同時工做時Consumer所能消費到的消息量。
測試結果:1,215,613 records/second。