[英]Boost: multithread performance, reuse of threads/sockets
我將首先描述我的任務,然后在下面提出我的問題。
我正在嘗試為我們的分布式DAQ系統實現“單線程一連接”方案。 在Linux平台上,我將Boost用於線程(thread_group),將ASIO用於套接字。
我們有320個聯網的DAQ模塊。 每0.25ms大約發送一次,其中大約一半將各自生成一個數據包(大小小於標准MTU)並發送到Linux服務器。 每個模塊都有其到服務器上專用端口的長壽命TCP連接。 也就是說,服務器端應用程序在1Gbe NIC和8個CPU內核上運行320個線程,320 tcp同步接收器 。
320個線程不必對傳入的數據進行任何計算-只需接收數據,生成並添加時間戳並將數據存儲在線程擁有的內存中即可。 套接字都是同步的,因此沒有傳入數據的線程將被阻塞。 套接字在運行期間保持打開狀態。
我們的要求是線程應以盡可能少的時間延遲讀取它們各自的套接字連接 。 在閱讀了有關C10K 和這篇文章之后, 我希望每個線程每秒都可以輕松地處理至少1K的MTU大小數據包。
我的問題是 :我首先通過在服務器上激發時間同步數據來測試系統(不同套接字上的傳入數據相隔不到幾微秒)。 當數據包的數量非常少(少於10個)時,我發現線程時間戳間隔了幾微秒。 但是,如果多於10個,則時間戳會傳播多達0.7秒。
我的問題是:
320個線程在資源方面是笨拙的變化,但是調度可能會帶來問題。
320 * 0.25 =每秒80個請求,這意味着至少有80個上下文切換,因為您決定必須在線程上建立每個連接。
我只是建議:不要這樣做。 眾所周知,每個連接線程不會擴展。 而且,幾乎總是意味着在任何共享資源上進一步鎖定爭用(假設所有響應都不是完全無狀態的)。
問:閱讀了C10K和這篇文章后,我希望每個線程每秒都可以輕松地處理至少1K的MTU大小數據包
是。 一個線程可以輕松地維持這一點(在大多數系統上)。 但是 ,顯然,如果您有數百個嘗試相同的線程競爭物理內核,那就不再是事實。
因此,要獲得最大的吞吐量和較低的延遲,擁有可用線程(!)的物理核幾乎沒有用。
問:這真的可以重用線程和/或套接字嗎? (我真的不知道如何在我的情況下實現重用,因此不勝感激。)
好消息是,Boost Asio使使用單個線程(或有限的線程池)非常容易地從其服務隊列中服務異步任務。
也就是說,假設您已經使用了ASIO API函數的*_async
版本。
我認為絕大多數(如果不是全部)異步IO的Boost Asio示例說明了如何僅在有限數量的線程上運行服務。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.