我已经发布到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