生產環境中的flume海量資料傳輸效能優化
上一篇文章,記flume部署過程中遇到的問題以及解決方法,記錄了flume在執行過程中遇到的問題的解決方法,本文將記錄在專案除錯過程中對flume效能的優化。
再放上專案的拓撲結構圖:
實際生產環境中,agent層的機器大約有50臺,在高峰時期生成的日誌量大約在5000條/s, 每天總共生成的日誌量大約在8T左右, collector的機器有8臺,所以對該系統的傳輸效率有很高的要求。
在測試中,發現在使用基本配置時,flume傳送資料的效率並不是很理想,agent向collector傳送資料最快也就每秒1000條左右,遠不能滿足系統傳輸需求,在隨後的除錯過程中,通過修改jvm環境引數以及agent、collector層的配置,逐步使得傳輸效能達到要求,現將除錯過程記錄如下:
agent層的除錯資料:
優化方法 | java 環境 | channel型別 | sink型別與個數 | 是否壓縮 | source接收到條數&速度 | channel已寫入 &channel佔用率 | sink輸出量 | sink輸出速度 | cpu佔用 | 記憶體佔用 | 總結 |
---|---|---|---|---|---|---|---|---|---|---|---|
無 | 預設 | file 100w | 負載均衡 2個avro sink | 否 | 2472192 1373/s | 2473728 0.02% | 2360100 | 1311/s | 約35% | 8.6G | 傳輸效率很低 |
優化java配置,啟用2G記憶體 | Xms2g Xmx2g Xss256k Xmn1g | file 100w | 負載均衡 2個avro sink | 否 | 6226688 3459/s | 6227712 99.90% | 5228000 | 2904/s | 約30% | 8.6G | 傳輸效率有較大提升 |
avro壓縮傳輸 | Xms2g Xmx2g Xss256k Xmn1g | file 100w | 負載均衡 2個avro sink | 是 | 5076224 2820/s | 5077504 99.90% | 4077800 | 2265/s | 約47% | 10.4G | 傳輸效率不升反降 |
採用memory channel | Xms2g Xmx2g Xss256k Xmn1g | memory 100w | 負載均衡 2個avro sink | 是 | 6767104 3759/s | 6771968 99.90% | 5772200 | 3207/s | 100%-200% | 10.4G | 傳輸效率有少量提升,但是cpu壓力很大 |
資料不傳輸到L2,直接sink到本地 | Xms2g Xmx2g Xss256k Xmn1g | file 100w | 負載均衡 2個file sink | 否 | 5761280 3201/s | 5762816 0.00% | 5761662 | 3201/s | 10%-50% | 10.4G | channel無堆積,但是傳輸量無明顯提升 |
將資料傳給8個Sink組成的L2 | Xms2g Xmx2g Xss256k Xmn1g | file 100w | 負載均衡 8個avro sink | 否 | 1423616 791/s | 1393664 99.90% | 393700 | 218/s | 5% | 10.4G | 傳輸效率極低 |
優化avro-avro傳輸,avro sink配置maxIoWorkers128,L2的avro source threads設為1000 | Xms2g Xmx2g Xss256k Xmn1g | file 100w | 負載均衡 2個file sink | 否 | 2971392 1651/s | 2972416 99.90% | 1972500 | 1095/s | 5%-20% | 10.4G | 傳輸效率不升反降 |
將L2資料sink到本地 | Xms2g Xmx2g Xss256k Xmn1g | file 100w | 負載均衡 2個avro sink | 否 | 6279168 3488/s | 6280448 99.90% | 5280500 | 2934/s | 約30% | 10.4G | 傳輸效率無明顯提升 |
增大java記憶體 增大avro sink batchsize 啟用壓縮 啟用memorychannel | Xms8g Xmx8g Xss256k Xmn3g | memory 100w | 負載均衡 2個avro sink | 是 | 5640704 3134/s | 5643776 99.90% | 4644000 | 2580/s | 30% | 16.5G | 傳輸效率無明顯提升 |
增加jvm記憶體到8G,filechannel設為1000w容量 | Xms8g Xmx8g Xss256k Xmn3g | file 1000w | 負載均衡 2個file sink | 否 | 7330816 4073/s | 7332096 48% | 2519000 | 1399/s | 2%-16% | 16.5G | 傳輸效率不升反降 |
在上一種方法的基礎上增加avro batchsize為2000 | Xms8g Xmx8g Xss256k Xmn3g | file 2000w | 負載均衡 2個avro sink | 否 | 8168960 4538/s | 8170496 69% | 1270000 | 706/s | 10%-20% | 16.5G | 傳輸效率極低 |
4個sink無組策略 | Xms8g Xmx8g Xss256k Xmn3g | file 2000w | 無組策略 4個avro sink | 否 | 7222272 4012/s | 7223808 0.02% | 7222272 | 4012/s | 30%-50% | 16.6G | 取消負載均衡,效率有較大提升666 |
8個sink無組策略 | Xms8g Xmx8g Xss256k Xmn3g | file 2000w | 無組策略 8個avro sink | 否 | 7034624 3908/s | 7035648 0.03614% | 7032034 | 3906/s | 30%-50% | 16.6G | 無組策略的情況下,8個sink和4個sink效率無差 |
4個sink無組策略 memrorychannel | Xms8g Xmx8g Xss256k Xmn3g | memory 100w | 無組策略 4個avro sink | 否 | 17435648 9686/s | 17441536 47.56% | 12678000 | 7043/s | 100%-500% | 16.6G | cpu壓力很大 |
2個sink無組策略 memrorychannel L2的記憶體channel擴大到1億 | Xms8g Xmx8g Xss256k Xmn3g | memory 100w | 無組策略 4個avro sink | 否 | 18679438 10337/s | 18684778 0.00256% | 18683444 | 10448/s | 10%-20% | 16.6G | 此為目前傳輸最快的方案 |
8個sink無組策略,2G記憶體 | Xms2g Xmx2g Xss256k Xmn1g | file 2000w | 無組策略 8個avro sink | 否 | 7067392 3926/s | 7068416 0.00256% | 7067212 | 3926/s | 30%-40% | 10.8G | jvm2G記憶體已經夠用 |
8個sink無組策略,2G記憶體,壓縮 | Xms2g Xmx2g Xss256k Xmn1g | file 2000w | 無組策略 8個avro sink | 是 | 7362048 4090/s | 7363072 0.0055% | 7361995 | 4090/s | 50%-100% | 10.6G | L1到L2壓縮對傳輸速度無太大提升,增大了CPU負擔 |
4個sink無組策略,2G記憶體,壓縮 | Xms2g Xmx2g Xss256k Xmn1g | file 2000w | 無組策略 4個avro sink | 是 | 7501056 4167/s | 7502592 0.01664 | 8036352 | 4464/s | 40%-50% | 10.5G | 從channel獲取的數量大於channel寫入的數量,說明此時的瓶頸在channel寫入 |
4個sink無組策略,2G記憶體,不壓縮 | Xms2g Xmx2g Xss256k Xmn1g | file 2000w | 無組策略 4個avro sink | 否 | 7745792 4303/s | 7747328 0.02688 | 7741952 | 4301/s | 50%-100% | 10.5G | L1到L2壓縮對傳輸速度無太大提升,增大了CPU負擔 |
8個sink無組策略,傳送到4個L2,每個L2有兩個source,兩個channel | Xms2g Xmx2g Xss256k Xmn1g | file 2000w | 無組策略 8個avro sink | 否 | 6734336 3741/s | 6735360 0.00177 | 6735006 | 3742/s | 30%-50% | 10.8G | 發給同一機器的兩個avro source無效能提升 |
collector層的除錯資料:
優化方法 | java 環境 | channel型別 | sink型別與個數 | 是否壓縮 | source接收到條數&速度 | channel已寫入 &channel佔用率 | sink輸出量 | sink輸出速度 | cpu佔用 | 記憶體佔用 | 總結 |
---|---|---|---|---|---|---|---|---|---|---|---|
正常傳輸 | Xms20g Xmx20g Xss256k Xmn8g | file 100w | 無組策略 1個kafka sink | 否 | 3099048 1722/s | 3095238 99.90% | 2144761 | 1192/s | 2%-5% | 25.6G | 輸出速度不夠 |
增加到4個sink,filechannel容量擴大 | Xms20g Xmx20g Xss256k Xmn8g | file 1億 | 無組策略 4個kafka sink | 否 | 18850000 10472/s | 18850000 9.86% | 8970971 | 4984/s | 50%-100% | 25.6G | 速度提升約4倍 |
使用memory channel | Xms20g Xmx20g Xss256k Xmn8g | memory 1000w | 無組策略 4個kafka sink | 否 | 17794000 9886/s | 17744000 99.95% | 7745000 | 4303/s | 100%-800% | 25.6G | 相比使用file channel無效能提升 |
增加到8個sink | Xms20g Xmx20g Xss256k Xmn8g | file 1億 | 無組策略 8個kafka sink | 否 | 19251655 10695/s | 19249668 2% | 17148675 | 9527/s | 100%-150% | 26.8G | 8個sink傳輸比1個速度提升約8倍 |
agent到collector啟用zlib壓縮前後的網路頻寬情況
由圖可見,在啟用壓縮前,頻寬基本佔用在50M左右,啟用後,頻寬佔用在10M左右
總結:
1、預設jvm環境只使用了20m記憶體,需要調整,擴大到2G基本夠用,不需要過大;
2、collector到kafka,啟用的sink越多,傳輸越快;
3、如果collector到kafka通路受阻,使資料堆積在channel中,如果channel堆滿,則會影響agent到collector的傳輸;
4、agent到collector如果配置了組策略(sink group),則一個組策略只啟動一個傳輸執行緒,多個sink成一組則傳輸效率遠不如sink各傳各的,一個sink相當於一個傳輸執行緒;
5、通路不受阻的情況下,memoryChannel傳輸效率比fileChannel高很多,不過對cpu、記憶體的要求會很高;
6、avro壓縮傳輸對傳輸效率沒有太大提升,反而增大cpu負擔,但是會大大降低網路頻寬;
7、在網路頻寬受限的情況下,增加sink、改用memory channel等方法都不能增加傳輸效率;
8、影響flume傳輸效能的主要因素有,jvm記憶體、網路頻寬、channel型別、sink個數、是否壓縮、機器硬體效能,各條件需要做一個綜合的效能平衡,某一個環節出現瓶頸就會影響整個系統的傳輸效能。
ps:csdn的表格使用起來太蛋疼了…這個表格搞了我整整一個下午加一個晚上…