我正在几个平台上尝试并发请求处理。
该实验的目的是有一个broad衡量某些选定技术的能力界限。
我在我的机器上设置了一个 Linux 虚拟机,其中包含一个基本的 Go http 服务器(vanillahttp.HandleFunc
of the http
默认包)。
然后服务器会计算出一个修改后的版本fasta将线程和进程限制为 1 的算法,并返回结果。 N 设置为 100000。
该算法运行时间大约为 2 秒。
我用的是sameGoogle App Engine 项目的算法和逻辑。
该算法是使用相同的代码编写的,只是处理程序设置完成init()
代替main()
根据 GAE 要求。
在另一端,Android 客户端生成 500 个线程,每个线程并行发出一个GET
请求给fasta计算服务器,请求超时5000毫秒。
我原本期望 GAE 应用程序能够扩展并回复每个请求,而本地 Go 服务器在处理 500 个请求中的某些请求时会失败,但结果却相反:
本地服务器在超时范围内正确回复每个请求,而 GAE 应用程序只能处理 500 个请求中的 160 个。其余请求超时。
我检查了 Cloud Console,确认已生成 18 个 GAE 实例,但绝大多数请求仍然失败。
我认为大多数失败的原因是每个 GAE 实例的启动时间,所以我立即重复了实验,但得到了相同的结果:大多数请求超时。
我原本期望 GAE 能够扩展以适应所有请求,并相信如果单个本地虚拟机能够成功回复 500 个并发请求,GAE 也会做同样的事情,但事实并非如此。
GAE 控制台不会显示任何错误并正确报告传入请求的数量。
这可能是什么原因造成的?另外,如果单个实例可以仅凭借 goroutine 来处理我的机器上的所有传入请求,那么为什么 GAE 需要扩展这么多呢?
为了在最小化成本方面实现最佳使用,您需要配置一些东西app.yaml
:
- Enable
threadsafe: true
-实际上它来自Python配置不适用于 Go,但我会设置它以防万一。
- Adjust scaling section:
-
max_concurrent_requests
- 设置为最大 80
-
max_idle_instances
- 设置为最小值 0
-
max_pending_latency
- 将其设置为自动或更大min_pending_latency
-
min_idle_instances
- 将其设置为 0
-
min_pending_latency
- 设置为更高的数字。如果您可以接受 1 秒延迟,并且处理程序平均需要 100 毫秒来处理,请将其设置为 900 毫秒。
那么您应该能够在单个实例上处理大量请求。
如果您愿意为了响应能力和可扩展性而烧钱 - 增加min_idle_instances
& max_idle_instances
.
您还对 VM 和 GAE 使用类似的实例类型吗? GAE F1 实例不太快,并且更适合异步任务,例如使用 IO (数据存储、http 等。)。您可以配置使用更强大的实例,以更好地扩展计算密集型任务。
您还在付费帐户上进行测试吗?免费帐户有配额,如果 AppEngine 认为如果连续使用相同模式负载将超过每日配额,则 AppEngine 将拒绝一定比例的请求。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)