译|Monitoring and Tuning the Linux Networking Stack: Sending Data(十一)
接下来,在上面的循环内部开始另一个循环:/* clear last DMA location and unmap remaining buffers */ while (tx_desc != eop_desc) { tx_buffer++; tx_desc++; i++; if (unlikely(!i)) { ...
译|Monitoring and Tuning the Linux Networking Stack: Sending Data(十)
驱动操作注册驱动程序为各种操作实现一系列功能,例如:发送数据(ndo_start_xmit)获取统计信息(ndo_get_stats64)处理设备 ioctls(ndo_do_ioctl)还有更多。函数被导出为一系列排列在结构中的函数指针。 让我们来看看 igb驱动程序源代码中这些操作的结构定义:static const struct net_device_ops igb_netdev_ops ....
译|Monitoring and Tuning the Linux Networking Stack: Sending Data(九)
最后,我们来看看我们的朋友 dev_hard_start_xmit因此,我们已经遍历了整个网络栈,直到 dev_hard_start_xmit。 也许你是经 sendmsg 系统调用直接到达这里的,或者你是经 qdisc 上处理网络数据的 softirq 线程到达这里的。dev_hard_start_xmit 将向下调用设备驱动程序来实际执行传输操作。dev_hard_start_xmit函数处....
译|Monitoring and Tuning the Linux Networking Stack: Sending Data(八)
handle_dev_cpu_collision来自 ./net/sched/sch_generic.c 的代码 handle_dev_cpu_collision 处理两种情况:传输锁由当前 CPU 持有。传输锁由其他 CPU 持有。在第一种情况下,这被作为配置问题处理,因此打印警告。 在第二种情况下,增加统计计数器cpu_collision,并且数据经 dev_requeue_skb 发送,以....
译|Monitoring and Tuning the Linux Networking Stack: Sending Data(七)
调优:Transmit Packet Steering(XPS)要使 XPS 工作,必须在内核配置中启用它(在 Ubuntu 的内核 3.13.0 上是启用的),并且需要一个位掩码来描述哪些 CPU 应该处理给定接口和传输队列的数据包。这些位掩码类似于 RPS 位掩码,您可以在内核文档中找到关于这些位掩码的一些 文档。简而言之,要修改的位掩码位于:/sys/class/net/DEVICE_NA....
译|Monitoring and Tuning the Linux Networking Stack: Sending Data(六)
Transmit Packet Steering(XPS)Transmit Packet Steering(XPS)是一项特性,允许系统管理员确定哪些 CPU 可以处理设备的哪些传输队列的传输操作。此功能的主要目的是避免在处理传输请求时出现锁争用。使用 XPS 时,还期望获得其他好处,如减少缓存驱逐和避免在 NUMA 机器 上进行远程内存访问。您可以 查看 XPS 的内核文档 来了解更多关于 X....
译|Monitoring and Tuning the Linux Networking Stack: Sending Data(五)
且 “硬件头”(hh)已缓存(因为之前发送过数据并已生成它),则调用 neigh_hh_output。否则,调用 output 函数。两条代码路径都以 dev_queue_xmit 结束,它传递 skb 到 Linux 网络设备子系统,在到达设备驱动程序层之前会进行更多处理。让我们跟随 neigh_hh_output 和 n->output 代码路径,直至 dev_queue_xmit。n....
译|Monitoring and Tuning the Linux Networking Stack: Sending Data(四)
IP 协议层UDP 协议层简单地调用 ip_send_skb 传递 skbs 给 IP 协议,因此让我们从那开始,并掌握 IP 协议层!ip_send_skbip_send_skb 函数位于 ./net/ipv4/ip_output.c 中,非常短。 它只是向下调用 ip_local_out,如果 ip_local_out 返回某种错误,它就会增加错误统计信息。 我们来看一下:int ip_se....
译|Monitoring and Tuning the Linux Networking Stack: Sending Data(三)
最后,如果没有错误发生,__ip_make_skb 出队队列中的 skb,添加 IP 选项,并返回一个 skb,该 skb 已准备好传递给底层发送:return __ip_make_skb(sk, fl4, &queue, &cork);传输数据!如果没有发生错误,则 skb 会交给 udp_send_skb,它传递 skb 到网络栈的下一层,即 IP 协议栈:err = PTR....
译|Monitoring and Tuning the Linux Networking Stack: Sending Data(二)
UDP corking在变量声明和一些基本的错误检查之后,udp_sendmsg 要做的第一件事就是检查套接字是否“corked”。 UDP corking 是一项特性,允许用户程序请求内核累积多次 send 调用的数据到单个数据报中发送。 在用户程序中有两种方法可启用此选项:使用 setsockopt 系统调用,传递 UDP_CORK 套接字选项。调用 send、sendto 或 sendms....
本页面内关键词为智能算法引擎基于机器学习所生成,如有任何问题,可在页面下方点击"联系我们"与我们沟通。
Linux宝库