7

Linuxには、カーネルとユーザーの間で共有バッファーを mmap することにより、ネットワーク パケットを効率的にキャプチャできる機能があります。root アクセスを必要としない方法でこのインターフェイスを使用しようとしています (持っていないため)。

多くの場合、packet_mmap はネットワーク上のすべてのパケットを直接調べるために使用されますが、これには root アクセスが必要です。私のアプリケーションでは、標準の Linux UDP ソケット インターフェイスのみを使用する必要があります。私は純粋に効率のために packet_mmap を使用したいと考えています。現在、syscall が CPU サイクルの 50% 以上を消費しています。

ユーザー空間から使用できるように packet_mmap を構成する方法はありますか?

4

2 に答える 2

4

これは本当に質問に答えているわけではありませんが (具体的には packet_mmap に関するものであるため)、次のパラメーターが与えられます。

  1. UDP パケットの受信
  2. システムコールを減らしたいだけです。
  3. Linux 固有の機能を使用したいが、root ユーザーは使用しない
  4. 本当に必要でない、または望まれていない packet_mmap の機能。

packet_mmap については完全に忘れて、代わりにrecvmmsg(タイプミスではなくスペルに注意してください) を参照することをお勧めします。

recvmmsgは特別な特権を必要とせず、非常に直感的で (わかりにくいものはなく、 と同じように動作readvします)、1 回の呼び出しで多くのパケットを受信できるため、syscall のオーバーヘッドが大幅に削減されます。

于 2013-03-01T13:40:21.687 に答える
3

Linux カーネルの Git リポジトリを見ると、PF_INETソケットもソケットもPF_INET6メモリ マップド アクセスをサポートしていないようです。

私のアプリケーションでは、標準の Linux UDP ソケット インターフェイスのみを使用する必要があります。私は純粋に効率のために packet_mmap を使用したいと考えています。現在、syscall が CPU サイクルの 50% 以上を消費しています。

通常のUDPまたはTCPソケットにメモリマップアクセスを使用したいということですが、残念ながらできません。同じことが raw IP ソケットにも当てはまります。

PF_PACKETソケットはメモリ マップ アクセスをサポートしますが、メモリ マップ アクセスを使用しているかどうかに関係なく、昇格された特権が必要です。またはソケットの代替品ではありません。それらはリンク層パケットを読み書きするためのメカニズムであるため、それらの上で通常のインターネットアプリケーションを実行したい場合は、頑張ってください:PF_INETPF_INET6

  1. IP と、使用しているトランスポート プロトコル (UDP、TCP など) を自分で再実装する必要があります。
  2. カーネルのIP とトランスポート プロトコル スタックがこれらのパケットを処理しないようにする必要があります。

あなたは本当にそれをしようとはしません。

(「昇格された特権」とは、必ずしも「root 特権」を意味するわけではないことCAP_NET_RAWに注意してください。特権で十分なはずです。ただし、通常のソケット アクセスを置き換えようとしている場合は、PF_PACKETソケットを使用したくありません。)

于 2013-03-01T19:21:39.513 に答える