Каждый маленький запрос к сервису занимает ровно около 40 мс
Клиент в одной сети с сервером отправляет запрос двумя вызовами:
send(fd, &header, sizeof header, 0); // 16 байт
send(fd, body.data(), body.size(), 0); // 60 байт
recv(fd, reply, sizeof reply, 0);
Сервер обрабатывает запрос за 0,2 мс, пинг — 0,1 мс, но клиент получает ответ через ~40 мс. Если склеить заголовок и тело в один send, задержка пропадает. В чём дело?
- Алгоритм Нейгла ждёт ACK, а ACK отложен сервером
- Ядро копит данные, пока не наберётся MSS
- Каждый send ждёт подтверждения от приложения
- Второй send открывает новое TCP-соединение
