1. 程式人生 > >關於大資料量阻塞式傳送卡住的解決方法

關於大資料量阻塞式傳送卡住的解決方法

最近做一個伺服器間的通訊

通訊客戶端使用阻塞方式傳送資料,傳送頻率較低時,一切正常。

但是頻率提高後就會導致send函式長時間保持阻塞狀態。

接收端伺服器採用epoll模型,接收緩衝區設成了0。

研究好了好幾天沒有答案,經過各種嘗試之後發現,把接收緩衝區設成非零(我是取消了緩衝區大小設定,使用預設值)之後send函式不會再被阻塞。

原因推測

服務端接收到第一個資料後要對資料做處理,此時因為接收緩衝區為0,客戶端發來的資料無法儲存,因此客戶端阻塞。

接收到的資料要壓入邏輯層的訊息佇列,需要加鎖處理,更加耗時。

再者客戶端發來的資料包不應定是完整的,可能只有一部分,此時服務端收到資料不能處理,而伺服器同時也要做訊息傳送操作。因此會出現伺服器接收一條完整資料對應傳送好幾條資料出去。

雖然傳送資料量較大,但是客戶端卡住好幾秒鐘的狀況卻無法解釋。