日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Kafka性能监控与优化

發布時間:2023/12/20 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Kafka性能监控与优化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一 、性能監控

1 查看機器負載top:

右上角?load average 的 3 個值 1.29 ,0.74, 1.34 代表過去1分鐘、5分鐘 、15分鐘load average

假如 load值為5.2,? cpu核數為4? ,均值1.3>1 ,則存在進程搶不到CPU。? 如下值1.29說明負載較小,均負載在1.29/4 = 0.32

如果load值越來越大,說明負載持續增加

第三行cpu(s)表示用戶進程使用CPU時間總的占比平均值。

如下圖12個Core,? 所有us求和取平均值,? 及cpu(s)= 400/12 =34%

top 然后打 1 即可查看每個核心情況。

?

清單中的 %CPU, 上次更新到現在的CPU時間占用百分比。? ? ? ?top + c 可以查看 COMMAND完整的啟動進程命令,定位是哪一個應用。

%CPU顯示的是進程占用一個核的百分比,而不是整個cpu(8核)的百分比,有時候可能大于100,那是因為該進程啟用了多線程占用了多個核心,所以有時候我們看該值得時候會超過100%,但不會超過總核數*100。

?

?

?

2 kafka?GC日志路徑查看。

kafka的GC日志:/run/cloudera-scm-agent/process/150-kafka-KAFKA_BROKER

日志文件名類似:kafkaServer-gc.log

GC說明,參看?https://blog.csdn.net/qq_38157516/article/details/80451599

? ? ? ??https://blog.csdn.net/xiaodu93/article/details/61926114

? ? ? ??http://www.knowsky.com/957110.html

2.1 FULL GC頻率和時長

? ? ?長時間的停頓會令 Broker 端拋出各種超時異常。

2.2 活躍對象大小

? ??這個指標是你設定堆大小的重要依據,同時它還能幫助你細粒度地調優 JVM 各個代的堆大小。

? ? ? 活躍對象大小,即經過FULL GC后,老年代還剩余的存活對象大小(可以取多次平均值)。

如果FULL GC后剩余對象500M存活,設置老年代堆大小設置成該數值的 1.5 倍或 2 -3倍,即大約 1.0GB比較安全。

?newRatio參數,設定了新生代和老年代比值,默認值為2(old/new). 一般設置為老年存活對象的1.2到2倍

永久代設置1.2-2倍。

?具體設置建議,參考:https://blog.csdn.net/zfgogo/article/details/81260172

如果頻繁FULL GC,? 可以開啟 G1 的 -XX:+PrintAdaptiveSizePolicy 開關(默認的 GC 收集器設置為 G1),讓 JVM 告訴你到底是誰引發了 Full GC。

?

2.3?應用線程總數。這個指標幫助你了解 Broker 進程對 CPU 的使用情

?

3 集群監控

3.1 檢查broker是否啟動。

? ? ?并且查看端口是否建立監聽。

3.2?broker關鍵日志查看

? ? ? ?1)監控 kafka? ,log compaction線程是否正常運行。

? ? ? ?2)副本拉取消息的線程,通常以 ReplicaFetcherThread 開頭

? ? ? ? ? ? 線程掛掉,不再從 Leader 副本拉取消息,因而 Follower 副本的 Lag 會越來越大。

? ? ? ?上述異常,立即查看kafka 日志信息

? ? ? ?一般日志路徑:/var/log/kafka/kafka-broker-hadoop001.log

?3.3?Broker 端的關鍵 JMX 指標

? ? ? ?1)BytesIn/BytesOut:即 Broker 端每秒入站和出站字節數。你要確保這組值不要接近你的網絡帶寬,否則這通常都表示網卡已被“打滿”,很容易出現網絡丟包的情形

? ? ? ? 2)?NetworkProcessorAvgIdlePercent:即網絡線程池線程平均的空閑比例。通常來說,你應該確保這個 JMX 值長期大于 30%。如果小于這個值,就表明你的網絡線程池非常繁忙,你需要通過增加網絡線程數或將負載轉移給其他服務器的方式,來給該 Broker 減負。

? ? ? ? ?3)RequestHandlerAvgIdlePercent:即 I/O 線程池線程平均的空閑比例。同樣地,如果該值長期小于 30%,你需要調整 I/O 線程池的數量,或者減少 Broker 端的負載。

? ? ? ? 4)UnderReplicatedPartitions:即未充分備份的分區數。所謂未充分備份,是指并非所有的 Follower 副本都和 Leader 副本保持同步。一旦出現了這種情況,通常都表明該分區有可能會出現數據丟失。因此,這是一個非常重要的 JMX 指標。

? ? ? ? ? 注意: 如果某個leader replication存在UnderReplicated的分區,則出現了較嚴重問題。

? ? ? ? ?under replicated分區是指fellow分區同步leader replication超過了replica.lag.time.max.ms設置值(CDH默認10s),將從副本中移除。

? ? ? ? ?offline partion是只某個分區的所有分區不可用。? under relicated是 分區的部分副本不可用。

?

? ? ? ? ?5)ISRShrink/ISRExpand:即 ISR 收縮和擴容的頻次指標。如果你的環境中出現 ISR 中副本頻繁進出的情形,那么這組值一定是很高的。這時,你要診斷下副本頻繁進出 ISR 的原因,并采取適當的措施。

?

? ? ? ? 6)ActiveControllerCount:即當前處于激活狀態的控制器的數量。正常情況下,Controller 所在 Broker 上的這個 JMX 指標值應該是 1,其他 Broker 上的這個值是 0。如果你發現存在多臺 Broker 上該值都是 1 的情況,一定要趕快處理,處理方式主要是查看網絡連通性。這種情況通常表明集群出現了腦裂。腦裂問題是非常嚴重的分布式故障,Kafka 目前依托 ZooKeeper 來防止腦裂。但一旦出現腦裂,Kafka 是無法保證正常工作的

? ? ? ?其它監控指標還有很多,可以按需官網查詢集成到監控平臺。

3.4 kafka客戶端監控

? ? ? ?1) 客戶端ping kafka服務器,看下RTT,往返花費時間。太長,網絡速度問題必須解決。

? ? ? ?2)kafka-producer-network-thread 開頭的線程是你要實時監控的。

它是負責實際消息發送的線程。一旦它掛掉了,Producer 將無法正常工作,但你的 Producer 進程不會自動掛掉,因此你有可能感知不到

? ? ? ?3)Producer 角度,你需要關注的 JMX 指標是 request-latency,即消息生產請求的延時。這個 JMX 最直接地表征了 Producer 程序的 TPS

?

?

? ? ? ?4)對于消費者而言,心跳線程事關 Rebalance,也是必須要監控的一個線程。

? ? ? ? ? 它的名字以 kafka-coordinator-heartbeat-thread 開頭。

? ? ?5) 從 Consumer 角度來說,records-lag 和 records-lead 是兩個重要的 JMX 指標。

? ? ? ? ? ? ?它們直接反映了 Consumer 的消費進度

? ? ? ? ?records-lag:?? 滯后程度,就是指消費者當前落后于生產者的程度。比方說,Kafka 生產者向某主題成功生產了 100 萬條消息,你的消費者當前消費了 80 萬條消息,那么我們就說你的消費者滯后了 20 萬條消息,即 Lag 等于 20 萬。

? ? ? ?? records-lead:? 指消費者最新消費消息的位移與分區當前第一條消息位移的差值。?

? ? ? ? 監控方法:

a)使用 Kafka 自帶的命令行工具 kafka-consumer-groups 腳本。
$ bin/kafka-consumer-groups.sh --bootstrap-server <Kafka broker連接信息> --describe --group <group名稱>

b)使用 Kafka Java Consumer API 編程。

?

c)使用 Kafka 自帶的 JMX 監控指標。

? ? ? ? ? ?kafka.consumer:type=consumer-fetch-manager-metrics,client-id=“{client-id}”的 JMX 指標,里面有很多屬性。

? ? ? ? ? ?可以針對分區級別:

JMX 名稱為:kafka.consumer:? ?type=consumer-fetch-manager-metrics,partition=“{partition}”,topic=“{topic}”,client-id=“{client-id}”

使用jconsole監控截圖:(jdk_home/bin/jconsole)

JMX 方式只能監控客戶端即counsumer所在節點。當主題較多,消費者較多時,監控不是很方便。

?

如果監控kafka主題、分區、數據流入流出、調整分區數、Lag等kafka manager比較直觀好看,不推薦kafka tool,不方便會卡頓。
如果要監控內存、線程安全、進程,Lag、Lead等的話,就會使用jconsole和jvisualvm,另外,有利于排查kafka是否存在死鎖問題。

? ? ?6)如果你使用了 Consumer Group,那么有兩個額外的 JMX 指標需要你關注下,一個是 join rate,另一個是 sync rate。

? ?它們說明了 Rebalance 的頻繁程度。如果在你的環境中,它們的值很高,那么你就需要思考下 Rebalance 頻繁發生的原因了。

?

?

二、Kafka性能優化

?

1 應用層面優化。

1.1)增加吞吐量:

a)Broker 端??

num.replica.fetchers

表示的是 Follower 副本用多少個線程來拉取消息,默認使用 1 個線程。如果你的 Broker 端 CPU 資源很充足,不妨適當調大該參數值,加快 Follower 副本的同步速度。增加這個值后,你通常可以看到 Producer 端程序的吞吐量增加。

調優GC參數

避免經常性的 Full GC,目前不論是 CMS 收集器還是 G1 收集器,其 Full GC 采用的是 Stop The World 的單線程收集策略,非常慢,因此一定要避免。

b)?Producer 端

batch.size?

目前它們的默認值都偏小,特別是默認的 16KB 的消息批次大小一般都不適用于生產環境。設置512k-1M

?linger.ms

適當增加 10-100.默認值0

compression.type = lz4 或zstd? , 減小網絡IO

acks=1或0

增加buffer.memory

當多個線程共享一個producer實例時,由于公用緩存,就可能會碰到緩沖區不夠用的情形。倘若頻繁地遭遇 TimeoutException:Failed to allocate memory within the configured max blocking time 這樣的異常,那么你就必須顯式地增加 buffer.memory 參數值

?

c) Consumer端

?I)采用多consumer進程或線程

II) 增加fetch.min.bytes參數,默認1字節,調大為1K或更大

表示只要 Kafka Broker 端積攢了 1 字節的數據,就可以返回給 Consumer 端,

?

1.2)減小延時:

延時和吞吐量有時有些互斥,說一要視情況調整:

a)在Broker 端,

依然要增加 num.replica.fetchers 值以加快 Follower 副本的拉取速度,減少整個消息處理的延時

b)在 Producer 端

設置 linger.ms=0,我們希望消息盡快地被發送出去,因此不要有過多停留

同時不要啟用壓縮。因為壓縮操作本身要消耗 CPU 時間,會增加消息發送的延時。另外,最好不要設置 acks=all。我們剛剛在前面說過,Follower 副本同步往往是降低 Producer 端吞吐量和增加延時的首要原因。

c)在 Consumer 端,

我們保持 fetch.min.bytes=1 即可,也就是說,只要 Broker 端有能返回的數據,立即令其返回給 Consumer,縮短 Consumer 消費延時。

?

2) JVM優化

?

3)OS優化

a)在操作系統層面,你最好在掛載(Mount)文件系統時禁掉 atime 更新。記錄 atime 需要操作系統訪問 inode 資源,而禁掉 atime 可以避免 inode 訪問時間的寫入操作,減少文件系統的寫操作數。你可以執行 mount -o noatime 命令進行設置

b)文件系統,我建議你至少選擇 ext4 或 XFS。ZFS最新的據說更好

c)swap 空間的設置。 個人建議將 swappiness 設置成一個很小的值,比如 1~10 之間

d)ulimit -n 和 vm.max_map_count。前者如果設置得太小,你會碰到 Too Many File Open 這類的錯誤,而后者的值如果太小,在一個主題數超多的 Broker 機器上,你會碰到 OutOfMemoryError:Map failed 的嚴重錯誤,因此,我建議在生產環境中適當調大此值,比如將其設置為 655360。具體設置方法是修改 /etc/sysctl.conf 文件,增加 vm.max_map_count=655360,保存之后,執行 sysctl -p 命令使它生效。

e) 操作系統頁緩存大小

給 Kafka 預留的頁緩存越大越好,最小值至少要容納一個日志段的大小,也就是 Broker 端參數 log.segment.bytes 的值,該值默認1G。

實際上 page cache大小不用設置,默認讀寫文件都會用到,當內存不夠時,作為應急,cache和buffer內存可以釋放。

但是有些參數是可以控制其工作方式。

free 命令可以查看 cache(page cache) 和 buffer(buffer cache)緩存使用大小。新版本linux將兩者合二為一顯示了。

概念參考:https://blog.csdn.net/lqglqglqg/article/details/82313966

https://blog.csdn.net/jasonchen_gbd/article/details/80151328

II) 控制page cache參數:?ls?/proc/sys/vm

如下幾個參數對page cache大小有影響:

vm.dirty_background_bytes = 0
vm.dirty_background_ratio = 10
vm.dirty_bytes = 0
vm.dirty_expire_centisecs = 3000
vm.dirty_ratio = 30
vm.dirty_writeback_centisecs = 500

1)dirty_writeback_centisecs?,?dirty_expire_centisecs

后臺進程pdflush或flush-n:m負責異步將寫操作writeback到磁盤。這個進程每個dirty_writeback_centisecs(默認值500,即5s)厘秒喚醒然后執行一次。他會檢查這些臟頁面的時間是不是超時了,超時的會被寫磁盤。超時時間就是dirty_expire_centisecs(30s),? 加大此值可以增加page cache大小

2)dirty_background_bytes與dirty_background_ratio(默認10%)

?參數意義:當臟頁所占的百分比(相對于系統總內存)達到dirty_background_ratio或者
臟頁所占的內存數量超過dirty_background_bytes時,內核的pdflush線程開始回寫臟頁。

注意:dirty_background_bytes參數和dirty_background_ratio參數是相對的,只能指定其中一個,另一個參數的值自動清零

3)dirty_bytes與dirty_ratio(默認30%)

如果dirty_background_bytes與dirty_background_ratio還不能有效發揮作用,導致臟頁面比例持續升高,并且超過了dirty_ratio,那么那么執行write的那個用戶態進程自己會block住,等待pdflush干完活再喚起。在寫入超大時,即時內核的pdflush線程滿足dirty_background_ratio開始回收了,也可能立馬超過dirty_background_ratio到達dirty_ratio。

4)drop_caches

向/proc/sys/vm/drop_caches文件中寫入數值可以使內核釋放page cache,dentries和inodes緩存所占的內存。生產環境不要用。

? 只釋放pagecache:

? ? ? echo 1 > /proc/sys/vm/drop_caches

? 只釋放dentries和inodes緩存:

? ? ? echo 2 > /proc/sys/vm/drop_caches

? 釋放pagecache、dentries和inodes緩存:

? ? ? echo 3 > /proc/sys/vm/drop_caches

? 這個操作不是破壞性操作,臟的對象(比如臟頁)不會被釋放,因此要首先運行sync命令。

5)vfs_cache_pressure

? ? 控制內核回收dentry和inode cache內存的傾向。

? 默認值是100,內核會根據pagecache和swapcache的回收情況,讓dentry和inode cache的內存占用量保持在一個相對公平的百分比上。

? 減小vfs_cache_pressure會讓內核更傾向于保留dentry和inode cache。當vfs_cache_pressure等于0,在內存緊張時,內核也不會回收dentry和inode cache,這容易導致OOM。
? 如果vfs_cache_pressure的值超過100,內核會更傾向于回收dentry和inode cache。

6)min_free_kbytes

? ? 這個參數用來指定強制Linux VM保留的內存區域的最小值,單位是kb。VM會使用這個參數的值來計算系統中每個低端內存域的watermark[WMARK_MIN]值。每個低端內存域都會根據這個參數保留一定數量的空閑內存頁。

? 一部分少量的內存用來滿足PF_MEMALLOC類型的內存分配請求。如果進程設置了PF_MEMALLOC標志,表示不能讓這個進程分配內存失敗,可以分配保留的內存。并不是所有進程都有的。kswapd、direct reclaim的process等在回收的時候會設置這個標志,因為回收的時候它們還要為自己分配一些內存。有了PF_MEMALLOC標志,它們就可以獲得保留的低端內存。

? 如果設置的值小于1024KB,系統很容易崩潰,在負載較高時很容易死鎖。如果設置的值太大,系統會經常OOM。

總結

以上是生活随笔為你收集整理的Kafka性能监控与优化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。