Каков максимальный размер сообщения дейтаграммы AF_UNIX, которое можно отправить в Linux? - PullRequest
13 голосов
/ 19 января 2011

В настоящее время у меня жесткое ограничение в 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?Если нет, то можно ли это изменить без перекомпиляции ядра?

Спасибо!

1 Ответ

13 голосов
/ 28 января 2011

Для дейтаграмм AF_UNIX SOCK_DATAGRAM / SOCK_SEQPACKET требуется непрерывная память.Трудно найти непрерывную физическую память, и распределение не удается, регистрируя что-то похожее в журнале ядра:1008 * с data_len = 0 и header_len = размер датаграммы lxr2 .sock_alloc_send_pskb() выделяет header_len из "обычного" пространства буфера skbuff и data_len из страниц разброса / сбора lxr3 Таким образом, похоже, что сокеты AF_UNIX не поддерживают разброс / сборку в текущем Linux.

...