什么是可以在Linux发送的AF_UNIX数据报消息的最大大小?

目前我正在达到130688字节的硬限制。 如果我尝试在一条消息中发送更大的消息,则会出现ENOBUFS错误。

我检查了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吗? 如果没有,这可以改变,而不重新编译内核?

谢谢!

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_len = 0, header_len =数据报大小lxr2 。 sock_alloc_send_pskb()从“普通”skbuff缓冲区空间分配header_len ,从分散/聚集页面lxr3分配data_len 。 所以,它看起来像AF_UNIX套接字不支持分散/收集在当前的Linux。