Поделиться через


Проблемы, связанные с TCP/IP

Некоторые методы программирования могут столкнуться с проблемами производительности, связанными с реализацией TCP/IP. Такие проблемы с производительностью не свидетельствуют о том, что TCP/IP является неэффективным или узким местом производительности; скорее, эти проблемы возникают, когда операции TCP/IP не понятны.

Следующие проблемы определяют распространенные сценарии, в которых сочетание операций TCP/IP и вариантов разработки сетевых приложений приводит к снижению производительности.

  • Приложения с интенсивным подключением.

    Некоторые приложения создают экземпляры нового TCP-подключения для каждой транзакции. Установка TCP-подключения занимает время, вносит дополнительные rtt и может быть медленным запуском. Кроме того, для закрытых подключений распространяется действие TIME-WAIT, которое потребляет системные ресурсы.

    Приложения с высокой интенсивностью подключения часто используются в основном потому, что их легко создавать; тестирование и обработка ошибок очень просты. Обнаружение ошибок в постоянном подключении может потребовать значительных усилий и кода, поэтому иногда не завершается.

    Управите эту ситуацию, повторно имитируя TCP-подключение. Это может привести к сериализации через TCP-подключение, если транзакции не мультиплексируются через несколько подключений. Если используется такой подход, количество подключений должно быть ограничено двумя, а также требуется обрамления на уровне приложения и расширенная обработка ошибок.

  • Буферы отправки нулевой длины и блокирующие отправки.

    Отключение буферизации с помощью функции setsockopt для установки нулевого буфера отправки (SO_SNDBUF) аналогично отключению кэширования диска. При установке нулевого буфера отправки и отправке блокирующих отправлений приложение имеет вероятность достижения отложенного подтверждения в 200 миллисекунд.

    Не отключайте буферизацию отправки, если вы не учтете это влияние во всех сетевых средах. Одно исключение: потоковая передача данных с помощью перекрывающихся операций ввода-вывода должна задать для буфера отправки нулевое значение.

  • Модель программирования отправки, отправки и получения.

    Структурирование приложения для выполнения операций отправки и отправки и получения увеличивает вероятность возникновения алгоритма Нейгла, что приводит к задержке в rtt+200 мс. Алгоритм Nagle может быть обнаружен, если последняя отправка меньше максимального размера сегмента TCP (MSS, максимальный объем данных в одной датаграмме). MSS может быть очень большим значением (64 КБ в IPv4 и даже больше в IPv6), поэтому не рассчитывайте на обычно небольшой MSS. Лучшим вариантом является объединение двух отправлений в одну отправку с помощью функции WSASend или memcpy .

  • Большое количество одновременных подключений.

    Количество одновременных подключений не должно превышать два, за исключением приложений специального назначения. Превышение двух одновременных подключений приводит к трате ресурсов. Хорошим правилом является использование до четырех кратковременных подключений или двух постоянных подключений на место назначения.

Поведение приложения

Высокопроизводительные приложения windows Sockets

Алгоритм Нейгла