生产环境中的flume海量数据传输性能优化

上一篇文章,记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压缩前后的网络带宽情况
生产环境中的flume海量数据传输性能优化
由图可见,在启用压缩前,带宽基本占用在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:****的表格使用起来太蛋疼了…这个表格搞了我整整一个下午加一个晚上…