Замораживание cgroup ожидает очистки буферов отправки TCP?
Какие гарантии существуют для очистки буферов отправки TCP, если таковые имеются, когда подсистема заморозки замораживает контрольную группу?
Рассмотрим следующий сценарий: Сервер A, работающий в контрольной группе, отправляет данные на Сервер B через TCP. TCP-сокет настроен на использование алгоритма Нэгла (TCP_NODELAY
опция не установлена). Поэтому,send
Передача данных через сокет не блокирует ACK сервера B, а возвращает результат после того, как данные, подлежащие отправке, были скопированы в буфер отправки TCP. После этого, но до того, как данные будут отправлены на Сервер Б, контрольная группа замораживается.
Что происходит с данными в буфере отправки TCP?
- Будет ли операция замораживания ждать, пока все данные в буфере не будут подтверждены сервером B? Что, если буфер приема сервера B заполнен? Будет ли зависание ждать подтверждения Сервера Б на неопределенный срок?
- Не будет ли заморозка ждать подтверждения от сервера B и продолжать отправлять данные после разморозки контрольной группы? Если задержка между замораживанием и оттаиванием достаточно велика для того, чтобы сервер B закрыл TCP-соединение, данные в буфере будут потеряны.
Ссылки на спецификации и гарантии такого поведения приветствуются. Но, может быть, нет никаких гарантий, поэтому полагаться на любое поведение было бы ненадежно?
Суть вопроса в том, что мне интересно, насколько осторожным нужно быть при отправке данных через TCP на AWS Lambda (я предполагаю, что AWS Lambda использует cgroups для замораживания/размораживания после/до обработки вызова Lambda). Достаточно ли сбросить буферы приложения в буфер отправки TCP-сокета/TCP? Или нужно убедиться, что сервер B получил данные на уровне приложения, например, используя HTTP и ожидая ответа HTTP от сервера?