2016-05-13 41 views
1

我正在爲消息傳遞庫編寫IO核心,並考慮libuv與使用Linux上的原始epoll和Windows上的IOCP(以及最終其他人,solaris事件等)我喜歡可移植性libuv,我在看性能。libuv與原始epoll或IOCP

epoll和IOCP允許多個線程直接等待IO事件,內核執行調度。儘管我沒有任何數字,但比用戶空間調度更有效。

libuv(基於我的閱讀)有一個線程-USafe事件循環,但我可以實現一個領導者跟隨者線程池。我的意思是一個線程(一次)是等待事件的「領導者」。當領導得到一個事件時,它表明一個追隨者應該接任領導。前領導者處理事件,然後成爲追隨者。

我的希望是,應該在性能上接近原始的多線程epoll/IOCP,假設libuv被有效地實現。我會做我自己的測量,但我想聽到任何有經驗的人。

回答

3

聲明:我是libuv的維護者之一。

我建議你先從libuv開始。如果僅僅是因爲它包含已經處理好的角落案件的呃,並且內建了大量的知識。如果你想支持其他平臺,你將最終以某種方式重新發明libuv :-)

一旦你有用libuv構建你的服務器原型,運行一些基準測試,看看瓶頸在哪裏。根據你寫的服務器類型,你可能需要/想要一個多線程事件循環,而libuv不是,但是libuv很可能會適合你。

+0

服務器建成了,我必須加快速度。多線程不是可選的,我們需要在多核機器上進行擴展。理想情況下,我想要一個可以將每個連接的活動序列化的便攜式多線程輪詢器(如epoll)。但是我認爲以leader-follower風格運行的單線程libuv事件循環可以實現這一訣竅 - 所有的應用程序工作都可以併發的每個連接,只有非常輕量級的異步讀/寫緩存切換才能通過libuv進行序列化。至少這就是我所希望的:) –

+0

您可以採取以下方法:每個線程有一個循環,一個「主」線程處理傳入連接,並在一輪中使用「uv_write2」處理傳入連接並將其分派給「工作」線程 - 羅賓時尚。所以每個工人都會處理1/N的連接。 – saghul