中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

誰是性能殺手?Kafka多Topic下啟用SSL時延增大問題分析

發布時間:2020-06-28 09:54:52 來源:網絡 閱讀:994 作者:中間件小哥 欄目:云計算

問題背景

項目中將Kafka接口進行RESTful封裝,在使用RESTful接口進行性能測試時,發現Topic數增多后,開啟SSL與非SSL進行測試,發現開啟SSL后性能下降得厲害。例如600個Topic總數每個Topic3分區3副本的場景下,使用1200個線程只發送10個Topic,開啟SSL的TPS只有3100,但是不開啟SSL性能達到11000。

 

其中測試客戶端會啟動多個線程,每個線程采用同步發送的方式調用RESTful API發送,即每次發送成功一條后才發送下一條。 客戶端會根據發送線程在Topic數之間進行均分,例如1200個線程發送10個Topic,則每個Topic同時有120個線程進行發送。

 

定位與分析過程

1.SSL性能下降

1.定位分析

開啟SSL是會導致性能下降的, 主要來自于CPU的耗時與JVM的具體實現,參見Kafka官網的解釋:

誰是性能殺手?Kafka多Topic下啟用SSL時延增大問題分析

 

從我們之前測試的結果來看,高可靠場景SSL性能下降并沒有太厲害(從2.3W TPS下降到2.1W TPS)。應該是觸發了某些其他問題。通過JStack查看啟動SSL下的堆棧,發現存在一些發送線程被Block住:

誰是性能殺手?Kafka多Topic下啟用SSL時延增大問題分析誰是性能殺手?Kafka多Topic下啟用SSL時延增大問題分析

 

這個堆棧里面做的事情,是來自于java.security.SecureRandom要產生隨機數,采用”SHA1PRNG”算法。在sun/oracle的jdk里,這個隨機算法的的實現在底層依賴到操作系統提供的隨機數據,默認用的是/dev/random,在讀取時,/dev/random設備會返回小于熵池噪聲總數的隨機字節。/dev/random可生成高隨機性的公鑰或一次性密碼本。若熵池空了,對/dev/random的讀操作將會被阻塞,直到收集到了足夠的環境噪聲為止。這個問題在網上也查到,主要是JDK提供的SecureRandom函數存在1個全局的鎖,在熵源不足且SSL線程多的時候很容易碰到這個問題,具體見:

https://github.com/netty/netty/issues/3639

http://bugs.java.com/view_bug.do?bug_id=6521844

 

2.解決措施

措施一:更新JDK

目前這個問題是在OpenJDK 1.8中解決了,可以通過升級JDK到使用OpenJDK,但是這個方案不太好替換,并且OpenJDK和原來有什么不兼容還不清楚。

措施二:采用非阻塞的熵源: /dev/urandom

通過設置-Djava.security.egd=file:/dev/./urandom宏,隨機數時選擇/dev/urandom,它會重復地使用熵池中的數據以產生偽隨機數據避免阻塞,不過隨機安全性會降低。

 

2.Topic多情況下性能下降

1.定位分析

發現在Topic600個情況下,非SSL與SSL的時延其實差距并沒有原先發現的問題那么大,以下是我們用SDK接口測試的時延數據:

600個 Topic總量下,400個線程同時發送10個Topic,非SSL與SSL時延對比:

誰是性能殺手?Kafka多Topic下啟用SSL時延增大問題分析

可以看出時延差距在20%之內,主要的時延增加來自于Topic增多導致的。 

為什么Topic增多會導致時延增多?針對這個問題通過在程序進行打點測試,以下是在不同的Topic數量情況下,針對10個Topic,總發送5000條消息的場景下,非SSL時延對比:

誰是性能殺手?Kafka多Topic下啟用SSL時延增大問題分析

其中總時延 = 消息的待發送隊列等待時延 + 服務端處理平均時延 + 網絡發送與響應時延。

 

從上面的表格可以看出基本上每個處理環節上都增加了時延4~5倍。為什么會出現這種情況?分析如下可能點:

1、磁盤的寫速度變慢

2、Server由于Topic多需要過濾信息變慢

3、復制處理在多Topic下變慢。即使無數據,多Topic下復制線程也會一直發送空請求

4、Topic多資源占用大

 

通過逐一分析、排除與測試,主要原因還是在第三點:服務端在復制處理在Topic數量多的情況下變慢導致的。

 

例如10個Topic的時候,如果用10個復制線程(目前性能測試就是配置10)用于副本復制,則每個復制線程會分配到1個Topic;而當Topic有600個的時候,如果還是10個復制線程用于副本復制,則每個復制線程會分配到60個Topic。 如果此時只發送前10個Topic的時候,很有可能只有1個復制線程在工作,其他的復制線程由于分配到的Topic沒有數據,基本處于空閑狀態。

 

2.解決措施

既然復制線程變慢,我們可以通過繼續增加復制線程的方式提高性能,在600個Topic場景只發送10個Topic場景下,我們把復制線程提升到60個,這樣10個Topic能盡可能分配到不同的復制線程中,提高了復制的速度。以下是實際測試結果:

誰是性能殺手?Kafka多Topic下啟用SSL時延增大問題分析

可以看到增加到60個fetch線程后,時延變為100ms左右。同時原來的環境下,通過增加復制線程(修改配置num.replica.fetchers=60),在原環境下1200個發送線程即使啟動SSL,性能也能達到11000+。

 

性能提升措施總結

RESTful API是同步接口,但是內部使用的SDK接口是異步發送。根據高可靠場景下異步發送的能力能達到2W+ TPS來看,主要還是同步接口的并發壓力上不去導致的,可以通過以下措施來改進:

1、增加請求等待時間linger.ms

通過在客戶端增加參數linger.ms,使得每個請求回等待指定的時間后再發送,使得每個請求可以發送更多的數據,即增加合包率。

2、增加同步發送對同1個Topic的并發數量

3、減少Topic的分區數

因為目前RESTful API并沒有用盡服務端的能力(1個分區的能力瓶頸還沒達到),默認的3個分區是浪費資源,并且會導致合包率降低,如果采用1個分區,則同樣的壓力下,合包率能提升3倍,這樣性能也能提升。這個措施還可以支持更多的Topic數。

4、增加復制線程

5、考慮提供異步發送SDK接口

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

德庆县| 钟山县| 淳化县| 和田县| 库伦旗| 龙岩市| 大荔县| 原阳县| 永吉县| 中西区| 醴陵市| 高邮市| 安西县| 神农架林区| 朝阳区| 巴东县| 凤城市| 江永县| 滨海县| 灯塔市| 鄱阳县| 乡城县| 南川市| 靖州| 山阳县| 麟游县| 台东市| 武川县| 泰安市| 廉江市| 翁牛特旗| 油尖旺区| 拉萨市| 华容县| 曲阳县| 衡水市| 筠连县| 榆树市| 甘洛县| 漠河县| 旺苍县|