【问题标题】:In GAE, Python requests, are they really processed in parallel?在 GAE 中,Python 请求真的是并行处理的吗?
【发布时间】: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


【解决方案1】:

使用低延迟请求并不是应用多线程的良好指标。处理请求的一部分发生在应用程序本身之外的 GAE 基础设施中(例如,路由到应用程序)或应用程序内部但在非线程区域中。对于低延迟请求,非线程百分比可能会很大,从而扭曲结果并可能导致错误的结论。

要检查并行请求处理,我建议使用不使用潜在速率受限的 GAE 服务的高延迟请求。例如,尝试让您的请求处理程序执行普通的 python 处理,或者在回复之前只休眠 40-50 秒,以清楚地查看请求是否真的是并行处理的。

【讨论】:

  • 谢谢丹。我发现这个视频对澄清这种情况非常有用。 youtube.com/… 最后想一想,如果我的应用程序延迟非常低,由于很少有 I/O 操作留下空闲 cpu 时间,因此很难利用多线程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-18
  • 1970-01-01
相关资源
最近更新 更多