当前位置: 首页 > Linux

FRR学习第10天--zebra进程分析

时间:2023-04-06 11:48:40 Linux

启动zebra进程sudozebra-d查看zebra进程状态ubuntu@ubuntu:~$sudotop-b-n1-H-p`pidofzebra`top-03:23:3810分钟,1个用户,平均负载:0.05、0.17、0.19线程:总共2个,0个正在运行,2个正在睡眠,0个已停止,0个僵尸%Cpu(s):6.2us,0.0sy,0.0ni,93.8id,0.0wa,0.0hi,0.0si,0.0stMiBMem:总计3918.7,2696.1免费,607.3使用,615.4buff/cacheMiB交换:总计2048.0,免费2048.0,使用0.0。CPU%MEMTIME+COMMAND1474frr2008400855963076S0.00.10:00.00zebra1475frr2008400855963076S0.00.10:00.00Zebradplaneubuntu@ubuntu@ubuntu:~$启动信息,从上面可以看出它启动一个子线程zebradplane。启动staticdsudostaticd-d查看zebra进程的线程:ubuntu@ubuntu:~$sudotop-b-n1-H-p`pidofzebra`top-03:26:53up14min,1user,平均负载:0.00、0.08、0.15线程:总共3个,运行0个,睡眠3个,停止0个,僵尸0%Cpu(s):0.0us,6.2sy,0.0ni,93.8id,0.0wa,0.0hi,0.0si,0.0stMiB内存:总计3918.7,免费2692.0,已使用610.8,615.9buff/cacheMiB交换:总计2048.0,免费2048.0,已使用0.0。3051.1availMemPIDUSERPRNIVIRTRESSHRS%CPU%MEMTIME+COMMAND1474frr20015815663683696S0.00.20:00.00zebra1475frr20015815663683696S0.00.210Zebra0d0.00.210:00.00zebra15815663683696S0.00.20:00.00ubzebra_static,zebra多了一个线程zebra_apic。可以猜测staticd和zebra线程之间是有联系的,zebra创建了一个线程来处理staticd请求。启动bgpdsudobgpd-d查看zebra线程数:ubuntu@ubuntu:~$sudotop-b-n1-H-p`pidofzebra`top-03:31:05up18min,2users,load平均值:0.00、0.03、0.10线程:总共5个,运行0个,睡眠5个,停止0个,僵尸0%Cpu(s):0.0us,0.0sy,0.0ni,100.0id,0.0wa,0.0hi,0.0si,0.0stMiB内存:总计3918.7,免费2677.2,已使用621.3,620.2buff/cacheMiB交换:总计2048.0,免费2048.0,已使用0.0。3040.5availMemPIDUSERPRNIVIRTRESSHRS%CPU%MEMTIME+COMMAND1474frr20030562063683696S0.00.20:00.00zebra1475frr20030562063683696S0.00.210Zebra0frr20.210:00斑马30562063683696S0.00.20:00.00zebra_apic1882frr20030562063683696S0.00.20:00.00zebra_apic1883frr20030562063683696S0.00.20:00.00zebra_apicubuntu@ubuntu:~$Itcanbeseenthatafterstartingbgpd进程,zebra中还有两个zebra_apic线程。可以猜测是bgpd和zebra线程之间有联系,zebra创建了一个线程来处理bgpd的请求。启动vtyshsudovtysh检查zebra线程数:ubuntu@ubuntu:~$sudotop-b-n1-H-p`pidofzebra`top-03:32:59up20min,2users,loadaverage:0.16、0.05、0.10线程:总共5个,0个正在运行,5个正在睡眠,0个已停止,0个僵尸%Cpu(s):0.0us,0.0sy,0.0ni,100.0id,0.0wa,0.0hi,0.0si,0.0stMiB内存:总计3918.7,免费2669.6,已使用628.9,620.3buff/cacheMiB交换:总计2048.0,免费2048.0,已使用0.0。3032.9availMemPIDUSERPRNIVIRTRESSHRS%CPU%MEMTIME+COMMAND1474frr20030562063683696S0.00.20:00.00zebra1475frr20030562063683696S0.00.200.210Zebra00.00.200:00.00斑马30562063683696S0.00.20:00.00zebra_apic1882frr20030562063683696S0.00.20:00.00zebra_apic1883frr20030562063683696S0.00.20:00.00zebra_apicubuntu@ubuntu:~$Itcanbeseenthataftervtysh开始,斑马线进程数没有改变。rib的增删改查过程在rib_process_add_fib函数中设置断点触发路由的添加(邻居利用网络发布路由)。线程1"zebra"在zebra/zebra_rib.c:17091709rib_process_add_fib(zvrf,rn,new_fib);(gdb)bt_add_fib(new_process_fib)0x55c3cabb3b50,rn=0x55c3cabb3c30,zvrf=0x55c3caba2150)在zebra/zebra_rib.c:1709#1rib_process(rn=0x55c3cabb3c30)在zebra/zebra_rib.c:1709#2process_subq(qindex=0'\000',subcq3=0x5)在zebra/zebra_rib.c:2137#3meta_queue_process(dummy=,data=0x55c3cab6fff0)在zebra/zebra_rib.c:2198#40x00007ff6f9c03163在work_queue_run(thread=que0x7ffe38158at)1work/lib2at#50x6fcallthread6fcall(thread=que0x7ffe38158at)thread=thread@entry=0x7ffe38158a90)在lib/thread.c:1547#60x00007ff6f9bd8257在frr_run(master=0x55c3caad4aa0)在lib/libfrr.c:1021#70x000055c3ca32b1be在main(argc=2,argv=0x7effe588815)/main.c:475(gdb)研究代码后发现,上面的过程只是其中的一部分。主线程提交任务到一个队列,然后是zebra_dplane这一行程序进行处理,在随意数netlink_talk_info处设置断点:#0netlink_talk_info(filter=0x55c3ca334d05,n=n@entry=0x7ff6f95a7ad0,dp_info=0x55c3cad18d18,startup=startup@netbraker./0)949#10x000055c3ca33a965innetlink_route_multipath(cmd=cmd@entry=24,ctx=ctx@entry=0x55c3cad18c40)在zebra/rt_netlink.c:1750#20x000055c3ca33bd5finkernel_route_update(ctx=ctx@entry@entry=0x5)c:1850#30x000055c3ca342283inkernel_dplane_route_update(ctx=0x55c3cad18c40)atzebra/zebra_dplane.c:2120#4kernel_dplane_process_func(prov=0x55c3cab70030)atzebra/zebra_dplane.c:2194#50x000055c3ca341493indplane_thread_loop(event=)在zebra/zebra_dplane.c:2607#60x00007ff6f9bfb968在thread_call(thread=thread@entry=0x7ff6f95abe30)在lib/thread.c:1547#70x00007ff6f9bcf4aa在fpt_run(arg=0x55c3cac17ee0)在lib/frr_pthread.c:260x00007ff6f9b52182instart_thread(arg=)atpthread_create.c:486#90x00007ff6f9a7bb1finclone()at../sysdeps/unix/sysv/linux/x86_64/clone.S:95(gdb)经过分析,我们基本可以确定各自的作用三个线程:主线程zebra:用于集中处理各种消息,其次是详细分析线程zebra_dplane:用于处理内核下路由信息到主线程处理的最终任务。关注sonic的fpm和zebra的交互:rib_process_add_fib函数调用hook_call(rib_update,rn,"newrouteselected");调用fpm注册的zfpm_trigger_update函数。后续详细分析整个代码流程。