2011-04-20 3 views
1

클라이언트가 로컬 호스트를 통해 TCP로 서버와 통신하고 있습니다. 서버는 차단 모드에서 부스트 ASIO iostream을 사용합니다. 들어오는 연결을 받아들이고, 요청을 읽고, 응답을 보내고 소켓을 닫습니다. 문제는 - 때로는 서버가 getline을 통해 첫 번째 읽기에서 10-200 밀리 초 동안 임의의 지연이 있음을 나타냅니다. 나는 서버와 클라이언트 소켓 모두에 TCP_NODELAY 플래그를 설정했다. 이 지연의 원인은 무엇입니까? 나는 소켓에서 읽기 전에 select를 사용해야한다는 것을 알고 있지만 localhost를 통해 그렇게 큰 지연이 있어서는 안된다고 예상했다.읽기 ASIO iostream 무작위 지연을 늘리십시오.


asio::io_service io_service; 
ip::tcp::endpoint endpoint(bindAddress, 80); 
ip::tcp::acceptor acceptor(io_service, endpoint); 

for(;;) 
{ 
    ip::tcp::iostream stream; 
    acceptor.accept(*stream.rdbuf(), peer); 
    ip::tcp::no_delay no_delay(true); 
    stream.rdbuf()->set_option(no_delay); 
    string str; 
    getline(stream, str); // at this line i get random delays 

    //the main part of code 
} 

나는 200 요청이/초, 지연 분당 여러 번 발생합니다

다음은 서버의 코드 관련 부분이다. netstat -m은 충분한 버퍼가 있음을 보여줍니다.

UPDATE :

그것은 클라이언트의 문제가 아니라 서버 다음과 같습니다 Apache HttpClient random delays under high requests/second

답변

0

그것을 폐쇄를 위해이 질문에 응답. 그것이 (2), 다음 번에 모든 연결이 돌아왔다 선택, 그것은 다른 파견을 통해 모니터링 -c 연결을 전달하기 때문에

Apache HttpClient random delays under high requests/second

아파치의 AB (1)도있다 -like 성능 "이빨을 보았다"- c 연결. 대체 (더 나은) 접근법은 새로운 연결을 설정하고 abc (1)의 select (2) 배열에 대한 파일 설명자를 readd하여 -c 연결이 항상 활성 처리 중인지 확인하는 것입니다.

로드 밸런서를 통해 사용할 때 매우 천천히 결과를 왜곡합니다 (아직 좋지는 않지만 천천히 한 연결이 끊어지기 때문에 ab (1)이 매우 오도 된 결과를 보았습니다).

+0

나는 항상 서버에 단 하나의 연결을 가지고 있지만, 어쨌든이 지연을 볼 수 있습니다. – Michael

관련 문제