Я использую tcp для очень многих маленьких посылок, я должен отключить алгоритм Nagles? (Люди также знают это как TCP_NODELAY) - PullRequest
5 голосов
/ 31 декабря 2010

Я переделал этот пост, потому что мой выбор названия был ужасен, извините за это.Мой новый пост может быть найден здесь: После большой отправки мой вызов send () приводит к полной остановке моей программы.Как это возможно?

Большое спасибо всем.Проблема заключалась в том, что клиенты на самом деле являются ботами, и они никогда не читают из соединений.(Чувствует себя глупо)

Ответы [ 3 ]

4 голосов
/ 31 декабря 2010

TCP_NODELAY может помочь задержке небольших пакетов от отправителя к получателю, но описание, которое вы дали, указывает в другом направлении. Я могу представить себе следующее:

  • Отправка данных больше, чем на самом деле потребляют получатели - это в конечном итоге приводит к переполнению буфера отправителя (SO_SNDBUF) и приводит к зависанию процесса сервера в системном вызове send(2) , В этот момент ядро ​​ожидает, пока другой конец подтвердит некоторые из ожидающих данных, но получатель не ожидает этого, поэтому он не recv(2).

Возможно, есть и другие объяснения, но трудно понять, не увидев код.

4 голосов
/ 31 декабря 2010

Если send() блокирует сокет TCP, это означает, что буфер отправки заполнен, что, в свою очередь, указывает на то, что узел на другом конце соединения не считывает данные достаточно быстро. Может быть, этот клиент полностью застрял и недостаточно часто звонит recv().

2 голосов
/ 31 декабря 2010

Nagle не вызовет «исчезновения в ядре», поэтому его отключение вам не поможет. Nagle просто на некоторое время буферизует данные, но в конечном итоге отправит их без каких-либо запросов от пользователя.

Есть еще один виновник.


Изменить для обновленного вопроса.

Вы должны убедиться, что клиент получает все отправленные данные и что он получает их быстро . Пусть каждый клиент запишет в журнал или что-то для проверки.

Например, если клиент ожидает, пока сервер примет свое 23-байтовое обновление, он может не получать данные. Это может привести к заполнению буфера отправки сервера, что приведет к ухудшению и возможной тупиковой ситуации.

Если это действительно преступник, решением будет некая асинхронная связь, например библиотека Асио в Boost.

...