我有一個運行的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