2013-10-17 1 views
0

제가 작업하는 제품은 네트워크 통신을 위해 부스트 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를 사용하여 패킷을 읽습니다. 여기에서 어디로 가야할까요?

+0

이 동작은 네트워킹 스택 및/또는 네트워크 자체가 아닌 asio 라이브러리 때문에 발생합니다. –

+0

좋은 질문입니다. ASIO라는 것이 확실하지 않습니다. 나는 그것이 네트워크가 아니라는 것을 확신한다. 2 대의 테스트 머신이 직접 연결됩니다. 그래도 네트워크 스택 일지 모르지만 그걸 증명할 방법이 확실치 않습니다. (제 배경은 네트워킹에 없습니다). – BigHands79

+1

'boost :: asio'는 기반 OS 고유의 네트워크 스택을 사용합니다.이 스택은 C# 응용 프로그램에서 동일한 문제가 있다는 조사 결과를 나타냅니다. 소켓 버퍼 크기 ('ioctl SO_SNDBUF/SO_RCVBUF')를 설정 했습니까? – Chad

답변

0

귀하의 프로그램에 정확히 무엇이 포함되어 있는지 알 수 없습니다. 그러나 나는 150ms의 1 회의 여행을 위해 당신의 wireshark의 대담을 얻었다. 그것은 비정상입니다. 나는 그들이 동일한 모드에서 작동하는 경우 네트워크 카드를 확인해야한다고 생각합니다. 듀플렉스 또는 반이중, 100M 또는 1000M 그런 다음 오류 패킷 카운터를 확인하십시오, 그것은 0 또는 아주 작은 숫자 여야합니다. 그것이 큰 숫자 일 경우 C/S 커뮤니케이션과 관련이 있습니다. 케이블을 교체해야합니다.

나는 그것이 당신을 도울 수 있기를 바랍니다. :)

+0

이것은 대답처럼 보이지 않습니다 –

+0

당신은 NIC 설정 및 시스템 ENV를 확인할 수 있음을 의미합니다. 때때로 문제가 발생할 수 있습니다. 프로그램에서 문제를 찾을 수 없습니다. :피 – Chair

0

Nagle의 알고리즘 (tcp :: no_delay)을 비활성화 하시겠습니까? 또한 버퍼 크기를 변경하십시오.

socket->set_option(boost::asio::ip::tcp::no_delay(true)); 
socket->set_option(boost::asio::socket_base::send_buffer_size(65536)); 
socket->set_option(boost::asio::socket_base::receive_buffer_size(65536)); 
관련 문제