Каков максимальный размер сообщества Datagram AF_UNIX, которое можно отправить в Linux?
Вопрос
В настоящее время я попадаю в жесткий лимит 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 DATAGRAMS нуждается в смежной памяти. Сложно найти смежную физическую память, а распределение не удается, регистрируя что -то похожее на это в журнале ядра:
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()
выделяется header_len
из «нормального» буферного пространства Skbuff и data_len
Из рассеяния/сбора страниц LXR3. Анкет Таким образом, похоже, что гнезда AF_UNIX не поддерживает разброс/сбора на текущем Linux.