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服務器需要的內存
每天全量日志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