簡體   English   中英

阻塞套接字性能與非阻塞套接字

[英]Blocking socket performance vs. non-blocking socket

我需要編寫一個C ++程序,以高速率從2個不同的NIC接收udp數據包 - 每個插槽大約45MB / s(同一台計算機上每個NIC的單個插槽)。

我開始創建一個基於事件的套接字(使用WSAEventSelect),但我想知道:這種類型的套接字模型(基於事件)是否可能意味着一些性能損失? (因為事件將以高速率觸發,因此操作系統可能會導致一些延遲)如果我選擇阻塞套接字,我會減少延遲嗎? 是否可以說在高吞吐量時,阻塞套接字的性能可能超過非阻塞套接字?

注意:可伸縮性不是問題,因為我們處理的插槽不超過兩個。

謝謝,

AC

如果您只有兩個套接字,為什么使用阻塞調用? 它們的開銷略低於任何異步套接字API,並且具有更簡單的編程模型。 阻塞套接字使用異步IO,但它們在事件中阻止Windows內核。

您應該每個插槽啟動CpuCount/2讀取器線程。 雖然如果能夠處理負載(取決於您的應用程序),較少的線程將表現更好。 線程越少意味着緩存占用空間越小,上下文切換越少。

如果您非常關心跨套接字負載平衡,則應該使用IO完成端口,這是Windows上執行異步IO的標准且性能最佳的方式。

延遲怎么樣? 在您的情況下,阻塞調用將具有與“基於事件的”套接字幾乎相同的延遲,因為每個套接字有多個線程在事件上排隊等待接受NIC接收的下一個數據包。 使用基於回調的異步IO方法,延遲會略有增加。 我希望差異非常小。 內核不會引入任何延遲。 例如,它不會等待時鍾中斷來取消阻塞線程。 解除鎖定立即發生。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM