2012-02-03 45 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