2011-04-20 96 views
1

我有一個客戶端通過本地主機與服務器通過TCP通信。服務器在阻塞模式下使用Boost ASIO iostream。它接受傳入連接,讀取請求,發送響應並關閉套接字。問題是 - 有時服務器在通過getline首次讀取時有10-200毫秒的隨機延遲。我在服務器和客戶端的套接字上都設置了TCP_NODELAY標誌。造成這種延誤的原因是什麼?我知道,我應該在使用select之前從套接字讀取,但我預計不應該有這麼大的延遲通過本地主機。在閱讀時提升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

Apache HttpClient random delays under high requests/second

Apache的AB(1)也有「鋸齒」狀的性能,因爲它調度,它通過選擇(2),那麼一旦所有連接都回來了,它會派出另一監控-c連接 - c連接。備用(更好)的方法是建立一個新的連接,並將文件描述符讀入ab(1)的select(2)數組,以確保-c連接始終處於活動狀態。 (1)給出了一些非常誤導性的結果,因爲一千個連接中有一個掛起(仍然不是一件好事,但是當它通過負載平衡器使用時,結果非常不利)。

+0

我總是隻有一個連接到服務器,但我看到這延遲無論如何。 – Michael 2011-05-27 21:55:53