Каков максимальный размер сообщества Datagram AF_UNIX, которое можно отправить в Linux?

StackOverflow https://stackoverflow.com/questions/4729315

  •  12-10-2019
  •  | 
  •  

Вопрос

В настоящее время я попадаю в жесткий лимит 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top