19

現在、130688バイトのハード制限に達しています。1つのメッセージでもっと大きなものを送信しようとすると、ENOBUFSエラーが発生します。

、、、、、およびsysctlオプションを確認し、net.core.rmem_defaultそれらをすべて増やしましたが、これらはメッセージサイズではなく合計バッファーサイズを処理するため、効果はありません。net.core.wmem_defaultnet.core.rmem_maxnet.core.wmem_maxnet.unix.max_dgram_qlen

SO_SNDBUFおよびソケットオプションも設定しましたSO_RCVBUFが、これには上記と同じ問題があります。デフォルトのソケットバッファサイズは、とにかくデフォルトのソケットオプションに基づいて設定されます。

ソケットスタックで返されるカーネルソースを調べましたが、ENOBUFSどこから来たのかわかりませんでした。このエラーを返すように見える唯一の場所は、メモリを割り当てることができないことと関係があります。

最大サイズは実際には130688ですか?そうでない場合は、カーネルを再コンパイルせずにこれを変更できますか?

4

1 に答える 1

20

AF_UNIX SOCK_DATAGRAM/SOCK_SEQPACKETデータグラムには連続したメモリが必要です。隣接する物理メモリを見つけるのは難しく、割り当ては失敗し、カーネルログに次のようなものが記録されます。

udgc: page allocation failure. order:7, mode:0x44d0
[...snip...]
DMA: 185*4kB 69*8kB 34*16kB 27*32kB 11*64kB 1*128kB 1*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 3788kB
Normal: 13*4kB 6*8kB 100*16kB 62*32kB 24*64kB 10*128kB 0*256kB 1*512kB 0*1024kB 0*2048kB 0*4096kB = 7012kB
[...snip...]

unix_dgram_sendmsg()sock_alloc_send_skb() lxr1を呼び出します。これは、sock_alloc_send_pskb()= data_len0およびheader_len=データグラムlxr2のサイズで呼び出します。「通常の」skbuffバッファスペース、およびスキャッター/ギャザーページlxr3sock_alloc_send_pskb()から割り当てます。したがって、AF_UNIXソケットは現在のLinuxではスキャッター/ギャザーをサポートしていないようです。header_lendata_len

于 2011-01-27T21:23:46.887 に答える