Почему буфер исходящих данных EventMachine может прекратить отправку и просто заполниться навсегда (в то время как другие соединения все еще могут отправлять) - PullRequest
6 голосов
/ 09 февраля 2012

У меня есть сервер EventMachine, отправляющий данные TCP на клиент Mac (через GCDAsyncSocket). Какое-то время он всегда работает безупречно, но сервер неизбежно внезапно прекращает отправку данных по каждому соединению. Соединение все еще поддерживается, и сервер все еще получает данные от клиента, но это не идет другим путем.

Когда это происходит, я обнаружил через соединение # get_outbound_data_size, что буфер отправки соединения заполняется бесконечно (через #send_data) и не отправляется клиенту.

Существуют ли конкретные (и, надеюсь, исправимые) причины, по которым это может произойти? Реактор продолжает гудеть, и другие активные соединения с сервером продолжают работать нормально (хотя иногда они также попадают в буферный ад).

Ответы [ 2 ]

0 голосов
/ 09 апреля 2012

23 марта к GCDAsyncSocket было применено исправление , предотвращающее остановку чтения.Этот патч решил вашу проблему?

0 голосов
/ 22 февраля 2012

Я вижу, по крайней мере, одну причину: когда удаленный клиент больше не читает данные со своей стороны TCP-соединения (с помощью вызова recv () или чего-либо еще).

Затем, сценарий: получениеБуфер TCP на стороне клиента заполняется.И ОС больше не может принимать пакеты TCP от своего партнера, поскольку она не может хранить их в очереди.Как следствие, отправляющий TCP-буфер на стороне сервера также переполняется, так как ваше приложение продолжает отправлять пакеты в сокет!Вскоре ваш сервер больше не сможет записывать в сокет, поскольку системный вызов send () будет:

  1. блокировать неопределенно долго.(ожидание достаточного опустошения буфера для нового пакета)
  2. не возвращается с ошибкой EWOULDBLOCK.(если вы сконфигурировали свой сокет как неблокирующий)

Я обычно встречал такой вариант использования в среде TEST, когда ставил точку останова в своем коде на клиентесторона.

...