【发布时间】:2015-10-24 22:10:55
【问题描述】:
我在module.yaml中有这个配置
runtime: python27
api_version: 1
instance_class: F2
threadsafe: true
automatic_scaling:
min_idle_instances: automatic
max_idle_instances: 8
min_pending_latency: 0.25s
max_pending_latency: automatic
max_concurrent_requests: 80
在控制台中我看到如下数字:
QPS* Latency* Requests Errors Age Memory App Engine Rel. Availability
8.730 113.5 ms 12621 0 1:48:25 67.9 MBytes 1.9.27 Resident
14.142 76.7 ms 12543 0 1:48:26 79.8 MBytes 1.9.27 Resident
13.411 74.3 ms 12753 0 1:48:26 96.4 MBytes 1.9.27 Resident
如果您将 QPS(每秒查询数)乘以延迟(转换为秒):
- 8.730 查询/秒 x 0.1135 秒 = 0.990855 查询
- 14.142 查询/秒 x 0.0767 秒 = 1.0846914 查询
- 13.411 查询/秒 x 0.0743 秒 = 0.9964673 查询
我每天多次重复相同的练习,在所有情况下,右侧的最终数字非常接近 TO 1 查询。
所以我怀疑同一个实例是否能够并行处理查询。正如您在平均延迟中看到的那样,我的流程非常快,当我需要做长时间的工作时,该流程使用任务队列。我不在此模块中使用异步进程。我读到,当您有一个空闲进程等待 urlfetch 响应时,将有机会并行执行另一个 python 线程/请求,但不是我的情况。
官方文档在这方面没有详细说明,只是这样说明:
使用并发请求
默认情况下,App Engine 将请求串行发送到给定的网络服务器。您可以通过将 threadsafe 元素添加到 app.yaml 来配置 App Engine 以发送多个并行请求。
线程安全:真
我是否需要设置其他参数或使用特殊库来允许在同一实例中并行执行多个请求?对于上面显示的 QPS 数字,平均 CPU 利用率在 15% 到 25% 之间,因此有空间并行运行至少 3 个请求(个人估计没有足够的分析)
谢谢!
【问题讨论】:
-
据我所知,
threadsafe: true足以告诉 GAE 该实例可以并行处理多个请求。请注意,使用 CPython,在大多数情况下一次只能运行 1 个线程(由于全局解释器锁的限制 -- GIL)。因此,在 python 中,除非程序不忙于等待,否则通常不会通过线程获得太多收益——例如如果您向数据存储区产生了异步请求或使用 urlfetch。 -
谢谢,我也读到了这种情况,因此我声明我在这个模块中的代码不使用异步函数。如果我将运行时更改为 PHP 或 JAVA,我会有同样的限制吗?如果 PHP 运行时可以真正并行处理请求,那对我来说可能是一个解决方案,我可以将一些模块迁移到 PHP。
-
这样的一个推论是,拥有更多实例 F1 比拥有等量的更高实例 F2 或 F4 更好,因为拥有更多实例可以并行处理更多请求……怎么办您认为?在拥有数千 QPS 时考虑预算优化。
-
对于 python 是的。另一件要考虑的事情。在单核上运行的任何语言的线程都无法为您提供真正的并行运行。一次只能运行一个线程。例如,当一个线程正在等待 I/O 时,你会赢,然后其他线程可以做一些事情。这就是异步操作运行良好的原因之一。每个 tasklet 在 I/O 上产生。此外,在请求级别阻塞 I/O 可以为每个要处理的请求腾出时间。
标签: python multithreading google-app-engine parallel-processing