[development][profile][dpdk] KK程序性能调优

KK程序:

1. 两个线程,第一个从DPDK收包,通过一个ring数据传递给第二个线程。第二个线程将数据写入共享内存。

2. 第二个内存在发现共享内存已满时,会直接丢弃数据。

3. 线程二有个选项debug,用于每一次ring_dequeue之后,都将数据写入内存。

  当这个选项为on时,内存未满,也不会丢包。

现象:当内存已满的时候,可以千兆线速收包。当内存未满时,丢包率为20%。

分别做三次gprof:

1. gmon-empty-off.txt

                0.08    0.42  /      kk_assemble_pool_packet_process []
[] 1.8 0.08 0.42 tcp_packet_process []
0.02 0.10 / _assemble_session_find []
0.01 0.08 / kk_tcp_session_request_find []
0.01 0.07 / kk_table_entries_timeout_free []
0.04 0.04 / _three_way_handshake_process []
0.00 0.06 / _tcp_data_assemble_process []

2. gmon-full-off.txt

                0.08    0.48 /     kk_assemble_pool_packet_process []
[] 2.4 0.08 0.48 tcp_packet_process []
0.09 0.08 / kk_table_entries_timeout_free []
0.06 0.10 / _assemble_session_find []
0.01 0.09 / kk_tcp_session_request_find []
0.03 0.01 / _three_way_handshake_process []
0.00 0.00 / _tcp_data_assemble_process []

3. gmon-mid-on.txt

                0.10    0.55 /     kk_assemble_pool_packet_process []
[] 2.3 0.10 0.55 tcp_packet_process []
0.10 0.11 / _assemble_session_find []
0.06 0.09 / kk_table_entries_timeout_free []
0.02 0.11 / kk_tcp_session_request_find []
0.02 0.04 / _three_way_handshake_process []
0.00 0.00 / _tcp_data_assemble_process []

根据以上内容,对比一个关键步骤里的函数执行站比。可以发现。1中find查询的占比明确比其他两种情况更高。 而现象上也是情况1会有丢包,情况2,3不丢包。

再次测试,查看这三次的会话数。

1. gmon-empty-off.txt

name: tcp_assemble_task_1, size: , free: , pkts: , session: , hit: , drop:
name: udp_assemble_task_1, size: , free: , pkts: , session: , hit: , drop:
queue: , ipacket: , imissed: self_counter:
queue: , total_tsc: , tsc/pkt: 3399.538166

2. gmon-full-off.txt

name: tcp_assemble_task_1, size: , free: , pkts: , session: , hit: , drop:
name: udp_assemble_task_1, size: , free: , pkts: , session: , hit: , drop:
queue: , ipacket: , imissed: self_counter:
queue: , total_tsc: , tsc/pkt: 2311.996877

3. gmon-full-on.txt

name: tcp_assemble_task_1, size: , free: , pkts: , session: , hit: , drop:
name: udp_assemble_task_1, size: , free: , pkts: , session: , hit: , drop:
queue: , ipacket: , imissed: self_counter:
queue: , total_tsc: , tsc/pkt: 2333.934127

并未发现规律。

使用新数据再次做次测试:

每15个包1个http会话。共270000个会话,按顺序组装,4050000个包。

1. empty_on

name: tcp_assemble_task_1, size: , free: , pkts: , session: , hit: , drop:
name: udp_assemble_task_1, size: , free: , pkts: , session: , hit: , drop:
queue: , ipacket: , imissed: self_counter:
queue: , total_tsc: , tsc/pkt: 4318.416316

2. empty_off

name: tcp_assemble_task_1, size: , free: , pkts: , session: , hit: , drop:
name: udp_assemble_task_1, size: , free: , pkts: , session: , hit: , drop:
queue: , ipacket: , imissed: self_counter:
queue: , total_tsc: , tsc/pkt: 4842.824395

与上一组同样的测试数据,但是每5000个作为一组并发。

1. empty_on

name: tcp_assemble_task_1, size: , free: , pkts: , session: , hit: , drop:
name: udp_assemble_task_1, size: , free: , pkts: , session: , hit: , drop:
queue: , ipacket: , imissed: self_counter:
queue: , total_tsc: , tsc/pkt: 2912.590597

2. empty_off

name: tcp_assemble_task_1, size: , free: , pkts: , session: , hit: , drop:
name: udp_assemble_task_1, size: , free: , pkts: , session: , hit: , drop:
queue: , ipacket: , imissed: self_counter:
queue: , total_tsc: , tsc/pkt: 4675.433343

最后,是并发数的问题:

KK程序的最大并发数,只能处理到4000.

name: tcp_assemble_task_1, size: , free: , pkts: , session: , hit: , drop:  tcp_session:  max_concurrent:
name: udp_assemble_task_1, size: , free: , pkts: , session: , hit: , drop: tcp_session: max_concurrent:
queue: , max_concurrent:
queue: , ipacket: , imissed: self_counter:
queue: , total_tsc: , tsc/pkt: 4950.616718
上一篇:MNIST机器学习入门


下一篇:第三个spring冲刺第5、6、7天(三天汇总)