제가 작업하는 제품은 네트워크 통신을 위해 부스트 ASIO (TCP)를 사용합니다. 테스트 과정에서 ASIO는 ~ 60MB/s에서 13 초 동안 전송 한 다음 ~ 300K/s로 9 초 동안 떨어 뜨린 다음 13 초 동안 ~ 60MB/s로 되돌아갑니다. 이것은 전체 전송에 대해 반복됩니다. 나는 이것을 재현 할 수 있는지 그리고 놀랍게도 할 수 있는지를 알기 위해 시험 신청서를 썼다.부스트 ASIO가 빠르다가 매우 느리게 전송됩니다.
내 테스트 응용 프로그램에서 클라이언트와 서버를 연결 한 후 코드가 매우 기본입니다. 블로킹 및 비 블로킹 소켓은 동일한 결과를 생성합니다. 는 bufferLength가 4K이다
while(true)
boost::asio::write(clientSocket, boost::asio::buffer(clientBuffer, bufferLength)
경우에, 나는이 문제를 볼 수 있지만, 내가 32K받는 사람을 밀어 경우 :
while(true)
{
boost::system::error_code ec;
serverSocket.read_some(boost::asio::buffer(serverBuffer, bufferLength), ec);
}
클라이언트이 수행 : 여기에 서버가 차단 상황에서 데이터를 수신하는 방법이다 전송 속도가 빠르며 (> 120MB/s) 일관성이 있습니다.
어떤 일이 일어나고 있는지 알 수 있습니까? 이것은 Windows Server 2008에서 실행되는 Windows 응용 프로그램입니다.
편집 : Wireshark 캡처를 수행했으며 서버에서 150ms 이상 ACK가 전송되는 경우가 있습니다. 즉 클라이언트는 데이터의 마지막 비트 [PSH, ACK]를 전송합니다. 서버는 150ms 후에 [ACK]로 재전송합니다. 그 사이에는 다른 트래픽이 없습니다.
두 번째 편집 : 동일한 동작을 나타내는 C# 응용 프로그램을 작성했습니다. 클라이언트는 NetworkStream.Write를 사용하여 4k 패킷을 보내고 서버는 NetworkStream.Read를 사용하여 패킷을 읽습니다. 여기에서 어디로 가야할까요?
이 동작은 네트워킹 스택 및/또는 네트워크 자체가 아닌 asio 라이브러리 때문에 발생합니다. –
좋은 질문입니다. ASIO라는 것이 확실하지 않습니다. 나는 그것이 네트워크가 아니라는 것을 확신한다. 2 대의 테스트 머신이 직접 연결됩니다. 그래도 네트워크 스택 일지 모르지만 그걸 증명할 방법이 확실치 않습니다. (제 배경은 네트워킹에 없습니다). – BigHands79
'boost :: asio'는 기반 OS 고유의 네트워크 스택을 사용합니다.이 스택은 C# 응용 프로그램에서 동일한 문제가 있다는 조사 결과를 나타냅니다. 소켓 버퍼 크기 ('ioctl SO_SNDBUF/SO_RCVBUF')를 설정 했습니까? – Chad