2011-01-18 20 views
13

目前我遇到130688字节的硬限制。如果我尝试在一条消息中发送更大的内容,则会出现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吗?如果没有,可以在不重新编译内核的情况下进行更改?

谢谢!

+2

这是一个巨大的数据报。在我看来,当你有一个很大的数据报时,你也可以使用TCP。 – 2011-01-18 21:37:01

+1

是的,这并没有帮助。正如我在帖子中所述,无论您使用的是wmem设置,它都不会让您通过130688发送消息。我有他们超过32MB,并已尝试下面的许多组合。 – Jaime 2011-01-18 22:04:47

回答

12

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,以及来自分散/收集页面lxr3data_len。所以,看起来AF_UNIX套接字不支持在当前Linux上进行分散/聚集。

相关问题