【问题标题】:Tornado based python game server latency problem on amazon cloud亚马逊云上基于 Tornado 的 Python 游戏服务器延迟问题
【发布时间】:2021-07-25 09:14:07
【问题描述】:
我在亚马逊云 1gb 内存和 10gn 硬盘上托管了基于龙卷风的游戏服务器。我每天有 500 个用户,并且在给定的时间并发用户是 30+。用户遍布世界各地,我在美国西部托管云机,因为大多数用户来自美国。
我面临网络延迟问题。当我有单个用户的响应时间为 1 秒时,这也很高,但随着用户移动到 10+,此响应时间开始下降到 2 秒。对于 50+ 用户,它的响应时间为 8 秒。
我做了测试并编写了测试脚本。
测试1。
-
使用与上述相同的测试脚本进行测试,在我的本地机器主代码上进行了测试,在本地和测试脚本上运行的本地延迟小于 1000 毫秒(90% 中值 220 毫秒)
-
在云上运行相同的代码,在相同的云上测试脚本相同的结果
-
在云上运行游戏服务器并在本地延迟 8 秒运行脚本
【问题讨论】:
标签:
networking
amazon-ec2
tornado
latency
【解决方案1】:
1.网络 I/O
如果您在请求处理程序中执行网络绑定操作(例如连接到数据库,或向另一个 API 发送请求),则对这些任务使用 await 语句,以便 Python 可以暂停协程并异步处理其他请求。
2。 CPU 任务和磁盘 I/O
如果您正在执行 cpu-bound 操作(除网络 I/O 之外的任何代码都需要花费几毫秒才能运行),那么请使用 IOLoop.run_in_executor 在单独的线程中运行这些任务。这将释放主线程,以便 CPU 可以运行其他任务。
Tornado 是一个单线程服务器。这意味着 CPU 在给定时间只能运行一件事。因此,如果单个响应需要 220 毫秒的 CPU 时间,并且如果您有 10 个连接的客户端,则为第 10 个客户端提供服务将需要超过 2 秒的时间。而这一次只是随着客户端数量的增加而增加*(尽管并不总是成比例,因为 Python 可能会重用 CPU 缓存)。
云服务器上的 CPU 似乎不如您的个人 CPU 快,因此延迟增加。