目前我已达到 130688 字节的硬限制。如果我尝试在一条消息中发送更大的内容,我会收到一条消息ENOBUFS
error.
我已经检查过net.core.rmem_default
, net.core.wmem_default
, net.core.rmem_max
, net.core.wmem_max
, and net.unix.max_dgram_qlen
sysctl 选项并增加了它们,但它们没有效果,因为这些处理的是总缓冲区大小而不是消息大小。
我也设置了SO_SNDBUF
and SO_RCVBUF
套接字选项,但这有与上面相同的问题。无论如何,默认套接字缓冲区大小是根据默认套接字选项设置的。
我查看了内核源代码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()
calls sock_alloc_send_skb()
lxr1 http://lxr.free-electrons.com/source/net/unix/af_unix.c?v=2.6.37#L1448,这称为sock_alloc_send_pskb()
with data_len
= 0 和header_len
= 数据报的大小lxr2 http://lxr.free-electrons.com/source/net/core/sock.c?v=2.6.37#L1578. sock_alloc_send_pskb()
分配header_len
来自“正常”skbuff 缓冲区空间,以及data_len
从分散/聚集页面lxr3 http://lxr.free-electrons.com/source/net/core/sock.c?v=2.6.37#L1517。因此,看起来 AF_UNIX 套接字在当前的 Linux 上不支持分散/聚集。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)