Kafka性能测试

服务器

测试服务器

172.21.195.89, 172.21.195.90, 172.21.195.91

测试服务器配置

  • CPU:4核,Intel Core Processor (Broadwell),2198.724 MHZ
  • 内存:8G
  • 网络:万兆网
  • 磁盘:NAS存储

CPU详细信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
processor       : 0
vendor_id : GenuineIntel
cpu family : 6
model : 60
model name : Intel Core Processor (Haswell, no TSX)
stepping : 1
microcode : 0x1
cpu MHz : 2593.992
cache size : 4096 KB
physical id : 0
siblings : 1
core id : 0
cpu cores : 1
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm arat fsgsbase bmi1 avx2 smep bmi2 erms invpcid xsaveopt
bogomips : 5187.98
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management:

processor : 1
vendor_id : GenuineIntel
cpu family : 6
model : 60
model name : Intel Core Processor (Haswell, no TSX)
stepping : 1
microcode : 0x1
cpu MHz : 2593.992
cache size : 4096 KB
physical id : 1
siblings : 1
core id : 0
cpu cores : 1
apicid : 1
initial apicid : 1
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm arat fsgsbase bmi1 avx2 smep bmi2 erms invpcid xsaveopt
bogomips : 5187.98
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management:

processor : 2
vendor_id : GenuineIntel
cpu family : 6
model : 60
model name : Intel Core Processor (Haswell, no TSX)
stepping : 1
microcode : 0x1
cpu MHz : 2593.992
cache size : 4096 KB
physical id : 2
siblings : 1
core id : 0
cpu cores : 1
apicid : 2
initial apicid : 2
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm arat fsgsbase bmi1 avx2 smep bmi2 erms invpcid xsaveopt
bogomips : 5187.98
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management:

processor : 3
vendor_id : GenuineIntel
cpu family : 6
model : 60
model name : Intel Core Processor (Haswell, no TSX)
stepping : 1
microcode : 0x1
cpu MHz : 2593.992
cache size : 4096 KB
physical id : 3
siblings : 1
core id : 0
cpu cores : 1
apicid : 3
initial apicid : 3
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm arat fsgsbase bmi1 avx2 smep bmi2 erms invpcid xsaveopt
bogomips : 5187.98
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management:

Kafka

Kafka broker配置

JVM参数:-Xmx4G –Xms4G –Xmn3G。其他采用Kafka默认JVM配置。

Kafka参数:

  1. 关闭消息刷盘,由操作系统进行刷盘,且官方推荐这样配置,能最大化保证吞吐量。
  2. Log segment大小为500M,经测试配置为1G时,基本无性能影响。因为 Kafka 的写日志为append模式,与日志大小无关。
  3. 单Partition总日志大小上限为5G(考虑服务器磁盘空间可能不足)。
  4. 日志清除时间为10mins(考虑服务器磁盘空间可能不足)。
  5. 其他配置参见 Kafka 最佳实践

Kafka测试方案

  1. 新建topic: topic_log_replica_6_1,表示该topic有6个partition(多partition,为了增大吞吐量),1个replication(即无备份,消除replica同步的影响,提升吞吐量)
  2. 新建topic: topic_log_replica_1_1,表示该topic有1个partition,1个replication(即无备份,消除replica同步的影响,提升吞吐量)
  3. 单producer进程实例,进程内启动1000个并发线程,每个线程循环1000次。
  4. 消息大小分别为100byte,1k,4k,10k,20k,40k,100k,200k,400k。
  5. 分别进行acks=0和acks=1时的性能测试。
  6. JVM参数:-Xmx4G –Xms4G –Xmn3G –Xss256k(数据为400k时,采用-Xss512k)。
  7. 消息体较大时,并发线程适当减少

Log4j&Log4j2

这一部分的测试主要分为三个部分,Log4j,Log4j2 Sync(Log4j2 同步模式),Log4j2 Async(Log4j2 异步模式)

Log4j&Log4j2测试方案

  1. 单进程实例,进程内1000个并发线程写日志,每个线程循环1000次
  2. 每条日志大小分别为100byte,1k,4k,10k,20k,40k,100k,200k,400k。
  3. JVM参数:-Xmx4G –Xms4G –Xmn3G –Xss256k(数据为400k时,采用-Xss512k)。
  4. 消息体较大时,并发线程适当减少

性能测试结果

性能测试结果TPS对比:

100byte 1k 4k 10k 20k 40k 100k 200k 400k
Log4j 252080 88550 41220 21886 12498 7000 2808 1366 763
Log4j2 Sync 302847 154250 47542 23629 13342 7147 2824 1466 837
Log4j2 Async 1244942 351865 75307 33799 17213 8300 3086 1714 944
Kafka Partion=6 Replica=1 Acks=0 1285314 343434 117955 49906 24904 13761 6484 3463 1623
Kafka Partion=6 Replica=1 Acks=1 1274192 340797 111610 49134 23887 12178 6255 3067 1527
Kafka Partion=1 Replica=1 Acks=0 1272578 238823 81231 32914 16548 8980 4777 2673 1360
Kafka Partion=1 Replica=1 Acks=1 1286008 233131 80089 32497 16148 7986 4472 2561 1355
Kafka Partion=6 Replica=3 Acks=0 1074183 214996 58859 26446 12519 5634 1980 1073 564
Kafka Partion=6 Replica=3 Acks=1 1096138 214325 62529 26456 13047 4473 2444 988 512
Kafka Partion=6 Replica=3 Acks=all 992194 148245 40282 16249 8452 3230 1826 1001 503

注:

  1. 以上测试每一项均经过5~10次不等的测试,取最高值。
  2. 当消息体大小为100K~400K时,采用8~200的并发线程进行性能测试。
  3. Kafka 的性能测试均值比较接近于最高值。
  4. Log4j的性能测试均值与最高值相差较大。
  5. Log4j2的性能优于Log4j很多。
  6. 当replica=1时,Acks=1 和 Acks=all 效果是均等的,所以当 Partion=6 Replica=1 和 Partion=1 Replica=1 时,只给出了 Acks=0 和 Acks=1 的测试数据。当 Partion=6 Replica=3 时,给出了 Acks=0 、 Acks=1 和 Acks=all 的测试数据。

测试结论

  1. Kafka 性能全面优于Log4j和Log4j2。
  2. 集群共用同一个NAS存储,因此同时进行写磁盘操作,会对性能造成影响。
  3. Kafka-producer单进程对 Kafka 集群进行性能测试,无法压满 Kafka 集群的全部能力。
  4. Kafka 集群性能瓶颈在磁盘I/O,当网络I/O不存在瓶颈时,基本可以达到磁盘能写入多少数据,Kafka 内存就可以接收多少数据。
  5. Kafka-producer API默认采用异步发送模式,因此acks=0和acks=1性能测试结果比较接近。但是acks=all时,性能就差很多。

官方性能测试报告

  1. Kafka官方性能测试报告
  2. Kafka官方性能测试配置参数
  3. Kafka 最佳实践