网络性能在云计算中扮演者越来越重要的角色,除了改进网络延迟和吞吐量,另一个常见的任务是消除可能由丢包引起的时延异常。网络分析是跨硬件和软件的,这里的硬件是指物理网络,包括网络借口卡、交换机、路由器和网关。软件是指内核协议栈,通常是TCP/IP,以及每个锁涉及的协议的行为。
【为啥网络中的这些函数都叫啥xmit呢?英语看来没过关啊:XMIT = [计]=TransMIT 发送、传送 】
接收:
napi_gro_receive_entry:
napi_gro_frags_entry:
netif_receive_skb:
netif_receive_skb_entry:
netif_rx
netif_rx_entry
netif_rx_ni_entry
发送相关:
net_dev_queue:
函数: dev_queue_xmit, ip_skb_dest_mmu
trace_net_dev_queue 这个 tracepoint 在函数 net_dev_queue 这里是ipv4最主要的函数了;
这个函数发生在ip层向链路层之间做传递的时候发生;
dnsmasq 1755 [003] 6547.732801: net:net_dev_queue: dev=lo skbaddr=0xffff880035b41800 len=88 91d05d __dev_queue_xmit (/usr/lib/debug/boot/vmlinux-4.4.0-21-generic) 91d2e0 dev_queue_xmit (/usr/lib/debug/boot/vmlinux-4.4.0-21-generic) 95d255 ip_finish_output2 (/usr/lib/debug/boot/vmlinux-4.4.0-21-generic) 95e076 ip_finish_output (/usr/lib/debug/boot/vmlinux-4.4.0-21-generic) 95ea6e ip_output (/usr/lib/debug/boot/vmlinux-4.4.0-21-generic) 95e235 ip_local_out (/usr/lib/debug/boot/vmlinux-4.4.0-21-generic) 95f439 ip_send_skb (/usr/lib/debug/boot/vmlinux-4.4.0-21-generic) 9869cd udp_send_skb (/usr/lib/debug/boot/vmlinux-4.4.0-21-generic) 【使用ping操作,首先会使用dnsmasq 发送数据,这里也能看到dns发现使用的是udp协议】
987907 udp_sendmsg (/usr/lib/debug/boot/vmlinux-4.4.0-21-generic) 994e05 inet_sendmsg (/usr/lib/debug/boot/vmlinux-4.4.0-21-generic) 8fe098 sock_sendmsg (/usr/lib/debug/boot/vmlinux-4.4.0-21-generic) 8feb41 ___sys_sendmsg (/usr/lib/debug/boot/vmlinux-4.4.0-21-generic) 8ff491 __sys_sendmsg (/usr/lib/debug/boot/vmlinux-4.4.0-21-generic) 8ff4e2 sys_sendmsg (/usr/lib/debug/boot/vmlinux-4.4.0-21-generic) a244f2 entry_SYSCALL_64_fastpath (/usr/lib/debug/boot/vmlinux-4.4.0-21-generic) 7fe5e798e450 __sendmsg_nocancel (/lib/x86_64-linux-gnu/libc-2.23.so) 555a4477b18c _init (/usr/sbin/dnsmasq) 555a4477d77c _init (/usr/sbin/dnsmasq) 555a4478199c _init (/usr/sbin/dnsmasq) 555a4476657b _init (/usr/sbin/dnsmasq) 7fe5e78a6830 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.23.so) 555a447676b9 _init (/usr/sbin/dnsmasq)
net_dev_start_xmit:
在 dev_hard_start_xmit 函数中,xmit_one 函数中。这里应该说是下发skb的第二步,因为这里包可能会被缓存【拥塞的控制,NET层的拥塞控制是在链路层做的?】
dnsmasq 1755 [003] 8757.164914: net:net_dev_xmit: dev=wlp4s0 skbaddr=0xffff8800875a8700 len=73 rc=0 91cb76 dev_hard_start_xmit (/usr/lib/debug/boot/vmlinux-4.4.0-21-generic) 94150f sch_direct_xmit (/usr/lib/debug/boot/vmlinux-4.4.0-21-generic) 91cf7d __dev_queue_xmit (/usr/lib/debug/boot/vmlinux-4.4.0-21-generic) 91d2e0 dev_queue_xmit (/usr/lib/debug/boot/vmlinux-4.4.0-21-generic) 925df8 neigh_resolve_output (/usr/lib/debug/boot/vmlinux-4.4.0-21-generic) 95d116 ip_finish_output2 (/usr/lib/debug/boot/vmlinux-4.4.0-21-generic) 95e076 ip_finish_output (/usr/lib/debug/boot/vmlinux-4.4.0-21-generic) 95ea6e ip_output (/usr/lib/debug/boot/vmlinux-4.4.0-21-generic) 95e235 ip_local_out (/usr/lib/debug/boot/vmlinux-4.4.0-21-generic) 95f439 ip_send_skb (/usr/lib/debug/boot/vmlinux-4.4.0-21-generic) 986aa6 udp_send_skb (/usr/lib/debug/boot/vmlinux-4.4.0-21-generic) 987907 udp_sendmsg (/usr/lib/debug/boot/vmlinux-4.4.0-21-generic) 994e05 inet_sendmsg (/usr/lib/debug/boot/vmlinux-4.4.0-21-generic) 8fe098 sock_sendmsg (/usr/lib/debug/boot/vmlinux-4.4.0-21-generic) 8fe681 SYSC_sendto (/usr/lib/debug/boot/vmlinux-4.4.0-21-generic) 8ff19e sys_sendto (/usr/lib/debug/boot/vmlinux-4.4.0-21-generic) a244f2 entry_SYSCALL_64_fastpath (/usr/lib/debug/boot/vmlinux-4.4.0-21-generic) 7fe5e798e4b3 __sendto_nocancel (/lib/x86_64-linux-gnu/libc-2.23.so) 555a4477c6fb _init (/usr/sbin/dnsmasq) 555a4477d2b1 _init (/usr/sbin/dnsmasq) 555a4478191b _init (/usr/sbin/dnsmasq) 555a4476657b _init (/usr/sbin/dnsmasq) 7fe5e78a6830 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.23.so) 555a447676b9 _init (/usr/sbin/dnsmasq)
net_dev_xmit: (来自函数xmit_one)
都是传输的过程,net_dev_xmit 和 net_dev_start_xmit 是相互配合的一对,是为了统计一个计时:
2908 static int xmit_one(struct sk_buff *skb, struct net_device *dev, 2909 struct netdev_queue *txq, bool more) 2910 { 2911 unsigned int len; 2912 int rc; 2913 2914 if (!list_empty(&ptype_all) || !list_empty(&dev->ptype_all)) 2915 dev_queue_xmit_nit(skb, dev); 2916 2917 len = skb->len; 2918 trace_net_dev_start_xmit(skb, dev); //-------------- START -------------------------------- 2919 rc = netdev_start_xmit(skb, dev, txq, more); 2920 trace_net_dev_xmit(skb, rc, dev, len); //--------------- END --------------------------------- 2921 2922 return rc; 2923 }
这里会有个钩子?怎么看系统中的钩子函数是哪一个?