2013-10-08 49 views
3

我需要編寫一個C++程序以高速率接收來自2個不同NIC的udp數據包 - 每個套接字大約45MB/s(同一臺計算機上每個網卡的單個套接字)。我開始創建一個基於事件的套接字(使用WSAEventSelect),但我想知道:這種類型的套接字模型(基於事件)可能意味着一些performane懲罰? (因爲事件將以高速率觸發,因此操作系統可能會導致一些延遲) 如果我選擇阻塞套接字,我會減少延遲嗎? 是否可以說在高吞吐量情況下,阻塞套接字可能會勝過非阻塞套接字?阻塞套接字性能與非阻塞套接字

注意:可伸縮性不是問題,因爲我們處理不超過兩個套接字。

感謝,

交流

回答

2

如果只有兩個插槽,爲什麼不會使用阻塞調用?它們的開銷比任何異步套接字API稍少,並且具有更簡單的編程模型。阻塞套接字在封面下使用異步IO,但它們在Windows內核中封鎖事件。

您應該爲每個套接字啓動CpuCount/2讀取器線程。儘管如果他們能夠處理負載,線程的執行效果會更好(取決於您的應用程序)。線程越少意味着緩存佔用量少,上下文切換越少。

如果您關心跨插槽負載平衡,您應該使用IO完成端口,這是Windows上執行異步IO的標準和最佳性能方式。

什麼是延遲?阻塞調用與您的案例中的「基於事件」套接字具有幾乎相同的延遲,因爲每個套接字有多個線程在事件中等待,以接受NIC接收到的下一個數據包。使用基於回調的異步IO方法時,延遲略有增加。我預計這個差距會非常小。內核不會引入任何延遲。它不會等待時鐘中斷來解鎖線程。解除封鎖立即發生。

+2

完全正確,儘管我甚至傾向於說阻塞調用的延遲明顯較少,不僅「幾乎相同」,即使每個套接字只有一個單獨的阻塞線程(儘管線程可能會執行其他處理接收,所以一些額外的線程是沒有錯誤的)。當NIC以任何方式觸發中斷時,數據報進入接收緩衝區,並且使用阻塞API節省了排隊(和非排隊)APC和簿記OVERLAPPED結構的開銷。 – Damon