我已經發布到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的新版本,以便當然,這不可能嗎?
好的,我會問。你確定'while True'中的阻塞操作實際上是阻塞嗎?也許它由於錯誤情況或某些資源耗盡而立即返回。 – phs 2012-02-03 05:43:09
嗯,我想我不排除一個錯誤條件。然而,對我來說這似乎不太可能,因爲客戶在無法連接之前會成功連接多次。在此期間,CPU將保持在1-3%左右,然後突然達到100%。我不確定它會耗盡多少資源,因爲在此服務器上運行其他應用程序的方式很少。有一個apache和mysql實例,但他們都在做幾乎沒有工作。 另外我不一定能確定它是一個套接字相關的阻塞問題。這是令人困惑的。 – tedtoy 2012-02-03 06:29:43
tedtoy,你最終發現了問題嗎?我有類似的問題eventlet - http:// stackoverflow。com/questions/9124120/python-consumes-99-of-cpu-running-eventlet – Andrew 2012-03-20 11:05:12