Linux有一个功能,可以通过在内核和用户之间映射一个共享缓冲区来有效地捕获网络数据包。我正在尝试以不需要 root 访问权限的方式使用此接口(因为我没有它)。
通常 packet_mmap 用于直接查看网络上的所有数据包,这需要 root 访问权限。我的应用程序只需要使用标准的 linux UDP 套接字接口。我希望使用 packet_mmap 纯粹是为了提高效率——现在系统调用占用了我 50% 以上的 CPU 周期。
有没有办法配置 packet_mmap 以便可以从用户空间使用?
Linux有一个功能,可以通过在内核和用户之间映射一个共享缓冲区来有效地捕获网络数据包。我正在尝试以不需要 root 访问权限的方式使用此接口(因为我没有它)。
通常 packet_mmap 用于直接查看网络上的所有数据包,这需要 root 访问权限。我的应用程序只需要使用标准的 linux UDP 套接字接口。我希望使用 packet_mmap 纯粹是为了提高效率——现在系统调用占用了我 50% 以上的 CPU 周期。
有没有办法配置 packet_mmap 以便可以从用户空间使用?
虽然这并不能真正回答问题(因为它专门针对 packet_mmap),但鉴于您的参数:
我建议您完全忘记 packet_mmap 并查看recvmmsg
(注意拼写,而不是拼写错误)。
recvmmsg
不需要特殊的权限,它非常直观(没有晦涩的东西,它的工作原理就像readv
),它可以让您在一次调用中接收许多数据包,从而大大减少系统调用开销。
查看 Linux 内核 Git 存储库,似乎PF_INET
套接字和PF_INET6
套接字都不支持内存映射访问,所以如果通过
我的应用程序只需要使用标准的 linux UDP 套接字接口。我希望使用 packet_mmap 纯粹是为了提高效率——现在系统调用占用了我 50% 以上的 CPU 周期。
您的意思是您想对普通的 UDP 或 TCP 套接字使用内存映射访问,不幸的是,您不能。这同样适用于原始 IP 套接字。
PF_PACKET
套接字确实支持内存映射访问,但它们需要提升的权限,无论您是否使用内存映射访问。它们不是插座的替代品PF_INET
;PF_INET6
它们是一种读写链路层数据包的机制,所以如果你想在它们上面运行普通的互联网应用程序,祝你好运:
你真的不想尝试这样做。
(请注意,“提升权限”并不一定是指“root 权限”;CAP_NET_RAW
权限应该足够了。但是,正如我所指出的,如果您尝试替换常规套接字访问,则不想使用PF_PACKET
套接字。)