UDP内核发包流程

背景

工作中遇到客户反馈,上层应用UDP固定间隔100ms发包,但本地tcpdump抓包存在波动,有的数据包之间间隔107ms甚至更多,以此重新梳理了下udp的发送流程。

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发包流程

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则与中断\异常相关。

时延大的问题可能是软中断调度问题。

原文链接:https://www.cnblogs.com/forwards/p/17381458.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:UDP内核发包流程 - Python技术站

(0)
上一篇 2023年5月7日
下一篇 2023年5月8日

相关文章

  • LINUX中NGINX反向代理下的TOMCAT集群(详解)

    下面是对“LINUX中NGINX反向代理下的TOMCAT集群(详解)”的完整攻略。 1.背景介绍 在WEB应用中,服务器负载均衡是一个重要的问题。为了提高应用的可用性和稳定性,通常采用的方法是搭建集群。其中一个较为常见的集群方案是将多个WEB服务器部署在同一网段内,通过负载均衡器进行分发请求。在LINUX系统中,常用的WEB负载均衡器是NGINX,而WEB服…

    Linux 2023年5月14日
    00
  • CentOS7安装Caffe的教程详解

    下面是CentOS 7安装Caffe的完整攻略。 1. 安装依赖 Caffe是一个基于C++的深度学习框架,所以我们需要先安装一些依赖。在命令行中输入以下命令进行安装: sudo yum install -y epel-release sudo yum install -y cmake protobuf-devel leveldb-devel snappy-…

    Linux 2023年5月14日
    00
  • centos8自定义目录安装nginx(教程详解)

    首先,我们需要在CentOS 8系统中创建一个自定义目录,如下所示: sudo mkdir /usr/local/nginx/ 然后,我们需要安装nginx,过程大致如下: 使用wget命令下载nginx源码包 wget http://nginx.org/download/nginx-1.19.2.tar.gz 解压缩源码包 tar xzf nginx-1.…

    Linux 2023年5月14日
    00
  • 如何在Linux系统上进行性能测试?

    在Linux系统上进行性能测试可以通过多种工具和方法来实现,下面将介绍一个基本的流程和常用的工具。 1. 确定测试目标和指标 在开始测试之前,首先需要明确测试的目标和指标。常见的测试目标可能包括服务器的响应时间、并发处理能力、吞吐量等等。针对不同的目标,需要选择不同的测试指标来进行评估。 2. 选择性能测试工具 Linux系统提供了多种性能测试工具,以下是一…

    Linux 2023年4月19日
    00
  • linux安装RabbitMQ详细教程

    下面是关于“Linux安装RabbitMQ详细教程”的完整攻略: 1.安装Erlang RabbitMQ是使用Erlang编写的,因此需要首先安装Erlang。 在Ubuntu系统中,可以使用以下命令安装Erlang: sudo apt-get update sudo apt-get install erlang 如果你使用其他的Linux发行版,可以参考官…

    Linux 2023年5月14日
    00
  • Linux tput命令

    Linux tput命令用于输出终端控制字符,可以用来在终端窗口上改变文本颜色、光标位置、清屏等操作。在命令行中输入“man tput”可以查看其详细用法。 语法格式 tput [-T 设备名] capability [参数列表…] 参数说明 -T 设备名:指定终端设备。 capability:指定一个或多个终端能力,如:clear(清屏)、setf(设…

    Linux 2023年3月28日
    00
  • Linux badblocks命令

    Linux badblocks命令 Linux badblocks命令用于检测磁盘坏道,可以扫描磁盘并标记出坏道。使用badblocks命令可以帮助您检测磁盘的健康状况,以便及时备份数据或更换盘。 命令语法 badblocks命令的基本语法如下: “badblocks [选项] [设备] 其中,选项表示命令选项,设备表示要检测的磁盘设备。 ## 命令项 b…

    Linux 2023年5月10日
    00
  • Linux Test Project(一)

    Testing Linux, one syscall at a time. LTP是从SGI开始的,后由IBM 思科 富士通 SUSE Redhat等组织开发的.该工具的目标是建立一个测试套件用来验证linux的可靠性,健壮性及稳定性.LTP测试套件包含了linux内核及相关功能的工具. 本文主要介绍关于ltp的一些基本信息. LTP项目主页:ltp Git…

    Linux 2023年4月12日
    00
合作推广
合作推广
分享本页
返回顶部