sendmmsg测试

本文探讨了sendmsg和sendmmsg系统调用的区别,并通过测试代码详细展示了sendmmsg如何提高发送效率。在测试环境中,通过调整sendmmsg的发包数量,发现增加发包数能有效降低发送大量数据的时间。

由于本人才疏学浅,本文难免存在遗漏之处,欢迎大家留言指正,本人将感激不尽。

一、sendmsg和sendmmsg简介

  其中sendmsg就是一个发包的系统调用,一次只能发送一个包,具体的可参考 https://linux.die.net/man/2/sendmsg

  sendmmsg是对sendmsg的优化,调用一次sendmmsg可以发送多个segments,具体可参考 http://man7.org/linux/man-pages/man2/sendmmsg.2.html

这篇文章主要介绍sendmmsg能够带来多大的提升,主要通过代码解释测试的过程,然后给出测试结果。

二、测试代码及测试环境说明

  测试数据大小为1000MB,测试发送完1000MB数据的消耗的时间。由于测试机是万兆网卡(10000Mb/s),如果一直发送,将打满网卡,网卡成为瓶颈,此处在每一次调用sendmmsg发包之后,调用usleep将进程睡眠,缓解网卡的压力。此处测试,限制sendmmsg每次发包个数最多为16,包大小固定为1330,所以万兆网卡将16个包发完大概需要16微妙,所以此处每次调用sendmmsg之后,进程睡眠16微妙,虽然此处通过usleep睡眠16微妙,但是加上进程上下文切换的时间,sendmmsg的调用间隔大于16微妙。

UDP客户端一直发包,每次调用sendmmsg默认为阻塞,代码如下:

#include <iostream>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#i
在Linux内核的网络编程中,`sendmmsg()` 是一个用于高效发送多个消息的系统调用,而 `sock_row` 并不是一个直接的内核结构或函数,但可以理解为与套接字(socket)相关的底层数据结构和操作的一部分。`sendmmsg()` 是 `sendmsg()` 的扩展版本,允许一次系统调用发送多个消息,从而减少系统调用的开销并提高性能。 ### `sendmmsg()` 的作用与实现 `sendmmsg()` 系统调用允许应用程序一次性发送多个 `mmsghdr` 结构,每个结构包含一个 `msghdr` 和一个 `size_t` 字段用于记录发送的字节数。这种设计减少了频繁的用户态到内核态切换,提高了网络通信的效率。 其原型如下: ```c int sendmmsg(int sockfd, struct mmsghdr *msgvec, unsigned int vlen, unsigned int flags); ``` 在内核中,`sendmmsg()` 的处理最终会调用 `sys_sendmmsg()` 函数,该函数会进一步调用 `sock_sendmsg_nosec()` 来跳过安全检查以提升性能。随后进入 `__sock_sendmsg_nosec()` 函数,它将消息传递给底层协议栈的发送函数,例如 TCP 的 `tcp_sendmsg()`。 ```c static inline int __sock_sendmsg_nosec(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t size) { struct sock_iocb *si = kiocb_to_siocb(iocb); si->sock = sock; si->scm = NULL; si->msg = msg; si->size = size; return sock->ops->sendmsg(iocb, sock, msg, size); // 调用具体协议的发送函数 } ``` ### `sock_row` 的理解 虽然 `sock_row` 不是一个标准术语,但在 Linux 内核中,与 `sock` 相关的结构体如 `struct sock`、`struct inet_sock`、`struct tcp_sock` 等构成了网络连接的底层状态。这些结构体继承关系如下: - `struct sock`:通用套接字结构,包含所有协议共享的基本字段。 - `struct inet_sock`:继承自 `struct sock`,用于 IPv4 协议族,增加了如 TTL、端口、IP 地址等字段。 - `struct tcp_sock`:继承自 `struct inet_connection_sock`,专用于 TCP 协议,包含滑动窗口、拥塞控制等 TCP 特有字段。 这些结构体共同构成了“套接字行”(可理解为 `sock_row`)的状态信息,决定了数据如何在网络层和传输层之间传递。 ### 性能优化与使用场景 `sendmmsg()` 的主要优势在于减少系统调用次数,适用于需要批量发送数据的高性能网络应用,例如: - 高频交易系统 - 实时音视频传输 - 游戏服务器的多播/广播场景 通过将多个消息打包发送,`sendmmsg()` 有效减少了上下文切换和系统调用开销,提升了整体吞吐量。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值