2012-02-03 44 views
2

我已經發布到python和eventlet郵件列表,所以我很抱歉如果我看起來不耐煩。Python消耗CPU運行eventlet的99%

我在一個小的(不是微型的)保留的ubuntu 11.10 aws實例上運行eventlet 0.9.16。

我有一個類似於eventlet文檔中示例的echo服務器的socketserver。當我第一次開始運行代碼時,一切似乎都很好,但我一直注意到10或15個小時後cpu的使用率從大約1%到99 +%。在那一點上,我無法進一步連接到socketserver。

這是我正在運行的代碼:

def socket_listener(self, port, socket_type): 
     L.LOGG(self._CONN, 0, H.func(), 'Action:Starting|SocketType:%s' % socket_type) 
     listener = eventlet.listen((self._host, port)) 
     listener.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
     pool = eventlet.GreenPool(20000) 
     while True: 
      connection, address = listener.accept() 
      connection.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
      L.LOGG(self._CONN, 0, H.func(), 'IPAddress:%s|GreenthreadsFree:%s|GreenthreadsRunning:%s' % (str(address[0]), str(pool.free()),str(pool.running()))) 
      pool.spawn_n(self.spawn_socketobject, connection, address, socket_type) 
     listener.shutdown(socket.SHUT_RDWR) 
     listener.close() 

的L.LOGG方法簡單地記錄所供給的參數,以一個MySQL表。

我運行的是socket_listener在一個線程像這樣:

def listen_phones(self): 
    self.socket_listener(self._port_phone, 'phone') 

t_phones = Thread(target = self.listen_phones) 
t_phones.start() 

從我最初的谷歌搜索我想這個問題可能是類似於在https://lists.secondlife.com/pipermail/eventletdev/2008-October/000140.html報告的錯誤,但我使用eventlet的新版本,以便當然,這不可能嗎?

+0

好的,我會問。你確定'while True'中的阻塞操作實際上是阻塞嗎?也許它由於錯誤情況或某些資源耗盡而立即返回。 – phs 2012-02-03 05:43:09

+0

嗯,我想我不排除一個錯誤條件。然而,對我來說這似乎不太可能,因爲客戶在無法連接之前會成功連接多次。在此期間,CPU將保持在1-3%左右,然後突然達到100%。我不確定它會耗盡多少資源,因爲在此服務器上運行其他應用程序的方式很少。有一個apache和mysql實例,但他們都在做幾乎沒有工作。 另外我不一定能確定它是一個套接字相關的阻塞問題。這是令人困惑的。 – tedtoy 2012-02-03 06:29:43

+0

tedtoy,你最終發現了問題嗎?我有類似的問題eventlet - http:// stackoverflow。com/questions/9124120/python-consumes-99-of-cpu-running-eventlet – Andrew 2012-03-20 11:05:12

回答

2

如果listener.accept()是非阻塞的,您應該讓線程休眠一段時間,以便os調度程序可以將工作分派給其他進程。通過將

time.sleep(0.03) 

在您的while True循環結束。

+0

我不確定我喜歡延遲循環的想法,因爲我希望它能夠快速運行,但我會試試看看它是否會稍後幫助和更新.. – tedtoy 2012-02-03 08:20:01

+0

您只需要等待幾毫秒。 順便說一句,每次運行endlees循環時都應該這樣做,因爲這正是導致高CPU負載的原因。 – Chris 2012-02-03 08:22:51