Я пишу два приложения (на языке C), которые выполняют несколько вызовов для отправки и получения (например, я реализую удаленную копию файла).
Я всегда отправляю заголовок размером 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>
Эта проблема действительно доставляет мне трудности, так как я не понимаю, почему приемный вызов на клиенте занимает так много времени.
Любые советы будут высоко оценены.