Есть целый ряд факторов, которые будут определять максимум размера пакета, который может быть передан на Unix сокете:
wmem_max
сокета буфера передачи максимального значения размера ядра, которая определяет максимальную размер буфера отправки, который можно установить с помощью setsockopt (SO_SNDBUF)
. Текущую настройку можно считывать с /proc/sys/net/core/wmem_max
и ее можно установить с помощью sysctl net.core.wmem_max=VALUE
(добавьте параметр в /etc/sysctl.conf
, чтобы изменения были постоянными при перезагрузке). Обратите внимание, что этот параметр применяется ко всем сокетам и протоколам сокетов, а не только к сокетам Unix.
Если несколько пакеты посылаются в сокет Unix (с помощью SOCK_DATAGRAM), то максимальное количество данных, которые могут быть посланы без блокировки зависит как от размера буфера передачи сокета (смотри выше) и максимальная количество непрочитанных пакетов в сокете Unix (параметр ядра net.unix.max_dgram_qlen
).
Наконец, пакет (SOCK_DATAGRAM) требует непрерывной памяти (согласно What is the max size of AF_UNIX datagram message that can be sent in linux?). Сколько непрерывной памяти доступно в ядре, будет зависеть от многих факторов (например, нагрузки ввода-вывода в системе и т. Д.).
Таким образом, чтобы максимизировать производительность от вашего приложения, вам нужен большой размер буфера сокета (минимизировать контекст пользователя/ядра пространства переключателей из-за сокет системы записи вызовов) и большой очереди сокета Unix (отвязать производителя и потребителя). Тем не менее, размер буфера отправки сокета и длина очереди не должны быть настолько большими, чтобы ядро вышло из смежных областей памяти (что вызвало ошибки записи).
Фактические данные будут зависеть от конфигурации вашей системы и ее использования. Вам нужно будет определить пределы путем тестирования ... начните с wmem_max
по 256 Кб и max_dgram_qlen
на 32 и продолжайте удваивать wmem_max
, пока не заметите, что все начинает ломаться. Вам нужно будет настроить max_dgram_qlen
, чтобы сбалансировать деятельность производителя и потребителя в определенной степени (хотя, если производитель намного быстрее или намного медленнее, чем потребитель, размер очереди не будет иметь большого влияния).
Примечание Ваш производитель должен будет специально настроить сокет размер буфера передачи в wmem_max
байт с вызовом setsockopt (SO_SNDBUF)
и должен разделить данные на wmem_max
байт куски (и потребитель должен будет собрать их).
Лучшая догадка: практические ограничения будут вокруг wmem_max ~ 8Mb и unix_dgram_qlen ~ 32.
Нет ничего «типичного» в отношении клиента, который отправляет буфер 10 ГБ за один раз. Обычно он считывает некоторый источник в буфер, измеренный в KB, а не в GB, и отправляет его по частям. – EJP
@EJP Знаете ли вы, сколько я должен разбить буфер 10 ГБ? Каждый 1GB/1MB? –
Howard, какой тип вашего сокета? Как он был создан и как вы отправляете данные recv? – osgx