Я пишу два приложения (на C), которые совершают несколько вызовов для отправки и получения (например, я реализую копию удаленного файла).Причины медленного вызова recv
Я всегда отправляю 64 байтовый заголовок, который содержит длину следующего тела сообщения и другую информацию.
При тестировании моего приложения на некоторых файлах я узнал, что некоторые вызовы recv занимают довольно много времени (около 40 мс). Используя strace, я узнал, что это происходит сначала при отправке тела сообщения из 377 байтов (что в этом случае копирует весь контент моего файла).
Приложение для сервера начинает отправлять тело сообщения, которое занимает около 48 us. Теперь клиентское приложение потребляет около 38 мс для получения этих байтов.
С этого времени на каждом приёмном вызове потребляется столько времени, поскольку каждый из них блокирует прием и ожидает ответа.
Трассирование сервера
[PID 27158] +1292236124,465827 посыла (6, «\ 0 \ 0 \ 1 \ 271 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0core.fwrite \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 "..., 64, 0) = 64 < 0,000031>
[pid 27158] 1292236124.466074 отправить (6," \ 0 \ 0 \ 0 \ 1 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 10 \ 0 \ 0 \ 0 \ 1 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 1 \ 0 \ 0 \ 0 \ 0" ..., 377, 0) = 377 < 0,000048>
клиента Трассирование
[pid 27159] 1292236124.466364 recv (4, "\ 0 \ 0 \ 1 \ 271 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0core.fwrite \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 "..., 64, 0) = 64 < 0,000027>
[pid 27159] 1292236124.466597 recv (4," \ 0 \ 0 \ 0 \ 1 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 10 \ 0 \ 0 \ 0 \ 1 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 1 \ 0 \ 0 \ 0 \ 0" ..., 377, 0) = 377 < 0.037456>
Эта проблема действительно смущает меня с тех пор, как я не понимаю, почему вызов на клиенте занимает так много времени.
Любые советы были бы высоко оценены.
нравится, как говорится, это может быть нагло на работе. однако, если вы копируете файлы, не является пропускной способностью названия игры? Я действительно не понимаю. «С того времени на каждый прием звонки потребляет столько времени, поскольку каждый из них блокирует прием и ждет ответа». сервер ждет клиента? – lijie