KAFKA 調優


KAFKA 調優

最近要對kafka集群做調優,就在網上看了些資料,總結如下。
我們的kafka版本是0.10.1.0。
機器配置是40G內存,300G硬盤。
一共有3台機器組成一個小的集群。

Kakfka的調優主要分為3個部分,Linux系統,JVM虛擬機,Kafka本身設置。

Linux系統

Swap 機制

Don't fear the filesystem!中提到kafka使用page cache進行文件存儲。

計算機的內存分為虛擬內存和物理內存。物理內存是真實的內存,虛擬內存是用磁盤來代替內存。
並通過swap機制實現磁盤到物理內存的加載和替換,這里面用到的磁盤我們稱為swap磁盤。

在寫文件的時候,Linux首先將數據寫入沒有被使用的內存中,這些內存被叫做內存頁(page cache)。然后讀的時候,Linux會優先從page cache中查找,如果找不到就會從硬盤中查找。

當物理內存使用達到一定的比例后,Linux就會使用進行swap,使用磁盤作為虛擬內存。
通過cat /proc/sys/vm/swappiness可以看到swap參數。

這個參數表示虛擬內存中swap磁盤占了多少百分比。0表示最大限度的使用內存,100表示盡量使用swap磁盤。

系統默認的參數是60,當物理內存使用率達到40%,就會頻繁進行swap,影響系統性能,推薦將vm.swappiness 設置為較低的值1。
最終我設置為10,因為我們的機器的內存還是比較小的,只有40G,設置的太小,可能會影響到虛擬內存的使用吧。
其實我也不太確定。

參考:

  1. https://lonesysadmin.net/2013/12/11/adjust-vm-swappiness-avoid-unneeded-disk-io/

  2. http://blog.csdn.net/zwan0518/article/details/12059213

臟文件

當大量的持續不斷的數據寫入cache內存中后,這些數據就被稱為臟數據。需要盡快將這些臟數據flush到磁盤中,釋放內存。
這里需要關注兩個參數:

  • vm.dirty_background_ratio:這個參數指定了當文件系統緩存臟頁數量達到系統內存百分之多少時(如5%)就會觸發pdflush/flush/kdmflush等后台回寫進程運行,將一定緩存的臟頁異步地刷入外存;

  • vm.dirty_ratio:這個參數則指定了當文件系統緩存臟頁數量達到系統內存百分之多少時(如10%),系統不得不開始處理緩存臟頁(因為此時臟頁數量已經比較多,為了避免數據丟失需要將一定臟頁刷入外存);在此過程中很多應用進程可能會因為系統轉而處理文件IO而阻塞。
    這里推薦將vm.dirty_background_ratio設置為5, vm.dirty_ratio有的人設置為10,但是我覺得太小了,還是默認的就可以了。

參考:

  1. http://blog.csdn.net/tenfyguo/article/details/50185915
  2. http://blog.sina.com.cn/s/blog_448574810101k1va.html

網絡

kafka集群對網絡的要求比較高,可以將socket的緩沖設置為原來的兩倍。

  • net.core.wmem_default 設置為128K
  • net.core.rmem_default 設置為128K

JVM虛擬機

GC調優

推薦使用1.7出來的G1垃圾回收機制代替CMS。

與CMS比較:

  1. G1在壓縮空間方面有優勢
  2. G1通過將內存空間分成區域(Region)的方式避免內存碎片問題
  3. Eden, Survivor, Old區不再固定、在內存使用效率上來說更靈活
  4. G1可以通過設置預期停頓時間(Pause Time)來控制垃圾收集時間避免應用雪崩現象
  5. G1在回收內存后會馬上同時做合並空閑內存的工作、而CMS默認是在STW(stop the world)的時候做
  6. G1會在Young GC中使用、而CMS只能在O區使用

G1適合的場景:

  1. 服務端多核CPU、JVM內存占用較大的應用(至少大於4G)
  2. 應用在運行過程中會產生大量內存碎片、需要經常壓縮空間
  3. 想要更可控、可預期的GC停頓周期;防止高並發下應用雪崩現象

我們的kafka的kafka-run-class.sh 中已經包含了

KAFKA_JVM_PERFORMANCE_OPTS="-server -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:+DisableExplicitGC -Djava.awt.headless=true"

所以只需要修改kafka-server-start.sh。這里面將內存設置為4G,因為當前kafka的堆內存使用了800多M,1個G的內存不夠用。但是分配太多,也沒什么用,還容易影響到pagecache,降低效率:

export KAFKA_HEAP_OPTS="-Xms4g -Xmx4g"

參考:

  1. http://ifeve.com/深入理解g1垃圾收集器/
  2. https://bigdata-ny.github.io/2016/12/05/kafka-cluster-optimize/
  3. http://www.importnew.com/15311.html

Kafka配置

感覺現在配置的已經就夠用了。

參考:

  1. http://blog.csdn.net/vegetable_bird_001/article/details/51858915


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM