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