监视和调整Linux网络协议栈:发送数据
时间:2022-07-05 15:30:00
目录
监控和调整Linux网络堆栈的一般建议
总览
详细外观
协议族注册
网络数据通过套接字发送
sock_sendmsg,__sock_sendmsg和__sock_sendmsg_nosec
inet_sendmsg
UDP协议层
udp_sendmsg
udp_send_skb
监视:UDP协议层统计信息
调整:套接字发送队列内存
IP协议层
ip_send_skb
ip_local_out和__ip_local_out
netfilter和nf_hook
目标缓存
ip_output
ip_finish_output
ip_finish_output2
dst_neigh_output
neigh_hh_output
n->output
监控:IP协议层
Linux网络设备子系统
Linux流量控制
dev_queue_xmit和__dev_queue_xmit
正在恢复__dev_queue_xmit
__dev_xmit_skb
调整:传输数据包导向(XPS)
排队学科!
qdisc_run_begin和qdisc_run_end
__qdisc_run
qdisc_restart
提醒,同时循环__qdisc_run
终于可以见到我们的朋友了dev_hard_start_xmit
监控qdiscs
调优qdiscs
网络设备驱动程序
驱动注册
与传输数据ndo_start_xmit
igb_tx_map
传输完成
监控网络设备
监控动态队列限制
调整网络设备
结束
附加功能
减少ARP流量(MSG_CONFIRM)
UDP瓶塞
时间戳记
结论
帮助Linux联网或其他系统
这篇博客文章解释了运行Linux当数据包从用户程序流向网络硬件时,内核计算机如何发送数据包,如何监控和调整网络堆栈的每个组件。
本文与我们之前的英文原文《监控与调整》一起Linux网络堆栈:接收数据或中文翻译《监视和调整Linux网络协议栈:接收数据》一对。span>
如果不阅读内核的源代码并且对正在发生的事情有深刻的了解,就不可能调整或监视Linux网络堆栈。
希望该博客文章可以为希望这样做的任何人提供参考。
有关监视和调整Linux网络堆栈的一般建议
正如我们在上一篇文章中提到的,Linux网络堆栈很复杂,没有一种适合所有解决方案的监视或调整解决方案。如果您确实想调整网络堆栈,则别无选择,只能花费大量的时间,精力和金钱来了解网络系统各部分之间的交互方式。
本博客文章中提供的许多示例设置仅用于说明目的,不建议或反对某些配置或默认设置。在调整任何设置之前,您应该围绕需要监视的内容建立参考框架,以注意到有意义的更改。
通过网络连接到机器时调整网络设置很危险;您可以轻松地将自己锁定在外,或者完全断开网络连接。不要在生产机器上调整这些设置;取而代之的是,对新机器进行调整,然后将其轮流投入生产。
总览
作为参考,您可能希望随身携带一份器件数据手册。这篇文章将检查由igb
设备驱动程序控制的Intel I350以太网控制器。您可以在此处找到该数据表(警告:大PDF)以供参考。
从用户程序到网络设备的高级路径网络数据如下:
- 数据是使用系统调用写入(如
sendto
,sendmsg
等人)。 - 数据通过套接字子系统传递到套接字的协议系列系统(在我们的示例中为
AF_INET
)。 - 协议族通过协议层(在许多情况下)将数据安排到数据包中传递数据。
- 数据通过路由层,沿途填充目标缓存和邻居缓存(如果它们很冷)。如果需要查找以太网地址,则可以生成ARP通信。