发包
使用系统调用(如 sendto,sendmsg 等)写数据 数据穿过socket 子系统,进入socket 协议族(protocol family)系统(在我们的例子中为 AF_INET) 协议族处理:数据穿过协议层,这一过程(在许多情况下)会将数据(data)转换成数据包(packet) 数据穿过路由层,这会涉及路由缓存和 ARP 缓存的更新;如果目的 MAC 不在 ARP 缓存表中,将触发一次 ARP 广播来查找 MAC 地址 穿过协议层,packet 到达设备无关层(device agnostic layer) 使用 XPS(如果启用)或散列函数选择发送队列 调用网卡驱动的发送函数 数据传送到网卡的 qdisc(queue discipline,排队规则) qdisc 会直接发送数据(如果可以),或者将其放到队列,下次触发NET_TX 类型软中断(softirq)的时候再发送 数据从 qdisc 传送给驱动程序 驱动程序创建所需的DMA 映射,以便网卡从 RAM 读取数据 驱动向网卡发送信号,通知数据可以发送了 网卡从 RAM 中获取数据并发送 发送完成后,设备触发一个硬中断(IRQ),表示发送完成 硬中断处理函数被唤醒执行。对许多设备来说,这会触发 NET_RX 类型的软中断,然后 NAPI poll 循环开始收包 poll 函数会调用驱动程序的相应函数,解除 DMA 映射,释放数据
sysctl -w net.core.wmem_max=8388608 sysctl -w net.core.wmem_default=8388608
/proc/net/snmp /proc/net/netstat /proc/net/dev
https://arthurchiao.art/blog/tuning-stack-tx-zh/
netstat -s