У нас есть приложение издателя, которое отправляет данные с помощью многоадресной рассылки. Приложение чрезвычайно чувствительно к производительности (мы оптимизируем на микросекундном уровне). Приложения, которые прослушивают эти опубликованные данные, могут (и часто находятся) на том же компьютере, что и приложение публикации.
Недавно мы заметили интересное явление: время выполнения sendto () увеличивается пропорционально количеству слушателей на машине.
Например, скажем, без слушателей базовое время для нашего вызова sendto () составляет 5 микросекунд. Каждый дополнительный слушатель увеличивает время вызова sendto () примерно на 2 микросекунды. Итак, если у нас есть 10 слушателей, теперь вызов sendto () занимает 2 * 10 + 5 = 25 микросекунд.
Это говорит о том, что вызов sendto () блокируется до тех пор, пока данные не будут скопированы для каждого слушателя.
Анализ стороны прослушивания также подтверждает это. Если имеется 10 слушателей, каждый слушатель получает данные на две микросекунды позже, чем предыдущий. (То есть первый слушатель получает данные примерно за пять микросекунд, а последний слушатель получает данные примерно за 23-25 микросекунд.)
Есть ли способ, на программном или системном уровне, изменить это поведение? Что-то вроде неблокирующего / асинхронного вызова sendto ()? Или, по крайней мере, блокировать только до тех пор, пока сообщение не будет скопировано в память ядра, чтобы оно могло вернуться, не ожидая всех слушателей)?