2011-06-25 59 views
4

我必須通過UDP協議查詢〜10000個遊戲服務器,以檢查它們是否每隔15分鐘在服務器上聯機。我的代碼正在工作,但離線阻塞線程的服務器極大地減慢了進度。我使用了20個線程,更多的會導致Python的UDP套接字慢下來爬行。什麼是檢查服務器是否在線的合理超時時間?

目前我在決定服務器處於脫機狀態之前使用了5秒的超時時間。這個限制是否可以進一步降低,還是必須升高?


請不要建議使用的心跳,我的服務器來進行遊戲,其中有水蛭並沒有收到最心跳的非官方masterserver。

+0

您也可以將其添加到serverfault.com。 – cwallenpoole

回答

1

您不必使用同步通信(即發送數據包,阻止並等待結果),尤其是在您使用UDP的情況下。只需要一個線程發送ping命令,另一個線程不斷接收同一個socket上的pongs。如果您必須對結果進行復雜的處理,您可能需要使用另一個。

挑戰將在發送邏輯 - 你不想壓倒你自己的互聯網連接,所以我會建議一個可配置的數據包速率。此外,UDP數據包可能會在網絡中丟失,因此在放棄之前重新發送至少一次或兩次。作爲超時,我建議大約2秒鐘,因爲如果對遊戲(即高度延遲敏感)的服務器進行ping操作的時間超過該時間,則可能無法使用。

+0

感謝您的努力,如果您想使它稍微簡潔一些,我會喜歡它,但是您不必這樣做。關於最後一部分我不確定,因爲我是誰來決定?我的服務器在阿姆斯特丹,誰知道我在澳大利亞的遊戲服務器上有什麼? – orlp

+0

@nightcracker哪一部分應該減少?阿姆斯特丹和悉尼之間的距離約爲100光秒。假設2次擁塞,往返和另一個2x緩衝區,你仍然只有800ms,所以我認爲2s仍然是一個很好的近似值。它*無所謂*但是,您可以安全地設置5分鐘的超時時間,並且一切仍然可以正常工作。 – phihag