Сокет recv call замораживает поток на прибл. 5 секунд - PullRequest
7 голосов
/ 23 марта 2011

У меня есть клиент-серверная архитектура, реализованная на C ++ с блокирующими сокетами под Windows 7. Все работает хорошо до определенного уровня нагрузки.Если есть пара клиентов (например,> 4), получающих или отправляющих мегабайты данных, иногда связь с одним клиентом останавливается примерно на 5 секунд.В этом случае все остальные клиенты работают должным образом.

Размер буфера составляет 8192 байта, а запись на стороне сервера выглядит следующим образом:

TimeStamp (s.ms) - полученные байты

1299514524.618 - 8192

1299514524.618 - 8192

1299514524.618 - 0004

1299514529.641 - 8192

1299514529.641 - 3744

1299514529.641 - 1460

1299514529.641 - 1460

1299514529.641 - 8192

Похоже, что за эти 5 секунд можно прочитать только 4 байта.Кроме того, я обнаружил, что время замораживания всегда составляет около 5 секунд - никогда 4 или меньше и никогда 6 или больше ...

Есть идеи?

С уважением

Майкл

Ответы [ 2 ]

0 голосов
/ 23 марта 2011

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

Решение было принято: распределение нагрузки на нескольких серверах

...