我有一个运行的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内处理,并且绝大多数时间服务器都空闲。
TCP_NODELAY对此有点矫枉过正,因为它允许tcp发送更少的数据包(减少数据包检查等待,减少数据包丢失的可能性,减少开销),它可能实际上提高了重新启用它的性能。 – Serdalis
感谢Serdalis的反馈。 – graw