19

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

我检查了net.core.rmem_default, net.core.wmem_default, net.core.rmem_max,net.core.wmem_maxnet.unix.max_dgram_qlensysctl 选项并增加了它们,但它们没有效果,因为它们处理的是总缓冲区大小而不是消息大小。

我还设置了SO_SNDBUFSO_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,它调用= 0 和sock_alloc_send_pskb()=数据报lxr2的大小。从“正常” skbuff 缓冲区空间和分散/收集页面lxr3分配。因此,看起来 AF_UNIX 套接字在当前 Linux 上不支持分散/聚集。data_lenheader_lensock_alloc_send_pskb()header_lendata_len

于 2011-01-27T21:23:46.887 回答