kafka性能测试

真厉害,1 秒写入 10 万条消息,Kafka 写得这么快,都是因为这些优化 Kafka 作为消息队列中的中坚力量,基本上是每次面试必问的知识点。而说到 Kafka,大家对它的印象就是快!异常地快!因此,为什么 Kafka 这么快,也是每次面试必问的知识点。对于混迹 Java 技术圈多年的我来说,Kafka 这么快的特性已经了然于胸。今天,就让我带着大家盘一盘!Kafka 写入速度非常快,主要得益于其系统架构设计,包括:学过操作系统的同学都知道,内存是易丢失的存储介质,而磁盘则是不容易丢失的存储介质。但内存读写速度快,而磁盘读写速度慢。操作系统为了能提高写磁盘的速度,于是在内存中开辟 阅读详情

 

一.硬件配置

3台服务器配置如下:

CPU: 2物理CPU,12核/CPU ,  48 processor Intel(R) Xeon(R) Silver 4116 CPU @ 2.10GHz

内存: 128GB

硬盘: 480GB*1 SSD盘(OS)+6TB*7 SAS盘

Broker节点数: 3个

网络:10GE

二.测试方案

2.1 测试套件

使用kafka官方提供的性能测试工具 kafka-perf-test

1)producer命令

./kafka-producer-perf-test.sh --producer-props bootstrap.servers="vm14:6667,vm15:6667,vm16:6667" --topic test-perf-1-1 --num-records 1000000 --record-size 512 --throughput 1000000

    --topic TOPIC          produce messages to this topic

    --num-records NUM-RECORDS

                         nuMBer of messages to produce

    --payload-delimiter PAYLOAD-DELIMITER

                         provides delimiter to be used when --payload-file is provided.  Defaults  to  new  line.  Note  that  this  parameter will be ignored if --payload-file is not

                         provided. (default: \n)

    --throughput THROUGHPUT

                         throttle maximum message throughput to *approximately* THROUGHPUT messages/sec

    --producer-props PROP-NAME=PROP-VALUE [PROP-NAME=PROP-VALUE ...]

                         kafka producer related configuration properties like bootstrap.servers,client.id etc. These configs take precedence over those passed via --producer.config.

    --producer.config CONFIG-FILE

                         producer config properties file.

    --print-metrics        print out metrics at the end of the test. (default: false)

    --transactional-id TRANSACTIONAL-ID

                         The transactionalId to use if transaction-duration-ms is > 0. Useful  when testing the performance of concurrent transactions. (default: performance-producer-

                         default-transactional-id)

    --transaction-duration-ms TRANSACTION-DURATION

                         The max age of each transaction. The commitTransaction will be called after  this  time  has elapsed. Transactions are only enabled if this value is positive.

                         (default: 0)

    either --record-size or --payload-file must be specified but not both.

    --record-size RECORD-SIZE

                         message size in bytes. Note that you must provide exactly one of --record-size or --payload-file.

    --payload-file PAYLOAD-FILE

file to read the message payloads from. This works only for UTF-8  encoded  text  files.  Payloads  will be read from this file and a payload will be randomly

                         selected when sending messages. Note that you must provide exactly one of --record-size or --payload-file.

2)consumer命令

./kafka-consumer-perf-test.sh --broker-list "vm14:6667,vm15:6667,vm16:6667" --topic test-perf-1-1 --fetch-size 1000000 --messages 1000000 --threads 1

    --broker-list <String: host>             REQUIRED: The server(s) to connect to.

    --consumer.config <String: config file>  Consumer config properties file.

    --date-format <String: date format>      The date format to use for formatting

                                               the time field. See java.text.

                                               SimpleDateFormat for options.

                                               (default: yyyy-MM-dd HH:mm:ss:SSS)

    --fetch-size <Integer: size>             The amount of data to fetch in a

                                               single request. (default: 1048576)

    --from-latest                            If the consumer does not already have

                                               an established offset to consume

                                               from, start with the latest message

                                               present in the log rather than the

                                               earliest message.

    --group <String: gid>                    The group id to consume on. (default:

                                               perf-consumer-61359)

    --help                                   Print usage.

    --hide-header                            If set, skips printing the header for

                                               the stats

    --messages <Long: count>                 REQUIRED: The nuMBer of messages to

                                               send or consume

    --num-fetch-threads <Integer: count>     NuMBer of fetcher threads. (default: 1)

    --print-metrics                          Print out the metrics.

    --reporting-interval <Integer:           Interval in milliseconds at which to

      interval_ms>                             print progress info. (default: 5000)

    --show-detailed-stats                    If set, stats are reported for each

                                               reporting interval as configured by

                                               reporting-interval

    --socket-buffer-size <Integer: size>     The size of the tcp RECV size.

                                               (default: 2097152)

    --threads <Integer: count>               NuMBer of processing threads.

                                               (default: 10)

    --timeout [Long: milliseconds]           The maximum allowed time in

                                               milliseconds between returned

                                               records. (default: 10000)

    --topic <String: topic>                  REQUIRED: The topic to consume from.

2.2 Producer测试方案

第一组:测试单磁盘情况下topic的paritition数量变化对写入速度的影响

思路:partition数量对应的是producer的并行写入kafka的数量,通过本用例可以观察单磁盘情况下partition的增加是否对写入速度产生影响。

1 broker, 1 disks, 1 replication, record-size 512, records 10000000, throughput 1000000

partition

records/sec

MB/sec

avg latency(ms)

max latency(ms)

1

115107.9137

56.21

546.61

744

3

152898.1851

74.66

410.3

647

5

172286.0638

84.12

363.76

647

7

196900.7817

96.14

316.89

587

9

191398.5492

93.46

325.96

582

 

结论:通过测试在单个节点单个磁盘不同数量partition下的写入速度,可以看出当在一定范围内(本例中为1-7)随着partition数量增加,写入速度会增加,超过极值点(本例中为7)后有下降趋势

第二组:测试磁盘增加对写入速度的影响

思路:磁盘数量对应kafka的服务端接收到producer的消息后,处理写入的并行数,一般会配置kafka的io.threads数量和磁盘的数量相等。通过本用例可以观察磁盘增加是否对写入速度产生影响。

1 broker, 5 partition, 1 replication, record-size 512, records 10000000, throughput 1000000

disks

records/sec

MB/sec

avg latency(ms)

max latency(ms)

2

147303.6075

71.93

425.62

869

4

147331.8207

71.94

425.91

861

7

173391.3616

84.66

361.04

716

 

1 broker, 10 partition, 1 replication, record-size 512, records 10000000, throughput 1000000

disks

records/sec

MB/sec

avg latency(ms)

max latency(ms)

2

174012.9118

84.97

359.21

610

4

188253.012

91.92

331.02

755

7

212075.5837

103.55

293.08

532

 

1 broker, 15 partition, 1 replication, record-size 512, records 10000000, throughput 1000000

disks

records/sec

MB/sec

avg latency(ms)

max latency(ms)

2

177154.195

86.5

352.47

606

4

192126.6499

93.81

324.63

671

7

209784.3417

102.43

297.05

605

 

1 broker, 20 partition, 1 replication, record-size 512, records 10000000, throughput 1000000

disks

records/sec

MB/sec

avg latency(ms)

max latency(ms)

2

172532.7812

84.24

361.79

621

4

192481.6661

93.99

323.99

613

7

214174.0378

104.58

289.85

755

 

结论:通过测试在单节点下挂载2块,4块,7块硬盘时的写入速度,分别在partition数量为5,10,15,20的情况下进行测试,可以看出不同partition数量时当硬盘数量增多时,写入速度都会增加,但是增量都不是特别显著,猜测是由于单个进程producer造成的写入速度瓶颈。

第三组:测试磁盘和parition数量关系对写入速度的影响

思路:当kafka在新建一个partition时,会选择所有kafka服务器中partition数量最少的目录来新建。单个topic的所有partition是均匀分布在服务器中的各个目录的,最好的情况下,将topic的partition均匀分配在不同的磁盘中可以最大化提升并行写入和读取的速度。另外,当paritition数量是磁盘数量的整数倍的时候,可以保证partition在磁盘中的均匀分布,当不成整数倍的时候,不能保证partition的均匀分布。

通过本用例可以观察磁盘和paritition的数量变化对性能的影响,以及磁盘和partition的数量对应的倍数关系是否对写入性能有影响。

1 broker, 2 disks, 1 replication, record-size 512, records 10000000, throughput 1000000

partition

records/sec

MB/sec

avg latency(ms)

max latency(ms)

2

109996.4801

53.71

572.67

2578

4

174926.0937

85.41

358.69

826

8

193569.6173

94.52

323.65

740

16

220891.9617

107.86

282.22

418

32

183046.2558

89.38

341.95

1839

补充组

12

210194.4298

102.63

296.18

520

14

205090.3423

100.14

304.13

572

16

220891.9617

107.86

282.22

418

18

203417.4125

99.32

304.77

602

20

189530.3438

92.54

329.59

684

 

测试2块硬盘时partition数量成倍增加时写入速度的变化,先以大步长进行测试,找到大致的极值范围,再缩小步长进行测试,最佳点大致在partition=16左右

1 broker, 4 disks, 1 replication, record-size 512, records 10000000, throughput 1000000

partition

records/sec

MB/sec

avg latency(ms)

max latency(ms)

4

145342.4996

70.97

431.95

647

8

171004.4803

83.5

367.04

923

16

182328.7022

89.03

343.28

769

32

186863.4962

91.24

333.92

753

64

183705.3366

89.7

339.13

847

补充组

18

195809.673

95.61

317.23

736

20

195182.8864

95.3

319.75

978

22

189243.4049

92.4

329.94

817

24

187230.8556

91.42

332.49

857

28

182969.2246

89.34

341.24

1602

 

测试4块硬盘时partition数量成倍增加时写入速度的变化,先以大步长进行测试,找到大致的极值范围,再缩小步长进行测试,最佳点大致在partition=20左右

1 broker, 7 disks, 1 replication, record-size 512, records 10000000, throughput 1000000

partition

records/sec

MB/sec

avg latency(ms)

max latency(ms)

7

164972.9444

80.55

379.46

580

14

187747.5921

91.67

333.13

841

28

186198.9349

90.92

334.86

765

56

171812.4495

83.89

358.76

1313

补充组

16

199632.6759

97.48

313.02

830

18

188786.1053

92.18

329.63

994

20

191769.2632

93.64

324.96

776

 

测试7块硬盘时partition数量成倍增加时写入速度的变化,先以大步长进行测试,找到大致的极值范围,再缩小步长进行测试,最佳点大致在partition=16左右

结论:通过测试不同磁盘数量,不同partition数量的情况下写入速度的变化,可以看出磁盘和partition的数量对应的倍数关系对写入速度的影响不大。

第四组:测试单条消息大小的影响:

思路: 由于处理单条消息额外的性能消耗,单条消息的大小可能会对性能产生影响。可以推测:随着消息大小变大,吞吐量增加,每秒处理的消息条数逐渐变少。通过本用例可以观察单条消息大小对性能的影响。

3 broker, 7 disks, 1 replication, 48 partition, records 10000000, throughput 1000000

record-size

records/sec

MB/sec

avg latency(ms)

max latency(ms)

128

897988.5057

109.62

11.64

253

256

798594.4737

194.97

63.54

324

512

425170.068

207.6

136.19

1123

1024

227019.9096

221.7

129.93

990

2048

107975.0362

210.89

128.92

873

 

结论:通过测试在3个节点挂载7块硬盘时单条消息大小分别为128,256,512,1024,2048的情况下测试写入速度,可以看出当单条消息由128增大到256时每秒消息条数略有下降,写入速度几乎成倍增加,再成倍增大时相应的每秒消息条数也几乎成倍减少,写入速度略有增大,增大到2048时不增反降,因此单条消息大小为256时即可以保持较高的写入速度,又可以保持每秒传输的消息数量较多,单条消息大小不应该超过1024。

第五组:测试副本数对写入性能的影响:

思路: 为了保证可靠性,一般会存多副本,但是副本的增加可能会降低kafka的写入性能,通过本用例可以观察副本数对kafka的写入性能的影响。

3 broker, 1 disks, 21 partition, record-size 512, records 10000000, throughput 1000000

replication

records/sec

MB/sec

avg latency(ms)

max latency(ms)

1

422243.8036

206.17

143.41

541

2

409701.7371

200.05

148.78

523

3

406702.4565

198.59

148.98

927

 

结论:通过测试在3个节点挂载单块硬盘时,21partition,副本数量分别为1,2,3时的写入速度,可以看出当副本增加时写入速度略有下降,但不明显,差别很微小,这里猜测是由于cpu和网络并没有完全跑满,有富余的能力处理额外的副本。

* 补充:测试多进程producer下副本数对写入性能的影响

思路:为验证第五组测试的猜想,本例使用3*5个进程的producer产生数据,将cpu/网络资源跑满,再增加副本数量,来验证以上猜想以及副本数量在满cpu/网络的情况下对写入速度的影响。

3 broker, 1 disks, 21 partition, record-size 512, records 10000000, throughput 1000000,acks=-1

replication

records/sec(sum)

MB/sec(sum)

1

665.96

1363900

2

312.23

639443.6

3

196.38

402189.8

 

结论:可以看出当采用多进程的producer的时候,随着副本数量增加,由于kafka需要额外复制副本,写入速度下降了很多。

第六组:测试服务器个数对写入性能的影响:

思路: kafka是一个支持线性扩展的分布式消息中间件,写入性能会随着增加服务器而增加,通过本用例可以观察增加服务器数量对kafka的写入性能的影响。

1 broker, 1 disks, 1 replication, record-size 512, records 10000000, throughput 1000000

partition

records/sec

MB/sec

avg latency(ms)

max latency(ms)

1

115107.9137

56.21

546.61

744

3

152898.1851

74.66

410.3

647

5

172286.0638

84.12

363.76

647

7

196900.7817

96.14

316.89

587

9

191398.5492

93.46

325.96

582

 

3 broker, 1 disks, 1 replication, record-size 512, records 10000000, throughput 1000000

partition

records/sec

MB/sec

avg latency(ms)

max latency(ms)

1

77468.93496

37.83

814.41

1319

3

220448.8338

107.64

282.7

919

5

288383.8966

140.81

215.23

626

7

337336.3919

164.72

182.23

679

9

366609.2312

179.01

168.02

712

 

*这里可以看到broker的增加可以明显提高Kafka集群的写入性能,但没有达到理想的或近似线性的扩容。

结论:通过分别测试在1个节点和3个节点挂载单块硬盘时,不同partition数量的写入速度,可以看出当partition数量较少时(本例中为1partition),broker数量增多但由于只有1partition因此写数据时还是只往一个broker中写数据,因此没有提升写入速度,因为增加了寻找partition的开销导致写入速度下降,而当partition数量较多时,所有的partition会分散到不同的broker上,同时写数据,写入速度有明显提升。

第七组:测试开启异步写入对写入性能的影响:

思路: 在同步写入模式中,必须在落盘后才会写入成功,而在异步写入模式中,写入到kafka的内存中即可,开启异步写入应该会对写入性能产生明显提升。通过本用例可以观察异步写入对kafka写入性能的影响。

3 broker, 7 disks, 49 partition, 3 replication, record-size 512, records 10000000, throughput 1000000

acks

records/sec

MB/sec

avg latency(ms)

max latency(ms)

0

451814.0333

220.61

130.81

534

1

411336.4321

200.85

143.81

573

-1

144789.0424

70.7

421.57

1677

 

3 broker, 7 disks, 49 partition, 2 replication, record-size 512, records 10000000, throughput 1000000

acks

records/sec

MB/sec

avg latency(ms)

max latency(ms)

0

457414.6922

223.35

130.35

531

1

432208.1514

211.04

137.79

714

-1

235687.855

115.08

260.54

710

 

3 broker, 7 disks, 49 partition, 1 replication, record-size 512, records 10000000, throughput 1000000

acks

records/sec

MB/sec

avg latency(ms)

max latency(ms)

0

456246.0078

222.78

130.44

429

1

425170.068

207.6

138.88

920

-1

409819.2697

200.11

144.16

586

 

说明:

acks=0 the producer will not wait for any acknowledgment from the server at all.

acks=1 the leader will write the record to its local log but will respond without awaiting full acknowledgement from all followers.

acks=-1 the leader wait for the full set of in-sync replicas to acknowledge the record.

结论:通过测试在3个节点挂载7块硬盘时不同副本数下,测试不同的acks位下的写入速度,可以看出多副本时acks=0时速度最快,其次时acks=1时速度略小于acks=0的情况,而默认的acks=-1/all的情况最差,但单副本的情况下区别不明显。

第八组:测试ssd对写入性能的影响:

3 broker, 1 disks, 1 replication, records 10000000, throughput 1000000

partition

records/sec

MB/sec

avg latency(ms)

max latency(ms)

1

77468.93496

37.83

814.41

1319

3

220448.8338

107.64

282.7

919

5

288383.8966

140.81

215.23

626

7

337336.3919

164.72

182.23

679

9

366609.2312

179.01

168.02

712

 

3 broker, 1 ssd, 1 replication, records 10000000, throughput 1000000

partition

records/sec

MB/sec

avg latency(ms)

max latency(ms)

1

79650.81085

38.89

792.23

995

3

197339.8587

96.36

315.64

1012

5

250356.7584

122.24

247.9

677

7

334784.0643

163.47

184.69

506

9

359027.7528

175.31

171.19

582

 

结论:通过测试在3个节点挂载1块硬盘/ssd时不同partition的写入速度,可以看出硬盘和ssd的写入速度相差不是很大,ssd盘写入速度甚至略小与sas盘,猜测可能和ssd盘为系统盘有关系。

第九组:测试producer线程数对写入性能的影响:

1 broker, 7 disks , 21 partition, 1 replication, records 1000000, throughput 1000000

threads

records/sec

MB/sec

1

67930.1678

33.1690

10

536480.6867

261.9535

20

563063.0631

274.9331

30

475285.1711

232.0728

 

结论:通过测试在1个节点挂载7块硬盘producer采用不同线程数时的写入速度,可以看出线程数在20左右的时候达到峰值,另有测更多partition和broker的情况下峰值时的线程数也在20左右,猜测瓶颈时在producer客户端。

* 在多线程模式下broker数量对写入性能的影响:

22 threads, 7 disks , 1 replication, records 1000000, throughput 1000000

broker

partition

records/sec

MB/sec

1

7

553703.2115

270.3629

3

7

406499.1870

198.4859

3

21

393541.1255

192.1588

 

结论:通过测试在22线程下1个broker和三个broker的写入速度,可以看到随着broker数量增加速度反而下降,与预期相反,也从侧面说明了可能时producer本身的性能达到了瓶颈。

第十组:测试磁盘大小对写入性能的影响:

另外3台服务器配置如下:

CPU: 2物理CPU,12核/CPU ,  48 processor Intel(R) Xeon(R) Gold 5118 CPU @ 2.30GHz(这里cpu主频有变化)

内存: 128GB

硬盘: 480GB*1 SSD盘(OS)+4TB*7 SAS盘(这里硬盘大小有变化)

Broker节点数: 3个

对比第六组测试:

1 broker, 1 disks, 1 replication, records 10000000, throughput 1000000

partition

records/sec

(2.3GHZ cpu)

records/sec

(2.1GHZ cpu)

MB/sec

(2.3GHZ cpu)

MB/sec

(2.1GHZ cpu)

avg latency(ms)

(2.3GHZ cpu)

avg latency(ms)

(2.1GHZ cpu)

max latency(ms)

(2.3GHZ cpu)

max latency(ms)

(2.1GHZ cpu)

1

286196.7316

115107.9137

139.74

56.21

218.8

546.61

471

744

3

406421.4591

152898.1851

198.45

74.66

153.01

410.3

379

647

5

448350.0717

172286.0638

218.92

84.12

136.45

363.76

243

647

7

480145.9644

196900.7817

234.45

96.14

128.02

316.89

208

587

9

475036.8154

191398.5492

231.95

93.46

128.89

325.96

213

582

 

3 broker, 1 disks, 1 replication, records 10000000, throughput 1000000

partition

records/sec

(2.3GHZ cpu)

records/sec

(2.1GHZ cpu)

MB/sec

(2.3GHZ cpu)

MB/sec

(2.1GHZ cpu)

avg latency(ms)

(2.3GHZ cpu)

avg latency(ms)

(2.1GHZ cpu)

max latency(ms)

(2.3GHZ cpu)

max latency(ms)

(2.1GHZ cpu)

1

260613.4841

77468.93496

127.25

37.83

240.41

814.41

472

1319

3

320821.3025

220448.8338

156.65

107.64

193.25

282.7

632

919

5

520562.2072

288383.8966

254.18

140.81

117.29

215.23

595

626

7

374882.8491

337336.3919

183.05

164.72

163.95

182.23

968

679

9

482346.1316

366609.2312

235.52

179.01

125.88

168.02

414

712

 

结论:通过测试在两个不同的集群测试相同条件下的写入速度,来验证磁盘大小对写入速度的影响,这里结果相差较大,与预期的影响较小有较大差别,因为两个集群的cpu的主频有差别,所以这里的测试结果不能得到一个准确的评判,这里猜测由于cpu的性能提升而引起的写入速度增大的可能性更大。

2.3 Producer多并发情况下的性能评测

通过2.2节第九组测试用例《测试producer线程数对写入性能的影响》的结果可以看出,当同一个进程中的Producer线程数达到特定值(测试集群中为22),Producer的写入速度最快。

同时,在Producer的线程数为22时,当Broker从1增加到3,写入速度反而有小幅下降。这是比较反常的。

因此我们猜测,服务器的cpu处理性能是限制Producer写入速度的关键原因之一。

另外,由于每个Producer线程都在堆内存中有自己的buffer.memory缓冲区,同一个进程的所有线程又共用jvm的堆内存,因此可以考虑JVM的垃圾回收和内存分配机制也会影响Producer的写入性能。

基于上述的猜想,可得出如下推论:

1. 单机单线程producer的写入性能,受单个cpu核心的性能限制。

2. 单机多线程producer的写入性能,受服务器cpu总处理能力,以及线程所属客户端进程堆内存大小的限制。由于每个producer都会使用一个默认的32MB的buffer.memory内存缓冲区,当进程的堆内存分配不足时,会导致频繁GC,进而影响producer的写入性能。

3. 单机多进程producer的写入性能,受服务器cpu总处理能力的限制。

4. 多机多进程producer的写入性能,受kafka集群总处理能力的限制。

下面通过六组测试用例,对如上猜想和推论作验证。

测试条件:2Broker,14Partition,吞吐量 240000records/s,单条消息大小为512bytes

第一组 单机单线程producer的写入性能

records/sec

MB/sec

avg latency

max latency

261793

127.83

231.81

573

第二组 单机24线程producer的不同堆内存配置下的写入性能

堆内存配置

records/sec

MB/sec

512MB 仅设置Xmx

423584

206.8

1024MB 仅设置Xmx

551875

269.47

2048MB 仅设置Xmx

900737

439.81

2048MB 设置Xms=Xmx

927298

452.78

4096MB 仅设置Xmx

900737

439.81

4096MB 设置Xms=Xmx

1305480

637.44

增加堆内存对提升性能有明显帮助,当堆内存到4096MB时,设置Xms=Xmx能显著提升性能。

第三组 单机多进程producer的写入性能

多个独立进程和单个线程的多个进程相比,写入性能有所提升。24线程的Producer写入速度为637.44MB,而24进程的Producer写入速度为726.17MB/s。

1)单机5进程

进程号

records/sec

MB/sec

avg latency

max latency

1

233934

114.23

252.16

751

2

232828

113.69

252.03

756

3

232460

113.51

252.88

754

4

232471

113.51

253.65

748

5

232401

113.48

253.06

740

合计

1164094

568.42

252.756

756

 

2)单机8进程

进程号

records/sec

MB/sec

avg latency

max latency

1

141310

69

424.15

1028

2

140773

68.74

426.79

1126

3

140552

68.63

430.17

950

4

140738

68.72

425.97

1107

5

140394

68.55

426.58

868

6

140044

68.38

430.2

1012

7

139155

67.95

434

873

8

138607

67.68

433.3

1104

合计

1121573

547.67

503.2

1126

 

3)单机24进程

进程号

records/sec

MB/sec

avg latency

max latency

1

62516

30.53

963.44

2560

2

62455

30.5

967.1

2562

3

62374

30.46

963.11

1965

4

62354

30.45

962.21

2116

5

62302

30.42

970.93

2361

6

62312

30.43

962.87

2333

7

62175

30.36

983.57

2145

8

62125

30.33

980.07

2188

9

62107

30.33

970.76

2234

10

62043

30.29

974.63

2584

11

62068

30.31

973.67

2128

12

61958

30.25

978.48

2512

13

61931

30.24

976.52

2280

14

61906

30.23

975.36

2211

15

61845

30.2

983.59

2411

16

61773

30.16

980.99

2438

17

61700

30.13

984.88

2366

18

61677

30.12

987.6

2073

19

61599

30.08

981.48

2083

20

61563

30.06

988.25

2426

21

61639

30.1

985.35

1918

22

61632

30.09

983.79

2350

23

61543

30.05

988.65

2423

24

61549

30.05

990.83

2061

合计

1487146

726.17

977.42

2584

 

第四组 多机多进程producer的写入性能

该用例证明,Producer写入的瓶颈经常发生在客户端服务器,受限于客户端服务器的cpu处理能力。

如下用例中,随着客户端从2台服务器增加到3台服务器,kafka集群的写入的总吞吐量从1066.53MB/s上升到了1694.22MB/s。

在达到kafka集群的处理能力瓶颈之前,随着客户端服务器的增加,kafka集群的吞吐量应该是线性提升的。

本测试用例中,kafka集群由2台broker组成,因此NIC的上限应为2*10Gb/s(实际用iperf测试的结果为7Gb/s-9Gb/s),这也是kafka集群吞吐量的理论上限值。

由于只有三台服务器可以用来作为Producer客户端进行测试,并且还存在本地写入数据获得的网络流量节约收益的影响,本测试用例中的1694.22MB/s还远没有达到集群吞吐量上限。

1)2节点客户端,5producer进程/节点

机器号-进程号

records/sec

MB/sec

avg latency

max latency

vm16_1

199664

97.49

292.58

801

vm16_2

198822

97.08

299.17

740

vm16_3

198483

96.92

297.13

797

vm16_4

196749

96.07

290.9

796

vm16_5

195549

95.48

298.77

803

vm15_1

239854

117.12

165.63

891

vm15_2

239842

117.11

182.91

870

vm15_3

238914

116.66

233.13

903

vm15_4

238504

116.46

242.8

913

vm15_5

237857

116.14

247.24

1005

合计

2184238

1066.53

255.026

1005

 

2)3节点客户端,5producer进程/节点

机器号-进程号

records/sec

MB/sec

avg latency

max latency

vm16_1

232309

113.43

260

880

vm16_2

232331

113.44

258.14

821

vm16_3

230669

112.63

262.34

848

vm16_4

229378

112

262.2

914

vm16_5

225794

110.25

262.96

863

vm15_1

236060

115.26

254.35

811

vm15_2

236540

115.5

251.07

811

vm15_3

232363

113.46

257.94

824

vm15_4

231117

112.85

256.49

851

vm15_5

230223

112.41

258.53

886

vm14_1

231867

113.22

259

1077

vm14_2

231042

112.81

259.87

1051

vm14_3

230001

112.31

260.51

1028

vm14_4

230043

112.33

260.11

1021

vm14_5

230033

112.32

260.52

1037

合计

3469770

1694.22

258.9353333

1077

 

第五组 多机多进程producer在单机Broker下的写入性能

本用例将Broker数量减小至1台,7parititon,部署在vm14上,以测试多机多进程Producer写入单机Broker的吞吐量上限。

可以看到其中vm15,vm16写入vm14的网络流量之和达到800MB/s,接近vm14的网卡上限。

而vm14上的客户端由于不需要走网络流量,使得三台producer客户端写入Broker的速度达到1238.7MB/s,高于vm14的网卡速率。

因此可以假设:Kafka的写入速度瓶颈并不在磁盘上,而是在网卡上。该假设将在下一组实验中论证。

机器号-进程号

records/sec

MB/sec

avg latency

max latency

vm16_1

169136

82.59

364.4

1132

vm16_2

167914

81.99

366.66

1153

vm16_3

167324

81.7

368.2

1180

vm16_4

167622

81.85

367.47

1227

vm16_5

165332

80.73

373.78

1187

vm15_1

162723

79.45

377.7

789

vm15_2

161274

78.75

380.7

867

vm15_3

160632

78.43

382.7

871

vm15_4

158836

77.56

387.53

863

vm15_5

157898

77.1

389.6

881

vm14_1

180564

88.17

339.76

756

vm14_2

180108

87.94

340

749

vm14_3

179700

87.74

341.87

846

vm14_4

179166

87.48

343.58

840

vm14_5

178635

87.22

344.29

799

合计

2536864

1238.7

364.5493333

1227

 

第六组 多机多进程producer在单机Broker下缩减磁盘后的写入性能

在上一组测试中证明单个服务器Broker挂满磁盘的情况下,从其他客户端写入数据的吞吐量可以接近网络流量上限,尝试缩减Broker的磁盘个数,观察是否仍然能够使写入速度达到网络上限?

1)修改磁盘数:7=>6 partition7=>6

vm16,vm15流量之和为754.14MB/s

机器号-进程号

records/sec

MB/sec

avg latency

max latency

vm16_1

158861

77.57

389.48

1114

vm16_2

158548

77.42

391.12

1136

vm16_3

158478

77.38

389.29

1118

vm16_4

158323

77.31

390.9

1116

vm16_5

158192

77.24

391.15

1121

vm15_1

150838

73.65

409.12

1908

vm15_2

150957

73.71

409.14

1915

vm15_3

150747

73.61

412.26

1903

vm15_4

150756

73.61

409.54

1908

vm15_5

148774

72.64

413.31

1921

vm14_1

156474

76.4

381.89

1899

vm14_2

155705

76.03

391.09

1893

vm14_3

154985

75.68

399.37

1910

vm14_4

154971

75.67

398.95

1887

vm14_5

155178

75.77

398.21

1900

合计

2321787

1133.69

398.3213333

1921

 

尝试降低本地客户端的影响:虽然磁盘数量从7降到6,但vm15,vm16写入vm14的流量仍达到915MB/s,接近或达到网卡速率上限。

若不考虑在kafka所在服务器上部署producer,可以稍微降低磁盘的配置,因为由于万兆网卡的速率限制,Broker上的磁盘写入能力并没有充分利用起来。

另一方面,将producer部署在kafka的Broker所在节点上,虽然提升了磁盘利用率,但可能会造成Broker中的内存和cpu资源被其他进程抢占,造成意外情况。

机器号-进程号

records/sec

MB/sec

avg latency

max latency

vm16_1

195863

95.64

312.67

605

vm16_2

194355

94.9

316.09

717

vm16_3

194084

94.77

316.81

706

vm16_4

193963

94.71

316.49

611

vm16_5

192938

94.21

319.66

767

vm15_1

186219

90.93

329.85

584

vm15_2

183742

89.72

334.99

663

vm15_3

178628

87.22

344.36

660

vm15_4

177948

86.89

344.72

653

vm15_5

176584

86.22

347.81

665

合计

1874324

915.21

328.345

767

 

2)修改磁盘数:7=>3 partition7=>6

vm16,vm15流量之和为540.8MB/s

机器号-进程号

records/sec

MB/sec

avg latency

max latency

vm16_1

117913

57.57

525.2

9036

vm16_2

117796

57.52

525.43

9050

vm16_3

117553

57.4

528.17

9041

vm16_4

117354

57.3

529.09

9043

vm16_5

115561

56.43

537.25

9040

vm15_1

105028

51.28

592.25

9090

vm15_2

104716

51.13

593.88

9174

vm15_3

104171

50.86

595.53

9173

vm15_4

104112

50.84

595.75

9174

vm15_5

103365

50.47

599.82

9156

vm14_1

109101

53.27

571.93

9040

vm14_2

109072

53.26

571.99

9037

vm14_3

108882

53.17

573.01

9024

vm14_4

108825

53.14

573.27

9037

vm14_5

108672

53.06

574.35

9028

合计

1652121

806.7

565.7946667

9174

 

尝试降低本地客户端的影响,当磁盘数降到3时,可以看出Broker的吞吐量下降了。

机器号-进程号

records/sec

MB/sec

avg latency

max latency

vm16_1

141087

68.89

438.53

7580

vm16_2

139532

68.13

443.67

7567

vm16_3

139349

68.04

443.77

7575

vm16_4

139326

68.03

444.55

7564

vm16_5

138220

67.49

448.9

7600

vm15_1

140024

68.37

440.56

7655

vm15_2

138669

67.71

444.13

7659

vm15_3

138385

67.57

445.16

7663

vm15_4

138163

67.46

445.63

7647

vm15_5

138159

67.46

443.56

7659

合计

1390914

679.15

443.846

7663

 

2.4 Consumer测试方案

第一组:topic的paritition数量变化对Consumer读取速度的影响

wps1700.tmp

Partition是Consumer消费的基本单元,一个Partition最多只能被一个Consumer实例消费,而一个Consumer实例能够同时消费多个Partition。

当存在多个Partition时,通过多个Consumer实例可以使数据读取得到很好的扩展性。

1)单磁盘

brokers

disks

partition

fetch.MB.sec

fetch.nMsg.sec

1

1

1

202.5608

414844.603

1

1

3

251.7045

515490.7216

1

1

5

273.7764

560694.1018

1

1

7

284.5266

582710.4067

 

结论:单磁盘的情况下,增加partition的数量可以提高消费能力。

2)多磁盘

brokers

disks

partition

fetch.MB.sec

fetch.nMsg.sec

1

1

1

202.5608

414844.603

1

2

1

223.2095

457133.1139

1

2

2

247.9393

507779.6283

 

结论:增加磁盘数量可以提高消费能力。

3)多服务器

brokers

disks

partition

fetch.MB.sec

fetch.nMsg.sec

1

1

1

202.5608

414844.603

2

1

1

225.9357

462716.2687

2

1

2

330.2849

676423.4307

 

结论:增加broker数量可以提高消费能力

*本例只测试了单consumer单线程的本机消费能力,关于多个consumer和多线程的情况在后续用例中补充,该测试用例的结果均时在单consumer单线程的前提下进行的测试

第二组:测试ssd对Consumer读取性能的影响

ssd盘在数据读取时可能会对consumer的读取性能有提升

对照组sas盘:

brokers

disks

partition

fetch.MB.sec

fetch.nMsg.sec

1

1

1

202.5608

414844.603

1

1

3

251.7045

515490.7216

1

1

5

273.7764

560694.1018

 

实验组ssd盘:

brokers

ssd

partition

fetch.MB.sec

fetch.nMsg.sec

1

1

1

498.5514

1021033.2857

1

1

3

744.3312

3048780.4878

1

1

5

425.6287

1743375.1743

 

*多线程consumer对比实验组(数量等于partition数)

brokers

ssd

partition

fetch.MB.sec

fetch.nMsg.sec

1

1

3

254.1190

1040871.5564

1

1

5

213.6263

875013.1252

 

结论:使用ssd可用提升consumer的读取性能。

第三组:测试并发情况下consumer的性能

单个broker在vm15上,7块硬盘,7个partition

* 先后在三个节点上启动consumer(不同时启动,而是分别在不同节点进行测试)

单进程单线程

host

fetch.MB.sec

fetch.nMsg.sec

vm14

252.7953

517724.7877

vm15

442.6969

906643.3364

vm16

293.3786

600839.4617

 

7进程单线程

host

fetch.MB.sec

fetch.nMsg.sec

vm14

664.4753

1360845.456

vm15

979.4621

2005938.397

vm16

646.7693

1324583.567

 

第四组:测试有无group对consumer性能的影响

本组实验主要测试多个consumer同时消费时是否在同一组对总消费能力的影响

* 先后在三个节点上启动consumer(不同时启动,而是分别在不同节点进行测试)

单个broker在vm15上,7块硬盘,7个partition,7进程单线程

不带group_id

host

fetch.MB.sec

fetch.nMsg.sec

vm14

925.1035

1894612.27

vm15

1047.9904

2146284.597

vm16

986.2786

2019898.688

 

带group_id

host

fetch.MB.sec

fetch.nMsg.sec

vm14

670.608

1373405.073

vm15

1075.5057

2202635.803

vm16

654.3338

1340075.742

 

结论:vm15上是否有group id的影响不大,考虑到单broker在vm15上,所以忽略掉这组数据。在vm14和vm16上当带着相同的group id消费时,消费能力明显下降。多个消费者不属于一个组时,读取的是相同的一份数据,只有第一个取数据的消费之会经历从磁盘-内存-网络-客户端,之后的消费之会直接使用内存中的缓存数据,省略掉磁盘到内存的过程,相比之下,总消费能力高于同一组消费者消费的情况。

第五组:多broker对consumer性能的影响

* 先后在三个节点上启动consumer(不同时启动,而是分别在不同节点进行测试)

broker:vm15、vm16,7块硬盘,14个partition,consumer:14进程单线程

host

fetch.MB.sec

fetch.nMsg.sec

vm14

959.2592

1964563

vm15

1232.547

2524258

vm16

1038.836

2127535

 

结论:与第三组的数据做对比发现在多进程的consumer消费时,broker增加一个,消费能力明显提升(vm14达到网络瓶颈,vm16上有ambari server)。

第六组:了解consumer运行时的资源消耗

思路:通过观察consumer运行时broker上的资源使用以及consumer上的资源使用情况,了解Kafka读数据时对各个节点的哪些资源消耗较大。

broker:vm15,consumer:vm14、vm16, 两个consumer(单进程),topic:7partition,大致时间段:15:20-15:40

broker(vm15):

wps1710.tmpwps1721.tmp

consumer(vm14):cpu使用率在7%左右,内存无变化

wps1731.tmpwps1742.tmp

consumer(vm16):cpu使用率在7%左右,内存无变化

wps1753.tmpwps1763.tmp

分析:从整体来看broker节点网络资源out量=consumer节点网络资源in总量,broker节点的cpu几乎无波动(使用率在1%以内),consumer节点的cpu使用率在7%左右。由此可见consumer读取数据时对broker的压力主要体现在网络上,对cpu的压力几乎可以忽略,这得益于Kafka的零拷贝技术。

2.5 同时读写情况下Kafka的性能表现

1)2.3节 第五组 多机多进程producer在单机Broker下的写入性能 的结果如下, 3client*5process,7 SAS disk 7parititon Topic,Broker 部署在node3上

机器号-进程号

records/sec

MB/sec

avg latency

max latency

vm16_1

169136

82.59

364.4

1132

vm16_2

167914

81.99

366.66

1153

vm16_3

167324

81.7

368.2

1180

vm16_4

167622

81.85

367.47

1227

vm16_5

165332

80.73

373.78

1187

vm15_1

162723

79.45

377.7

789

vm15_2

161274

78.75

380.7

867

vm15_3

160632

78.43

382.7

871

vm15_4

158836

77.56

387.53

863

vm15_5

157898

77.1

389.6

881

vm14_1

180564

88.17

339.76

756

vm14_2

180108

87.94

340

749

vm14_3

179700

87.74

341.87

846

vm14_4

179166

87.48

343.58

840

vm14_5

178635

87.22

344.29

799

合计

2536864

1238.7

364.5493333

1227

 

由于上述节点的一些问题,改用第二组服务器(node1-node3)测试

服务器编号-进程编号

record/s

MB/s

avg latency(ms)

max latency(ms)

node1-1

159994

78.12

387.58

916

node1-2

157059

76.69

394.26

929

node1-3

156040

76.19

395.68

823

node1-4

155048

75.71

398.69

865

node1-5

154263

75.32

400.97

900

node2-1

157099

76.71

391.65

1085

node2-2

155289

75.82

396.97

1155

node2-3

152816

74.62

401.88

1057

node2-4

152063

74.25

405.24

1127

node2-5

150661

73.57

407.64

1015

node3-1

159098

77.68

383.47

929

node3-2

158277

77.28

386.23

955

node3-3

154549

75.46

395.06

913

node3-4

153884

75.14

398.12

970

node3-5

151299

73.88

404.66

981

总计

2327439

1136.44

396.54

1155

 

2)多机多进程Consumer在单机Broker下的读取性能 的结果如下, 3client*1process,7 SAS disk 7parititon Topic,Broker 部署在node3上:

服务器编号-进程编号

record/s

MB/s

node1-1

790954.2866

386.2081

node2-1

868217.3989

423.9343

node3-1

1016968.68

496.5667

总计

2676140.366

1306.7091

 

3)多机单进程Consumer和多机多进程producer在单机Broker下同时读写性能 的结果如下,3client*1process consumer, 3client*5process producer,7 SAS disk 7parititon Topic,Broker 部署在node3上:

producer

服务器编号-进程编号

record/s

MB/s

avg latency(ms)

max latency(ms)

node1-1

128985.6568

62.98

477.37

1298

node1-2

128769.734

62.88

479.43

1314

node1-3

128293.9471

62.64

481.55

1318

node1-4

127828.1989

62.42

483.78

1349

node1-5

127616.1307

62.31

482.98

1364

node2-1

130712.1196

63.82

473.27

1330

node2-2

129292.5114

63.13

479.4

1356

node2-3

128945.7396

62.96

480.19

1359

node2-4

127851.0791

62.43

484.19

1286

node2-5

127775.9321

62.39

484.2

1360

node3-1

128882.588

62.93

478.95

1001

node3-2

127769.4018

62.39

481.74

855

node3-3

127411.2581

62.21

484.46

1036

node3-4

127171.4526

62.1

485.22

1034

node3-5

126874.5718

61.95

486.4

980

总计

1924180.321

939.54

481.542

1364

 

consumer

服务器编号-进程编号

record/s

MB/s

node1-1

587482.552

286.8567

node2-1

537564.2873

262.4826

node3-1

475098.2423

231.9816

总计

1600145.082

781.3209

 

通过对比同时读写和单独读写的情况下读取速度和写入速度,可以发现同时读写时,写入速度和读取速度都有所下降,其中写入总量由1136.44MB/s下降到939.54MB/s,读取总量从1306.7091MB/s下降到781.3209MB/s,考虑到同时读写时读和写都在三台机子上同时进行可能带来影响,还需要补充读写不在同一台机器上时的情况。

*1)单机进程producer在单机Broker下的写入性能 的结果如下, 1client*5process,7 SAS disk 7parititon Topic,Broker 部署在node3上,producer在node1上

服务器编号-进程编号

record/s

MB/s

avg latency(ms)

max latency(ms)

node1-1

144529.5563

70.57

425.11

782

node1-2

144146.2219

70.38

427.25

790

node1-3

143653.3931

70.14

428.03

787

node1-4

143620.3826

70.13

428.89

785

node1-5

143266.4756

69.95

431.02

790

总计

719216.0296

351.17

428.06

790

 

*2)单机单进程Consumer在单机Broker下的读取性能 的结果如下, 1client*1process,7 SAS disk 7parititon Topic,Broker 部署在node3上,Consumer在node2上:

服务器编号-进程编号

record/s

MB/s

node2-1

936691.6448

457.3690

 

*3)单机单进程Consumer和单机多进程producer在单机Broker下同时读写性能 的结果如下,1client*1process consumer, 1client*5process producer,7 SAS disk 7parititon Topic,Broker 部署在node3上,Producer在node1上,Consumer在node2上:

producer

服务器编号-进程编号

record/s

MB/s

avg latency(ms)

max latency(ms)

node1-1

148628.1621

72.57

414.32

652

node1-2

147719.2153

72.13

414.7

649

node1-3

146877.3868

71.72

418.55

651

node1-4

145747.0996

71.17

420.68

667

node1-5

145158.949

70.88

421.91

650

总计

734130.8128

358.47

418.032

667

 

consumer

服务器编号-进程编号

record/s

MB/s

node2-1

817825.9732

399.3291

 

Broker 部署在node3上,Producer在node1上,Consumer在node2上,通过对比同时读写和单独读写的情况下读取速度和写入速度,可以看出写入速度只有略微的下降,读取速度下降的较为明显

结论:在同时读写时,读写不同机时读取会受到一些影响,对于写入几乎没有影响,读写同机时读取影响较大,写入影响较小。

2.6 长时间写入的情况下kafka的性能表现

Kafka Broker为了提升写入效率,会将接收到的数据先缓存到os cache层,然后再批量写入到磁盘中。本用例用于观察Kafka在大批量长时间的数据写入时,写入性能是否稳定。

测试条件: 一台Broker,7*6T SAS盘,  7partition,7-14个 Producer进程同时写入。

1)磁盘io观测

wps1793.tmp

磁盘写入IO最大值可达到单磁盘200MB/s左右 ,服务器总写入磁盘io约为1400MB/s。

一般来说,小文件的读写速度会远小于大文件,而kafka由于是将数据批量flush到硬盘中,避免了小文件问题导致的性能影响,理论上能达到磁盘的写入上限,下面通过dd命令测试磁盘的最大写入速度。

sudo time dd if=/dev/zero of=/data/data1/test.dbf bs=8k count=300000 oflag=direct

of: 输出文件位置,对应挂载的磁盘。 oflag=direct: 关闭OS缓存。

文件总大小

文件个数

单个文件大小

是否开启OS缓存

磁盘

CPU利用率

写入速度

命令

2.4GB

300000

8kB

否

SAS

0%

974 kB/s

sudo time dd if=/dev/zero of=/data/data1/test.dbf bs=8k count=300000  oflag=direct

2.4GB

300000

8kB

是

SAS

25%

185 MB/s

sudo time dd if=/dev/zero of=/data/data1/test.dbf bs=8k count=300000 

2.4GB

300000

8kB

否

SSD

10%

200 MB/s

sudo time dd if=/dev/zero of=/home/work/test.dbf bs=8k count=300000  oflag=direct

2.4GB

300000

8kB

是

SSD

41%

314 MB/s

sudo time dd if=/dev/zero of=/home/work/test.dbf bs=8k count=300000

2.4GB

30

80MB

否

SAS

14%

205 MB/s

sudo time dd if=/dev/zero of=/data/data1/test.dbf bs=80000k count=30 oflag=direct

24GB

30

80MB

是

SAS

99%

1.0 GB/s

sudo time dd if=/dev/zero of=/data/data1/test.dbf bs=80000k count=300

2.4GB

30

80MB

否

SSD

19%

389 MB/s

sudo time dd if=/dev/zero of=/home/work/test.dbf bs=80000k count=30 oflag=direct

24GB

30

80MB

是

SSD

99%

1.5 GB/s

sudo time dd if=/dev/zero of=/home/work/test.dbf bs=80000k count=300

 

在不开缓存的情况下,SAS盘写大文件的速度上限约为200MB/s。

2) 每秒写入记录数观测

随着Producer的进程数由7个增至14个,写入速度从80w条/秒上升至207w条/秒,并稳定运行。

wps17A4.tmp

3) jvm状况观测

wps17B4.tmp

wps17C5.tmp

4) 内存状况观测

wps17C6.tmp

5) 总写入数据量

1.9TB*7=13.3TB

wps17D7.tmp

2.7 大数据量下压测kafka至磁盘空间不足时的表现

为了进一步观测kafka长时间运行的表现,可以考虑Kafka的单个Broker在最坏情况下的表现。极限的情况是,Broker所在服务器的磁盘被写满,观察这种情况对性能的影响。

本用例的运行条件与2.6相同,是在2.6的基础上继续执行同样的测试命令,14个其他服务器的客户都拿进程同时写入vm15中的kafka至磁盘达到饱和状态。

1)磁盘变化情况

磁盘空间一开始呈线性下降趋势,当服务器可用总空间仅剩98.9.9GB时,磁盘空间停止下降, 在8点40左右继续开始小幅下降。

wps17E7.tmp

2)写入速度的变化

消息写入速度从200w条/秒,经过4个小时的写入后组逐渐下降至100w条/秒左右,在23点20左右磁盘空间不足后短暂异常飙升,然后降至0,在第二天8点40后恢复5w条/秒的写入速度,之后又降为0。

wps17F8.tmp

3)df -h查看已使用磁盘空间为100%

wps1809.tmp

4)内存使用情况

整个过程内存使用情况平稳。

wps1819.tmp

5)cpu和负载

整个过程CPU负载随着写入情况变化,负载较低。

wps181A.tmp

wps182B.tmp

6)网络流量负载

整个过程中网络流量随写入速度变化明显。

wps184B.tmp

7) 问题分析

问题1.vm.max_map_count=65535不太够用,需要调整为262144

root@vm15 # sysctl -w vm.max_map_count=262144

root@vm15 # sysctl -a|grep vm.max_map_count

vm.max_map_count = 262144

 

wps185C.tmp

查看kafka 的vm.maps,

wps186C.tmp

问题2. 硬盘空间不足导致Kafka Broker强制退出

[2019-10-29 23:17:11,054] ERROR Error while appending records to test_long_time-0 in dir /data/data7/kafka-logs (kafka.server.LogDirFailureChannel)

[2019-10-29 23:17:11,097] ERROR Error while appending records to test_long_time-3 in dir /data/data1/kafka-logs (kafka.server.LogDirFailureChannel)

[2019-10-29 23:17:12,054] ERROR Error while appending records to test_long_time-5 in dir /data/data6/kafka-logs (kafka.server.LogDirFailureChannel)

[2019-10-29 23:17:12,056] ERROR Error while appending records to test_long_time-4 in dir /data/data4/kafka-logs (kafka.server.LogDirFailureChannel)

[2019-10-29 23:17:45,410] ERROR Error while appending records to test_long_time-1 in dir /data/data5/kafka-logs (kafka.server.LogDirFailureChannel)

[2019-10-29 23:17:27,101] ERROR Error while appending records to test_long_time-2 in dir /data/data2/kafka-logs (kafka.server.LogDirFailureChannel)

[2019-10-29 23:18:11,235] ERROR Shutdown broker because all log dirs in /data/data1/kafka-logs, /data/data2/kafka-logs, /data/data3/kafka-logs, /data/data4/kafka-logs, /data/data5/kafka-logs, /data/data6/kafka-logs, /data/data7/kafka-logs have failed (kafka.log.LogManager)

 

系统优化

内存优化

这里主要针对三个参数进行调优测试:vm.swappiness、vm.dirty_background_ratio、vm.dirty_ratio。

vm.swappiness 表示 VM 系统中的多少百分比用来作为 swap 空间;

vm.dirty_background_ratio 指的是被内核进程刷新到磁盘之前缓存脏页数量占系统内存的百分比,异步flush,不影响正常I/O;

vm.dirty_ratio 指的是被内核进程刷新到磁盘之前的脏页数量,同步I/O,影响正常I/O。

对 照 组:vm.swappiness=60 vm.dirty_background_ratio=10 vm.dirty_ratio=20(系统默认值)

wps187D.tmp

实验组一:vm.swappiness=1 vm.dirty_background_ratio=5 vm.dirty_ratio=60

wps188E.tmp

实验组二:vm.swappiness=1 vm.dirty_background_ratio=5 vm.dirty_ratio=20

wps189E.tmp

实验组三:vm.swappiness=1 vm.dirty_background_ratio=10 vm.dirty_ratio=20

wps18AF.tmp

实验组四:vm.swappiness=1 vm.dirty_background_ratio=10 vm.dirty_ratio=60

wps18B0.tmp

相对与对照组的吞吐量和稳定性,四个实验组可以得出以下结论:

vm.swappiness

vm.dirty_background_ratio

vm.dirty_ratio

吞吐量

稳定性

1

5

60

降低

提高

1

5

20

降低

提高

1

10

20

不变

不变

1

10

60

不变

略好

 

根据实验组三可以看出 vm.swappiness 参数修改前后变化不大,考虑到系统内存很大,没用到 swap 的情况,可以暂时忽略该参数的影响,以下主要分析 vm.dirty_background_ratio 和 vm.dirty_ratio 的影响:

首先 vm.dirty_background_ratio 指定了当文件系统缓存脏页数量达到系统内存百分之多少时(如5%)就会触发将一定缓存的脏页异步地刷入磁盘;vm.dirty_ratio 则指定了当文件系统缓存脏页数量达到系统内存百分之多少时(如10%),系统不得不开始处理缓存脏页,在此过程中很多应用进程可能会因为系统转而处理文件IO而阻塞。

从实验现象中也可以看出 vm.dirty_background_ratio 的调整无论是对吞吐量还是稳定性都有很大的影响,10→5时,系统处理脏页(异步刷到磁盘)的频率会增加,由此造成了吞吐量的降低和吞吐量的更加稳定,而 vm.dirty_ratio 的调整要小一些,主要影响稳定性方面(不是很明显),20->60时,系统必须同步处理脏页的频率又有所下降,由此消除了一些吞吐量较低的点(由于阻塞式刷数据造成的吞吐量下降)。

最佳实践

一、存储

1.1 磁盘类型 大部分时候选择普通的sas盘即可

1.2 磁盘大小/数量 根据业务的数据量大小、副本数量、保存天数等策略的选择,计算出所需的总存储量来综合决定

二、主题

2.1 分区数量 24(3broker*7disk,均衡消费者的负载,同时尽量的将分区均摊到每块硬盘)

2.2 副本数量 一般情况下选择2,一致性要求较高时选择3

三、生产者/消费者 客户端

3.1 配置堆内存大小  -Xmx4096M -Xms4096M

3.2 线程/进程数 根据实际的业务需求决定

kafka数据写入速度优化【项目经验总结】 先说结论:调整集群参数 # 每当producer写入10000条消息时,刷数据到磁盘 log.flush.interval.messages=10000 # 每间隔1秒钟时间,刷数据到磁盘 log.flush.interval.ms=1000 好久没有更新了, 沣哥给介绍了个对象,也不知道能不能成,看的看不上咱0.0 回归主题,前几天领导给我派了个活,说客户的kafka消费速度有问题,派我出差去排查一下,我到了现场后先梳理了一下数据链路,一个服务(二进制数据流)->kafkatopic1-& 阅读详情

相关推荐

如何使用Jmeter对Kafka进行性能测试

最近决定把阿里云的消息服务MNS换成Kafka,作为一个测试人员,当然要了解它,测试它。所以,把自己学习和使用的一些经验记录在本文中,研究如何去使用Apache JMeter测试Kafka。 首先,先来了解一下什么是Kafka。 A Brief Overview of Apache Kafka 在一个大型的分布式系统中,通常有很多服务生成不同的事件:日志、监视数据、可疑用户操作等等。在Kafk...

shan286的专栏 1万+

【MQ】kafka(二)——生产者写入为什么这么快?为什么吞吐这么高?

前面一篇博客,小编向大家宏观介绍了kafka是什么,在系统中干什么,以及一些kafka相关的名词介绍。 这篇博客呢,小编就向大家介绍一下,生产者怎么把消息发到broker的?以及生产者发送的方法为什么吞吐量这么高?小编遇到的项目中,一般高峰期的时候,速度是7300条/秒,当搞活动的时候,速度会更高。 我们先来看一下生产者写入数据的流程,然后再来分析一下生产者的内存模型。 这里如果我们开启了acks = -1 的情况下, 要等所有的follower都要拉去日志完毕后,leader才会返回ack。其他问法:

哈士奇 3万+

Kafka性能测试-kafka-producer/consumer

1.写入数据命令(以下所有命令必须在kafka/bin目录下面执行) ./kafka-producer-perf-test.sh --topic newgameMG–num-records 1000000 --record-size 2000 --throughput 500000 --producer-props bootstrap.servers=172.18.3.94:9099,172.18...

hanjihun88的博客 1380

Kafka简介

简介 概述 Kafka是LinkedIn(领英)公司开发后来贡献给了Apache提供的一套分布式的消息系统(message system),是一个分布式流平台 流平台具有三个关键功能: 发布和订阅记录流,类似于消息队列或企业消息传递系统。 以容错的持久方式存储记录流。 处理记录流。 应用场景 建立实时流数据管道,以可靠地在系统或应用程序之间获取数据 构建实时流应用程序,以转换或响应数据流 Kafka本身是由Scala来完成的,所以Kafka天然支持高并发和分布式 Kafka会将生产者添加的

Niklaus的博客 656

kafka 10 性能测试

最近需要做kafka性能测试,一般的比较省事的作法,是直接使用kafka自带的脚本,选个比较NB的机器做压测即可。jdk版本不能太低,否则可能出现下面的异常 Exception in thread "main" java.lang.UnsupportedClassVersionError: kafka/admin/TopicCommand : Unsupported major.minor ve

脚印 1万+

Kafka 性能测试脚本详解

Apache Kafka 官方提供了两个客户端性能测试脚本,它们的存放位置如下: - 生产者性能测试脚本:$KAFKA_HOME/bin/kafka-producer-perf-test.sh - 消费者性能测试脚本:$KAFKA_HOME/bin/kafka-consumer-perf-test.sh 支持测试的性能指标包括:吞吐量(throughput)、最大时延(max-latency)、平均时延(avg-latency)等。

六开箱 1249

kafka测试

影响测试结果配置分析 Borker num.network.thread=3  用于接收并处理网络请求的线程数,默认为3。其内部实现是采用Selector模型。启动一个线程作为Acceptor来负责建立连接,再配合启动num.network.threads个线程来轮流负责从Sockets里读取请求,一般无需改动,除非上下游并发请求量过大。 num.partiton=1 Partition的数...

liyanan21的博客 1016

Kafka vs RocketMQ多Topic对性能稳定性的影响1

下的测试对图,是来评测汗宝马和蒸汽机车谁快的组竞速曲线:图1 汗宝马和蒸汽车的速度稳定性对上图的横轴表测试时间,纵轴表车和马的速度,可以看到,马的加速和最速度均

Kafka性能测试

kafka是一个大数据消息队列(可以看做为缓存软件):能够读写数据:1、测试生产者每秒往kafka写入的最大吞吐量 2、测试消费者每秒从kafka里获取消息最大吞吐量。

前方的路在刚开始 1913

Windows本地部署Qwen3-14B实战指南:Ollama+Open WebUI零Docker方案

大语言模型本地部署是AI工程化落地的关键环节,其核心在于推理框架兼容性、硬件加速适配性与端到端稳定性。Ollama作为轻量级模型运行时,原生支持Windows DirectML与CUDA,规避了Docker/WSL2虚拟化开销和llama.cpp编译风险;Qwen3-14B则凭借128K上下文、Tool Calling原生支持及中文长文本结构化能力,成为政务、金融等场景首选。本文聚焦Windows平台真实约束——显存阈值、驱动版本匹配、路径编码兼容、离线知识库集成(RAG)等工程细节,提供经63台Windo

weixin_32136203的博客 413

Doris StreamLoad任务报错Connection reset

背景 Spark程序扫一张Hive表(大小3-7G),然后用http协议的streamLoad任务提交给Doris集群,在Doris集群从0.13.15升级到0.14.12后spark程序报错streamLoad时突然会Connection reset 分析 enable_http_server_v2 这个参数可以参考FE中文配置中查看到,作用是对于Doris界面是否开启新风格的界面,但是实际上他的作用远不止如此,请接着看 新老版本对于enable_http_server_v2参数默认值是不同的 在0.13

gaofeng的博客 3310

kafka如何选择分区数及kafka性能测试

kafka如何选择分区数及kafka性能测试 1、简言 ​ 如何选择合适的分区,这是我们经常面临的问题,不过针对这个问题,在网上并没有搜到固定的答案。因此,今天在这里主要通过性能测试的工具来告诉如何选择相对应的kafka分区。 2、性能测试工具 ​ kafka本身提供了比较的性能测试工具,我们可以使用它来测试适用于我们机器的kafka分区。 ① 生产者性能测试 分别创建三个topic,副本数设置...

初学者 1万+

EBS开发_创建AP付款

--以下代码于20181002在Tony环境测试通过 /* BEGIN   --mo_global.init('SQLAP');   apps.fnd_global.apps_initialize(user_id =&gt; 1110, resp_id =&gt; 50597, resp_appl_id =&gt; 20003);   --mo_global.set_policy_context(...

蜗牛先生快跑的博客 4767

Kafka设计解析(五)- Kafka性能测试方法及Benchmark报告

本文详细阐述了Kafka的性能测试方法,并全面展示了Kafka各组件的性能测试报告。

技术世界 2073

一文帮你彻底搞懂ARM Debug Interface之SWD(转)

ARM的文档写的已经很好了,但是关于上电以后的第一时间应该怎么操作,依然写的不够清晰,导致我第一次用的时候还是费了一些周折。今天做一个详细的梳理,希望能够帮助到更多的朋友。BTW, ARM_Cortex-M0/3 DesignStart系列会持续更新,只是中间可能会穿插其他知识点。SWD是Serial Wire Debug的简称,翻译成中文是”串行线调试”。

2302_79847220的博客 6862

从零开始:用7353张VOC/YOLO格式混凝土缺陷数据集训练你的第一个检测模型

本文详细介绍了如何使用7353张VOC/YOLO格式的混凝土缺陷数据集训练首个目标检测模型。从环境配置、数据解析到YOLOv5模型训练与优化,提供了完整的实战指南,特别针对数据不平衡问题给出了解决方案,助力开发者快速掌握混凝土缺陷识别技术。

weixin_42651281的博客 256

Kafka性能测试脚本详解

Apache Kafka 官方提供了两个客户端性能测试脚本

fanxl10的专栏 2754

vasp-自旋轨道耦合(SOC)计算步骤

在VASP中执行自旋轨道耦合(SOC)计算,具体的计算步骤如下: 结构优化获取CONTCAR文件 自洽计算(collinear normal VASP calculations)获取IBZKPT,CHGCAR和WAVECAR文件。 SCF+SOC计算,在此步骤中,将步骤2中的IBZKPT复制为KPOINTS,以便两个步骤具有相同的k网格,因此可以读取步骤2中的CHGCAR和WAVECAR文件。 能带结构计算,在此步骤中,将KPOINTS改为高对称点,读取步骤3中的CHGCAR和WAVECAR文件。

懒散的鱼与消失的猫 3万+

Kafka性能测试方法及Benchmark报告

本文主要介绍了如何利用Kafka自带的性能测试脚本及Kafka Manager测试Kafka的性能,以及如何使用Kafka Manager监控Kafka的工作状态,最后给出了Kafka的性能测试 摘要   本文主要介绍了如何利用Kafka自带的性能测试脚本及Kafka Manager测试Kafka的性能,以及如何使用Kafka Manager监控Kafka的工作状态,最后给出了Kafka的

2338

【机器学习】一文搞懂算法模型之:Transformer

必会算法模型之:Transformer

商务合作 | 面试培训 | 职场规划 ==>主页扫码 5610

ubuntu-25.04-desktop-amd64 工具VMware-tools 正确安装方法

摘要:Ubuntu 25.04虚拟机安装VMware Tools后无法实现主机与虚拟机间的文件复制粘贴和拖拽功能,问题可能源于工具兼容性。建议优先安装open-vm-tools套件(含open-vm-tools-desktop),而非官方VMware Tools。具体方案:通过终端执行安装命令后重启系统。该方法已实测有效解决该兼容性问题。(149字)

安徽锐锋科技-沐雨潇竹 672

Kafka性能测试工具

简介 Kafka本身自带了性能测试的脚本,可以测试发送端和消费端的速度,分别为: kafka-producer-perf-test.sh kafka-consumer-perf-test.sh 这两个脚本可以在kafka的bin目录下找到。 发送端 bin/kafka-producer-perf-test.sh usage: producer-performance [-h] --topic TOPIC --num-records NUM-RECORDS --record-size RECORD-SIZE

修破立生 1万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

上一篇: 记一次 Kafka Producer 性能调优实战
下一篇: idea中git分支的使用
王树民
博客等级 码龄10年 912粉丝 560原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值