代理服务器中出现此问题,代码为
gettimeofday(&start, NULL);
sendLen = ::send(connection->Fd(), buffer->rdPtr, wantSendLen, 0);
gettimeofday(&stop, NULL);
uint64_t send_buf_cost = (stop.tv_sec - start.tv_sec) * 1000000 + (stop.tv_usec - start.tv_usec);
LOGGER_LOG(m_logger, "send time:%lu", send_buf_cost);
当fd是NON_BLOCK套接字并且wantSendLen小于200字节时,发送调用在日志中偶尔需要50ms以上。
之后,我使用strace来证明它strace -o output.txt -T -tt -e trace = network -p 15550
我可以找到像这样的长时间通话
14:14:31.510672 sendto(49, " * 2 \ r \ n $ 3 \ r \ nget \ r \ n $ 88 \ r \ n \ nmsgpool:fgmsg:" ...,108,0,NULL,0)= 108 < 0.068225>
为什么发送电话有时会这么慢?我认为send调用只是将数据复制到套接字发送缓冲区。