2011-11-29 25 views
1

我有一個單獨的線程服務器進程,在一個循環通過epoll的手錶少數(約100)插座,我的問題是,如何決定epoll_wait超時值的最佳值,因爲這是一個單如果在套接字上沒有任何活動,程序保持空閒,我的猜測是,如果我給太小的超時,這會導致太多的epoll_wait調用,這是沒有害處的,因爲即使我的過程也是如此許多epoll_wait調用,否則它會閒置,但還有一點,我在這個(8核心)盒子上運行了很多其他進程,就像100個其他進程一樣,這個進程的客戶端,我想知道超時值如何影響CPU上下文切換,即如果我給太小的超時,導致許多epoll_wait調用將我的服務器進程等待更多次,而當我提供e更大的超時值,從而導致更少的epoll_wait調用。epoll的性能值

任何想法/想法。

感謝

回答

3

我相信沒有很好的理由讓你的程序喚醒,如果它沒有任何關係。只需設置超時時間,當你第一次需要做些什麼。例如,如果您的服務器在停止N秒後斷開客戶端的語義,請將epoll超時設置爲第一個客戶端必須斷開連接(假定沒有活動)之後的時間。換句話說,它設置爲:

分鐘{的expire_time(客戶端);爲每個客戶端} - CURRENT_TIME

或者,如果是陰性,就可以立即斷開至少一個客戶端。一般來說,這不僅適用於斷開客戶的連接,您可以在應用程序中將上述內容抽象爲「軟件計時器」。

我沒有看到你提到的這種妥協。如果你使用的超時時間比你所需要的時間還要短,那麼你會在之前醒來,那麼,大概是因爲你什麼也沒做就回去睡覺。這有什麼好處呢?另一方面,你的一定不是使用一個超過你必須的超時 - 因爲這會讓你的程序不遵守斷開超時策略。

如果你的程序不等待任何基於時間的事件(如斷開連接的客戶端),只要給epoll_wait()的超時值-1,使它永遠等待。

UPDATE如果您擔心此進程在其他進程處於活動狀態時CPU佔用較少,請給它較低的優先值(調度程序優先級)。另一方面,如果您擔心服務器進程在空閒時會換出到磁盤而轉爲其他進程,則可能需要avoid swapping it out。 (或者你可以較低的/ proc/sys目錄/ VM/swappiness,影響到所有進程)

+0

除非斷開連接策略是不是一個很難。人們甚至可以爭辯說,如果其他客戶端正在聯繫服務器,斷開無用客戶端就足夠了 - 不需要釋放未使用的資源。 –

+0

感謝Amborz /西蒙,我的問題是,如果我給過小的超時值,將這種傷害表現反正..喜歡更多的CPU利用率等 – user424060

+0

是,醒來將利用CPU,顯然,如果你醒來做沒有什麼,這個CPU時間將被浪費。浪費多少CPU取決於你醒來的頻率。在實踐中不應該太難測試。 –