[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 471955/471955 kk_assemble_pool_packet_process [21] [23] 1.8 0.08 0.42 471955 tcp_packet_process [23]0.02 0.10 739629/739629 _assemble_session_find [36]0.01 0.08 512494/512494 kk_tcp_session_request_find [43]0.01 0.07 665134/818327 kk_table_entries_timeout_free [39]0.04 0.04 330145/330145 _three_way_handshake_process [45]0.00 0.06 456472/461571 _tcp_data_assemble_process [48]2. gmon-full-off.txt?
0.08 0.48 3746819/3746819 kk_assemble_pool_packet_process [15] [16] 2.4 0.08 0.48 3746819 tcp_packet_process [16] 0.09 0.08 3754332/3782242 kk_table_entries_timeout_free [26] 0.06 0.10 3746592/3746592 _assemble_session_find [27] 0.01 0.09 3747382/3747382 kk_tcp_session_request_find [32] 0.03 0.01 3702531/3702531 _three_way_handshake_process [45] 0.00 0.00 56275/71247 _tcp_data_assemble_process [4295]3. gmon-mid-on.txt
0.10 0.55 3742005/3742005 kk_assemble_pool_packet_process [15] [16] 2.3 0.10 0.55 3742005 tcp_packet_process [16]0.10 0.11 3745003/3745003 _assemble_session_find [21]0.06 0.09 3753439/3777518 kk_table_entries_timeout_free [25]0.02 0.11 3743276/3743276 kk_tcp_session_request_find [30]0.02 0.04 3689792/3689792 _three_way_handshake_process [45]0.00 0.00 64598/81267 _tcp_data_assemble_process [4295]?
根據以上內容,對比一個關鍵步驟里的函數執行站比。可以發現。1中find查詢的占比明確比其他兩種情況更高。 而現象上也是情況1會有丟包,情況2,3不丟包。
再次測試,查看這三次的會話數。
1.?gmon-empty-off.txt
name: tcp_assemble_task_1, size: 0, free: 1048575, pkts: 559700, session: 11688, hit: 0, drop: 0 name: udp_assemble_task_1, size: 0, free: 1048575, pkts: 0, session: 0, hit: 0, drop: 0 queue: 0, ipacket: 2595943, imissed: 1204057 self_counter: 2595943 queue: 0, total_tsc: 8825007304, tsc/pkt: 3399.538166?
2.?gmon-full-off.txt?
name: tcp_assemble_task_1, size: 0, free: 1048575, pkts: 48176, session: 16740, hit: 0, drop: 33152 name: udp_assemble_task_1, size: 0, free: 1048575, pkts: 0, session: 0, hit: 0, drop: 0 queue: 0, ipacket: 3800000, imissed: 0 self_counter: 3800000 queue: 0, total_tsc: 8785588132, tsc/pkt: 2311.9968773. gmon-full-on.txt
name: tcp_assemble_task_1, size: 0, free: 1048575, pkts: 50746, session: 16982, hit: 0, drop: 33600 name: udp_assemble_task_1, size: 0, free: 1048575, pkts: 0, session: 0, hit: 0, drop: 0 queue: 0, ipacket: 3800000, imissed: 0 self_counter: 3800000 queue: 0, total_tsc: 8868949684, tsc/pkt: 2333.934127?
并未發現規律。
使用新數據再次做次測試:
每15個包1個http會話。共270000個會話,按順序組裝,4050000個包。
?
1. empty_on
name: tcp_assemble_task_1, size: 0, free: 1048575, pkts: 1754014, session: 270001, hit: 0, drop: 528988 name: udp_assemble_task_1, size: 0, free: 1048575, pkts: 0, session: 0, hit: 0, drop: 0 queue: 0, ipacket: 4050000, imissed: 0 self_counter: 4050000 queue: 0, total_tsc: 17489586080, tsc/pkt: 4318.4163162. empty_off
name: tcp_assemble_task_1, size: 0, free: 1048575, pkts: 2429992, session: 269999, hit: 0, drop: 0 name: udp_assemble_task_1, size: 0, free: 1048575, pkts: 0, session: 0, hit: 0, drop: 0 queue: 0, ipacket: 4050000, imissed: 0 self_counter: 4050000 queue: 0, total_tsc: 19613438800, tsc/pkt: 4842.824395?
與上一組同樣的測試數據,但是每5000個作為一組并發。
1. empty_on
name: tcp_assemble_task_1, size: 0, free: 1048575, pkts: 285000, session: 270000, hit: 0, drop: 540000 name: udp_assemble_task_1, size: 0, free: 1048575, pkts: 0, session: 0, hit: 0, drop: 0 queue: 0, ipacket: 4015852, imissed: 34148 self_counter: 4015852 queue: 0, total_tsc: 11696532776, tsc/pkt: 2912.590597?
2. empty_off
name: tcp_assemble_task_1, size: 0, free: 1048575, pkts: 2068418, session: 235000, hit: 0, drop: 0 name: udp_assemble_task_1, size: 0, free: 1048575, pkts: 0, session: 0, hit: 0, drop: 0 queue: 0, ipacket: 3756940, imissed: 293060 self_counter: 3756940 queue: 0, total_tsc: 17565322544, tsc/pkt: 4675.433343?
最后,是并發數的問題:
KK程序的最大并發數,只能處理到4000.
name: tcp_assemble_task_1, size: 0, free: 1048575, pkts: 2430000, session: 270000, hit: 0, drop: 0 tcp_session: 1 max_concurrent: 5000 name: udp_assemble_task_1, size: 0, free: 1048575, pkts: 0, session: 0, hit: 0, drop: 0 tcp_session: 1 max_concurrent: 5000 queue: 0, max_concurrent: 5000 queue: 0, ipacket: 4020940, imissed: 29060 self_counter: 4020940 queue: 0, total_tsc: 19906132788, tsc/pkt: 4950.616718?
轉載于:https://www.cnblogs.com/hugetong/p/7251733.html
總結
以上是生活随笔為你收集整理的[development][profile][dpdk] KK程序性能调优的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java实现海报+二维码+二维码中间lo
- 下一篇: CentOS安装glibc-2.14