UDP内核发包流程
背景
工作中遇到客户反馈,上层应用UDP固定间隔100ms发包,但本地tcpdump抓包存在波动,有的数据包之间间隔107ms甚至更多,以此重新梳理了下udp的发送流程。
udp发包流程
udp_sendmsg
UDP corking 是一项优化技术,允许内核将多次数据累积成单个数据报发送。在用户程序中有两种方法可以启用此选项:
使用 setsockopt 系统调用设置 socket 的 UDP_CORK 选项
程序调用 send,sendto 或 sendmsg 时,带 MSG_MORE 参数
如果没设置UDP_CORK,直接发送到ip层,根据客户只是偶尔出现时延过高的情况,可以确定UDP_CORK并没有被设置,udp这里应该是直接下发的,udp_send_skb之后直接到ip层,排除udp_sendmsg导致时延波动问题
int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
{
... ...
/* Lockless fast path for the non-corking case. */
if (!corkreq) {
struct inet_cork cork;
skb = ip_make_skb(sk, fl4, getfrag, msg, ulen,
sizeof(struct udphdr), &ipc, &rt,
&cork, msg->msg_flags);
err = PTR_ERR(skb);
if (!IS_ERR_OR_NULL(skb))
err = udp_send_skb(skb, fl4, &cork);
goto out;
}
... ...
}
qdisc发包流程
当配额quota < 0 || need_resched时将触发软中断,否则将直接进行发包。
quota 对应 net.core.dev_weight,可通过sysctl进行更改。
网卡及驱动
如果网卡慢,会导致网卡队列满返回BUSY,数据包重新入队,tcpdump将抓到重复的数据包。客户并未反馈该现象,排除网卡及网卡驱动。
总结
未配置UDP_CORK的情况下,上层udp应用send调用包含两个路径,一个是send直接到网卡驱动进行发送,另一个是send到网络设备子系统__dev_queue_skb,然后由软中断调用继续发送。
决定直接发还是由软中断发的条件是,net.core.dev_weight和 need_resched(需要强制调度),可以通过sysctl -a | grep weight查看其默认值。
对于__qdisc_run来讲,dev_weight代表循环次数,可尝试适当增大这个值,但可能会导致上层应用发送时延增加。
sysctl net.core.dev_weight=4096
need_resched则与中断\异常相关。
时延大的问题可能是软中断调度问题。
UDP内核发包流程的更多相关文章
- kernel笔记——网络收发包流程
本文将介绍网络连接建立的过程.收发包流程,以及其中应用层.tcp层.ip层.设备层和驱动层各层发挥的作用. 应用层 对于使用socket进行网络连接的服务器端程序,我们会先调用socket函数创建一个 ...
- PF_PACKET在内核的流程
PF_PACKET在内核的流程 套接字创建 packet_create() --> 赋值packet_ops 接收流程 packet_recvmsg() skb_recv_datagra ...
- linux 内核启动流程分析,移植
分析 linux-2.6.22.6 内核启动流程 移植 linux-3.4.2 到 JZ2440 开发板 Linux内核源码百度云链接: https://pan.baidu.com/s/1m1ymGl ...
- linux 内核启动流程
Linux内核启动流程详细分析: http://www.linuxidc.com/Linux/2014-10/108034.htm ARM Linux内核启动过程: http://blog.csdn. ...
- 【内核】linux内核启动流程详细分析
Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件,包括内核入口ENTRY(stext)到start_kernel间的初始化代码, 主要作用 ...
- 【内核】linux内核启动流程详细分析【转】
转自:http://www.cnblogs.com/lcw/p/3337937.html Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件 ...
- Tiny4412 Linux 内核启动流程
Linux内核的启动分为压缩内核和非压缩内核两种,这里我们以压缩内核为例.压缩内核运行时,将运行一段解压缩程序,得到真正的内核镜像,然后跳转到内核镜像运行.此时,Linux进入非压缩内核入口,在非压缩 ...
- Bridge的数据在内核处理流程
转:http://blog.sina.com.cn/s/blog_67cc0c8f0101oh33.html 转载一篇Bridge的数据在内核处理流程,文章写的不错啊! (2013-07-05 16: ...
- Linux内核启动流程(简介)
1. vmlinux.lds 首先分析 Linux 内核的连接脚本文件 arch/arm/kernel/vmlinux.lds,通过链接脚本可以找到 Linux 内核的第一行程序是从哪里执行的: 第 ...
- vlan linux内核数据流程
转:http://blog.sina.com.cn/s/blog_62bbc49c0100fs0n.html 一.前言 前几天做协议划分vlan的时候看了一些linux内核,了解不深,整理了下vlan ...
随机推荐
- supervisor 使用中遇到的问题
supervisor 配置完毕,使用supervisorctl reload 和supervisorctl update 启动时候报错 解决方法使用下面命令启动 /usr/bin/python2 /u ...
- JAVA获取MultipartFile文件的MD5
Java获取文件的MD5,核心都是通过JAVA自带的MessageDigest类来实现. 获取文件MD5值主要分为三个步骤: 第一步获取文件的byte信息, 第二步通过MessageDigest类进行 ...
- 顺应潮流,解放双手,让ChatGPT不废话直接帮忙编写可融入业务可运行的程序代码(Python3.10实现)
众所周知,ChatGPT可以帮助研发人员编写或者Debug程序代码,但是在执行过程中,ChatGPT会将程序代码的一些相关文字解释和代码段混合着返回,如此,研发人员还需要自己进行编辑和粘贴操作,效率上 ...
- 论文翻译:2023_THLNet: two-stage heterogeneous lightweight network for monaural speech enhancement
论文地址:THLNet: 用于单耳语音增强的两级异构轻量级网络 代码:https://github.com/dangf15/THLNet 引用格式:Dang F, Hu Q, Zhang P. THL ...
- Live Home 3D Pro - 用于公寓和房屋的室内设计,支持 3D 实时渲染
Live Home 3D Pro是一个直观的应用程序,用于公寓和房屋的室内设计,以及几乎任何复杂的景观.专业版提供了一套扩展的工具和独特的出口质量. 下载 ► Live Home 3D Pro 下载安 ...
- 集合-LinkedHashMap 源码详细分析(JDK1.8)
1. 概述 LinkedHashMap 继承自 HashMap,在 HashMap 基础上,通过维护一条双向链表,解决了 HashMap 不能随时保持遍历顺序和插入顺序一致的问题.除此之外,Linke ...
- 集合-LinkedList 源码分析(JDK 1.8)
1.概述 LinkedList 是 Java 集合框架中一个重要的实现,其底层采用的双向链表结构.和 ArrayList 一样,LinkedList 也支持空值和重复值.由于 LinkedList 基 ...
- ChatGPT 通识入门
最近网络上对于Chat GPT的讨论热潮不断地膨胀,一个势必给整个人类社会带来新变革的科技和工具产生了.这个新的工具能够识别自然语言并能够理解上下文的语境,并能够具备人类思维的模型. 但是ChatGP ...
- 在Kubernetes(k8s)中使用GPU
介绍 Kubernetes 支持对节点上的 AMD 和 NVIDIA GPU (图形处理单元)进行管理,目前处于实验状态. 修改docker配置文件 root@hello:~# cat /etc/do ...
- python标准模块之subprocess
subprocess --- 子进程管理 源代码: Lib/subprocess.py 写在前面: 感觉也就这俩有用: subprocess.run() subprocess.Popen() w下 ...