2013-10-31 167 views
2

我有一个运行的Python游戏服务器。游戏是基于回合的。玩家抱怨持续几个回合的短暂滞后峰值(即他们的客户等待一段时间,然后突然他们突然收到几圈的更新)。我希望找到一些方法来提高网络一致性,但我不知道还有什么可以做的。Python游戏服务器 - 优化网络

下面是我在做什么:

  • 异步插座
  • TCP_NODELAY标志设置
  • epoll的轮询

以下是我收到剧本:

for (fileno, event) in events: 
    if fileno == self.server_socket.fileno(): 
     self.add_new_client() 
    elif event & select.EPOLLIN: 
     c = self.clients[fileno] 
     c.read() # reads and processes all input and generates all output 
     ... 

这就是我的发送方式更新:

if turn_finished: 
    for user in self.clients.itervalues(): 
     for msg in user.queued_messages: 
      msg = self.encode(msg) 
      bytes_sent = user.socket.send(msg) 
      ... 

每当我写入或从套接字读取,我检查所有字节发送并记录任何套接字错误。这些东西几乎从不出现在日志中。

如果我只做了一个socket.send()调用会更好吗?

有什么我可以检查或调整在Linux(Ubuntu)的主机?

数据迟到客户端似乎存在一些问题。任何人都可以提供任何建议来调试这个问题?


关于发送的消息:

如果玩家是空闲的,他们通常会收到0-3获得更新一转。如果玩家处于与其他玩家行动的中间,他们通常会在其屏幕上每玩家收到2-3次更新。更新通常约为20字节长。有几个更新(一次只发送给一个玩家),大小为256和500-600字节。

通常大约有10-50名玩家在一次活动,在同一屏幕上不超过10名玩家。


P.S. - 我用PyPy运行。我已经配置好,一切看起来不错。所有玩家移动都在< 3 ms内处理,并且绝大多数时间服务器都空闲。

+1

TCP_NODELAY对此有点矫枉过正,因为它允许tcp发送更少的数据包(减少数据包检查等待,减少数据包丢失的可能性,减少开销),它可能实际上提高了重新启用它的性能。 – Serdalis

+0

感谢Serdalis的反馈。 – graw

回答

0

这听起来像你需要调试客户端,并找出它在“卡住”时所做的事情。

只有当你明白原因后,你才能找到解决方案。