現在、私は130688バイトのハード限界に達しています。 1つのメッセージで大きなものを送信しようとすると、ENOBUFSエラーが発生します。linuxで送信できるAF_UNIXデータグラムメッセージの最大サイズは?
私はnet.core.rmem_default、net.core.wmem_default、net.core.rmem_max、net.core.wmem_max、net.unix.max_dgram_qlen sysctlオプションをチェックしてそれらをすべて増やしましたが、効果がありません。これらはメッセージサイズではなく合計バッファサイズを処理します。
SO_SNDBUFとSO_RCVBUFソケットオプションも設定しましたが、上記と同じ問題があります。デフォルトのソケットバッファサイズは、_defaultソケットオプションに基づいて設定されます。
ソケットスタックでENOBUFSが返されるカーネルソースを調べましたが、どこから来たのかはわかりませんでした。このエラーを返すように見える唯一の場所は、メモリを割り当てることができないことです。
実際には最大サイズは130688ですか?そうでない場合は、カーネルを再コンパイルせずに変更できますか?
ありがとうございます!
これは巨大なデータグラムです。私の意見では、データグラムのサイズが大きくなる頃には、TCPを使用している可能性もあります。 –
そうです、それは助けになりません。私がこの記事で述べたように、あなたのwmemの設定に関係なく130688以上のメッセージを送ることはできません。私はそれらを32MB以上持っていて、その下の多くの組み合わせを試しました。 – Jaime
これを追加するだけです。送信バッファと受信バッファが単一のメッセージ用であるという誤解です。バッファは、すべてのメッセージの合計カーネルバッファです。 wmemとqlen sysctlオプションは実際にブロックを送信する方法とタイミングに実際に影響します。送信バッファがいっぱいになると(誰も受信しないと仮定して)、バッファ内の合計バイトがバッファサイズを超えたり、合計カウントがqlenを超えたりすると、sendはブロックされます。 – Jaime