2015-04-05 27 views
0

我在做我的學士論文,我寫了一個程序,它分佈在許多服務器上,並通過IPv6多播和單播交換消息。網絡使用率相對較高,但我認爲當我在我的測試中有15臺服務器時,每秒有2個請求會如此:控制檯輸出消耗很多CPU? (每秒大約140行)

服務器1通過組播請求服務器3-15的信息。每個3-15都必須迴應。如果一個響應在0.5秒後丟失,則多播會被重新發送,但只有丟失的服務器必須響應(所以在大多數情況下,這只是一個服務器)。 服務器2完全相同。如果在5次重試後丟失結果,則丟失的服務器將被標記爲已停用,並且更改將與其他服務器同步(1/2)。因此,每秒有2個組播單播,每秒有26個單播組播。我認爲這不應該太多?

服務器1和2是正在運行的我用做每秒每個服務器上(經由web客戶端)請求

整個SZENARIO是其中在一個虛擬運行的mininet環境中運行蟒web服務器盒子有2個核心(最大2.8ghz)和1GB內存的Ubuntu。在運行測試時,我通過htop看到CPU處於100%,而RAM處於50%。所以CPU是這裏的瓶頸。

我注意到,2-5分鐘後(1分鐘= 60 *(2 + 26)消息= 1680消息),有太多的缺失結果導致太多的發送重複,而新的請求已經進入,所以「管理服務器」認爲客戶端服務器(3-15)關閉並註銷它們。在與其他管理服務器同步後,所有客戶端服務器在兩臺管理服務器上都被標記爲死機,這是不正確的...

我想知道如果問題可能是我的調試輸出?我正在爲發送和接收的每條消息打印3-5條消息。所以這是關於(我們猜測它是每條發送5條消息/ recvd味精)(26 + 2)* 5 = 140行,在控制檯上打印。

我使用python 2.6作爲服務器。

所以這裏的問題是:控制檯輸出可以減慢整個系統的速度,簡單的請求需要超過0.5秒才能連續完成5次?請求處理在我的測試中很簡單。沒有複雜的計算或類似的東西。基本上它就像是「返回request_param in [」bla「,」blaaaa「,...](小項目列表中的5項)」

如果是的話,我怎樣才能完全禁用輸出而不必每次都註釋掉打印聲明?或者甚至有可能僅輸出包含「錯誤」或「警告」的行? (不是通過grep,因爲當grep變爲活動時,所有的打印已經完成了......我的意思是直接在python中)

還有什麼可能導致我的應用程序變慢?我知道這是一個非常普遍的問題,但也許有人已經有一些與mininet和網絡應用程序的經驗...

+0

我忘了提及:整個輸出是通過bash發送到一個文件:python myscript.py> log.txt – 2015-04-05 19:48:27

+1

格式化的輸出是昂貴的,特別是對控制檯。你可以試試'>/dev/null'。這應該會有所作爲。真正要嘗試的是評論所有的I/O。無論如何,[*試試這個*](http://stackoverflow.com/a/4299378/23771)。它沒有任何成本,並告訴你正在發生什麼。 – 2015-04-05 19:53:51

+0

是的,控制檯輸出可能是一個瓶頸,不僅取決於您的代碼,而且還取決於顯示文本的程序。只需在Windows的控制檯中進行基準測試,就會明白我的意思......一些linux虛擬終端在這方面做了大量工作。 Err ...有沒有聽說過什麼日誌記錄? – Cilyan 2015-04-05 21:31:31

回答

0

我終於找到真正的問題。這不是因爲打印(使它們的性能略有提高,但不顯着),而是因爲使用共享鎖的線程。這個鎖被共享在多個CPU內核上,導致整個過程非常緩慢。

它甚至越來越慢的內核更我加入到執行VM這是很奇怪......

現在,新的瓶頸似乎是APScheduler ...我總是收到諸如「錯過事件」之類的消息,因爲調度程序的負載過重。所以這是下一步加快...... :)