根據kafka的零拷貝機制來確定集群需要多大內存


1、首先要大概知道非0拷貝機制

 

 

傳統的讀取文件數據並發送到網絡的步驟如下:
(1)操作系統將數據從磁盤文件中讀取到內核空間的頁面緩存;
(2)應用程序將數據從內核空間讀入用戶空間緩沖區;
(3)應用程序將讀到數據寫回內核空間並放入socket緩沖區;
(4)操作系統將數據從socket緩沖區復制到網卡接口,此時數據才能通過網絡發送。

很明顯,傳統非0拷貝讀取磁盤一次,經過4次網絡拷貝(IO);

如果讀取10億次,意味經過40億次頻繁的IO處理

 

2、kafka的0拷貝技術

kafka的0拷貝技術充分利用了操作系統內核OSCache

 

 

只用將磁盤文件的數據復制到頁面緩存中一次,然后將數據從頁面緩存直接發送到網絡中(發送給不同的訂閱者時,都可以使用同一個頁面緩存),避免了重復復制操作

這樣原來的一次讀取操作,只經歷了2次拷貝(IO);

假如現在有5個消費者 , 要讀取10億次磁盤文件:

原來的非0拷貝:5 * 10億 * 4 = 200億次網絡拷貝(IO)

0拷貝技術:1 次 + 10億次

很明顯,隨着消費者次數的增多,讀取次數的增多,占用IO的頻繁是很明顯的

 

3、估算kafka服務器需要的內存

通過0拷貝,可以知道,kafka快速的主要原因是利用了內核緩沖區OScache , 意味着 kafka本身的JVM要求其實並不是特別大的;
因為很多數據結構並不在JVM內部使用,而是在OSCache內部;
所以,一般我們給kafka服務的jvm內存幾個G就可以了,比如一個kafka服務給5G
 

每天全量日志100億條 , 根據2-8原則 。高峰期大概會產生約80億條數據量
一般的高峰期是在早上8-10點 下午的6-7點 晚上的9-10點 這個時間大概就是4個小時
意味着80億/4*3600秒 = 55萬/秒 , 每條數據大概在1KB大小 也就是每秒大概約5G大小的日志



假如線上一共100個topic 來對接這個日質量, 每個topic有5個分區,2個副本,那意味着總共要存儲1000份 ;
kafka的每一個分區是一個目錄,目錄里面存儲的是segment(默認1G);
那么高峰期每秒5G日志,假如均攤到100個topic上 , 意味着kafka集群在高峰期大概每秒產生了:5G/100 = 0.05G(每個topic上要分攤這些), 每個topic5個分區2個副本 那就是說,其實最終要存儲的大概是 : 0.05*5*2 = 0.5G(每個topic每秒存儲的 數據大小)

意味着2s就會產生一個segment文件(1G)

kafka在讀取數據使用的是0拷貝技術,是通過linux的OSCache內核緩沖區來完成的;所以說要想讓你的kafka性能達到最好,那么只要給OSCache足夠大的內存,KAFKA性能就會達到非常好
當然真實情況是考慮你們能承受的最大延遲是多少. 比如:5s的 延遲
那意味着5s內每個topic會產生:5s*0.5G = 2.5G大小
100個topic * 每個topic延遲5s的量2.5G(5s后,緩存區數據刷盤) = 250G

現在7台機器,那么250G/7 大概每台機器用在OSCache上的內存36G.
然后在算上給kafka的JVM使用的內存(5G~10G足夠了)
終上所述每天全量日志100億條數據量情況下, 每台機器給kafka預留的內存大概:41G ~ 46G


免責聲明!

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



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