2013-11-27 29 views
3

我有一個CentOS 5.9的機器設置與ETH2 5000+的IP地址(二級)。 我的程序只對2個UDP套接字(1個RX,1個TX)使用2個。 當我運行應用程序時,CPU使用率幾乎是100%。 當我下拉IP地址的數量(10)時,一切都會正常 - 幾乎不會有1%的CPU使用率。成千上萬的IP地址/接口與慢編程性能

計劃基本上是一個客戶端 - 服務器應用程序。它使用非阻塞r/w和epoll_wait() 來等待事件。

可有人請向我解釋二進制僅使用配置的地址的一小部分 爲什麼這麼高的CPU使用率。

+4

也許是因爲它的設計沒有在與IP地址的數量ridculous配置是有效的?但是這個問題可能屬於ServerFault,而不是StasckOverflow ... – Roddy

+1

沒有任何代碼,很難診斷問題。 – aust

+0

Roddy的陳述可能是有效的,可能是CentOs不是爲了處理這些大量的地址請求而設計的。您是否嘗試過使用Linux版本的RedHat,Ubuntu服務器版本進行安裝? –

回答

1

處理數千個套接字需要專門的軟件。大多數網絡程序員天真地使用「選擇」,期望擴大到數千個插座......這絕對不是。更爲事件驅動模型擴展好得多......該事件是在插座上一個新的套接字或數據等

對於Linux和Windows我用LIBEVENT。它是一個套接字包裝器,使用起來不是很難,它可以很好地擴展到數以萬計的套接字。

http://libevent.org/ 

看看這個網站在這裏,你可以看到對數圖,顯示執行,彷彿它們是100。當然,如果插座是超級忙碌的插座數以萬計的,那麼你是正確的回到低性能,但世界上大多數插座大多安靜,這是libevent閃耀的地方。還有其他類似於ZeroMq(C#mono),libev,Boost.ASIO的庫。

http://zeromq.org/ 
http://libev.schmorp.de/bench.html 
http://www.boost.org/doc/libs/1_36_0/doc/html/boost_asio.html 

這是我的工作,超簡單的示例。您需要添加線程保護,但只需不到一個小時的工作量,您可以輕鬆支持幾千個同時連接。

http://pastebin.com/g02S2RTi 
+0

OP沒有說'處理數千個套接字'的一個字。相反,他已經明確提到*兩個*套接字和數千個*地址。*顯然你沒有真正閱讀過這個問題。 -1 – EJP

1

我不認爲這個問題發佈了關於套接字數量的討論,而是關於接口上的地址數量的討論。雖然看起來有點奇怪,爲什麼你的程序在CPU中使用這個數字過高,但是通常地址數量會影響IP棧處理輸入數據包和輸出數據包的性能。就像當你調用send時,你的套接字沒有被綁定一樣,內核需要根據目的地址確定一個IP地址來放入數據包,如果這需要時間,它會顯示在你的進程上下文中。

但這些仍然沒有太多解釋,我想放一個gprof的將是一個不錯的主意。