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