2013-07-23 25 views
0

我們是否有從1到50左右的一系列描述符的基準?大多數基準,我看到的是對大量描述100s..1000s的...什麼是n個文件描述符之後最好是通過輪詢切換到epoll?

我目前使用的調查有16個描述符和使用epoll的是否會提高應用程序的速度的思考。

Please advise in 3 scenarios with 16 socket descriptors in the set for poll/epoll: 
1. most of the sockets are active...>both should be same performance? 
2. half active half idle....what is better here? 
3. mostly idle...> clearly epoll is better ? 
+2

只有16個描述符,如果完全不同,我會很驚訝。你將需要數百或數千。你有沒有證據顯示「poll()」是你目前的瓶頸? – EJP

+0

@EJP我沒有遇到任何瓶頸。只是在想,如果我切換到epoll,是否可以擠出更多的表現。 – Medicine

回答

2

我非常懷疑,轉換從poll()epoll()不會讓你的應用程序的性能有什麼區別。只要你不改變 - 的epoll()作物,當你有很多的文件描述符(幾百或幾千個),其中標準poll()需要更多一點的工作,要對每一個電話完成的,而epoll()確實設置提前的主要優勢您正在觀看的一組文件描述符,每個調用都會稍微快一點。但是,通常這種差異僅對許多許多文件描述符而言是顯而易見的。

請記住,如果您正在觀看的文件描述符集更改頻繁,epoll()的主要優勢會丟失,因爲您仍然需要完成將新文件描述符傳遞到內核的工作。所以,如果你正在處理很多短暫的連接,那麼切換到它就更不容易了。

另一個區別是,epoll()可以邊緣觸發,其中當活動上的描述符出現的呼叫僅返回,或,其中該調用返回而描述符被讀電平觸發/寫-準備。標準poll()呼叫是總是級別觸發。然而,對於大多數人來說,電平觸發是他們想要的 - 邊沿觸發接口偶爾是有用的,但是在大多數情況下,它們導致數據在讀取後但在進入epoll()呼叫之前到達插座上的競爭狀態。我的建議是遠離邊緣觸發的代碼,除非你真的,真的知道你在做什麼。

你付出epoll()價格是缺乏便攜性 - 既poll()select()是標準的POSIX接口,所以你的代碼會利用他們更加便攜。另一方面,調用epoll()僅在Linux上可用。其他一些Unix變體也有它們自己的等價機制,例如FreeBSD上的kqueue,但在這種情況下你必須爲每個平臺編寫不同的代碼。

我的建議是,直到你達到了使用許多文件描述符的地步,甚至不用擔心epoll() - 嚴重的是,你的代碼中幾乎肯定會有很多其他地方做出更大的性能改進,而且完全是這樣無論如何,epoll()對您的使用情況可能不會更快。

如果你到達了一個你正在處理很多連接的階段,而你的其他代碼已經非常優化了,那麼你應該首先考慮類似libev這是一個跨平臺接口,它在每個接口上使用最佳性能調用特定的平臺。它可能比直接使用epoll()總體上更簡單,即使你只是想支持Linux。

我還沒有提到你提到,到目前爲止,因爲我不相信任何人會執行任何不同的低數量的文件描述符,如16的三個場景。對於大量的文件描述符,epoll()應該優於poll(),特別是在大多數空閒文件描述符的地方。如果所有文件描述符始終處於活動狀態,則兩個調用都需要遍歷每個連接來處理它。但是,隨着空閒連接比例的增加,epoll()會提供更好的性能,因爲它只返回活動連接 - 與poll()一樣,您仍然需要遍歷所有內容,其中大部分都會跳過,但epoll()只會返回您需要處理的連接(達到您可以指定的最大限制)。

要拼寫出明確的(這是爲大量的連接有關,正如我上面提到的):

  1. 大多數插座被激活:兩個調用大致相若,也許epoll()仍稍微領先。
  2. 半活躍半空閒:期望epoll()在這裏稍微好一些。
  3. 大部分空閒:預計epoll()在這裏肯定會更好。

編輯:

你可能想看看this graph這是從libevent的作者和顯示處理事件作爲文件描述符變化的數量相對開銷。請注意,所有線路如何在原點周圍收斂,表明所有機制均可爲少量描述符實現可比較的性能。