В rmem_max
Параметр Linux определяет размер буфера, который принимает пакеты UDP.
Когда трафик становится слишком загруженным, начинается потеря пакетов.
Я сделал график, показывающий, как увеличивается потеря пакетов в зависимости от входящей полосы пропускания.
(Я использую IPerf для генерации UDP-трафика между двумя экземплярами ВМ).
Разные цвета для разных rmem_max
ценности:
Как видите, установка rmem_max
к 26214400
(темно-синий) приводит к потере пакетов раньше, чем меньшие значения. Значение по умолчанию для Linux - 131071
(темно-зеленый) выглядит разумно.
В этих условиях почему Документация JBoss рекомендую установить rmem_max
к 26214400
?
Это потому, что ожидается, что трафик UDP будет выше 350 МБ / с? Я все равно не думаю, что что-то сработает с потерей пакетов более 1% ...
Что мне не хватает?
Детали: я использовал sysctl -w net.core.rmem_max=131071
(например) на обоих узлах и используется в качестве сервера iperf -s -u -P 0 -i 1 -p 5001 -f M
а другой как клиент iperf -c 172.29.157.3 -u -P 1 -i 1 -p 5001 -f M -b 300M -t 5 -d -L 5001 -T 1
.
Больше буфера не обязательно означает большую скорость. Больше буфера просто означает больше буфера. Ниже определенного значения вы увидите переполнение, поскольку приложения не всегда могут обрабатывать полученные данные достаточно быстро. Это плохо, но в точке, где имеется достаточный буфер для обслуживания приложения с разумной скоростью, даже в случае периодического всплеска трафика, все остальное, вероятно, будет потрачено впустую.
Если вы сделаете слишком большой объем, то вы возложите на ядро гораздо большую нагрузку по поиску и распределению памяти, что, по иронии судьбы, может привести к потере пакетов. Я предполагаю, что это может быть то, что вы видите, но для подтверждения потребуются некоторые другие показатели.
Вероятно, что число 2,5M может быть получено из рекомендаций по установке значений rmem и wmem для TCP - где взаимосвязь между размером окна и настройками буфера может иметь существенное влияние при определенных обстоятельствах. Тем не менее, TCP! = UDP - но некоторые люди предполагают, что если это помогает TCP, это также поможет UDP. У вас есть правильная эмпирическая информация. На вашем месте я бы придерживался значения 256 КБ и назвал его даже.
Проблема в том, что на пути между двумя конечными точками (то есть серверами) обычно есть несколько переключателей. Хотя с помощью rmem вы можете увеличить размер буферов в конечных точках, это не влияет на буферы в коммутаторах, которые довольно ограничены. Таким образом, вы можете потерять пакеты из-за переполнения буферов коммутаторов.