Это отличный вопрос.В CentOS, как и в большинстве разновидностей * nix, для каждого многоадресного сокета есть буфер приема / отправки UDP.Размер этого буфера контролируется sysctl.conf. Вы можете просмотреть размер ваших буферов, вызвав / sbin / sysctl -a
. В приведенных ниже пунктах показан мой размер получения по умолчанию и максимальный размер udp в байтах.Чем больше эти числа, тем больше буферизации и, следовательно, задержки, которую может ввести сеть / ядро, если ваше приложение слишком медленно использует данные.Если вы создали хороший допуск для потери данных, вы можете сделать эти буферы очень маленькими, и вы не увидите увеличения задержки и восстановления, которые вы описали выше.Компромиссом является потеря данных из-за переполнения буфера - то, что вы уже могли видеть.
[~] $ / sbin / sysctl -a |mem net.core.rmem_default = 16777216 net.core.wmem_default = 16777216 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216
В большинстве случаев вам нужно установить значение по умолчанию = максимум, если вы не являетесьуправление этим при создании сокета.
последнее, что вы можете сделать (в зависимости от версии вашего ядра), это просмотреть статистику UDP PID для вашего процесса или, по крайней мере, в целом.
cat / proc / net / snmp |grep -i Udp Udp: InDatagrams NoPorts InErrors OutDatagrams Udp: 81658157063 145 616548928 3896986
cat / proc / PID / net / snmp |grep -i Udp Udp: InDatagrams NoPorts InErrors OutDatagrams Udp: 81658157063 145 616548928 3896986
Если это не ясно из моего поста, задержка вызвана тем, что ваше приложение недостаточно быстро использует данные и заставляет ядробуферный трафик в вышеприведенной структуре.Сеть, ядро и даже кольцевые буферы вашей сетевой карты могут воспроизводить задержку, но все эти элементы обычно добавляют всего несколько миллисекунд.
Дайте мне знать ваши мысли, и я могу дать вам больше информации о том, где искать в вашем приложении, чтобы повысить производительность.