App Engine调度程序何时使用新线程与新实例?

时间:2012-07-17 15:23:33

标签: python google-app-engine

如果我在threadsafe: true文件中设置app.yaml,那么在创建新实例以提供请求时的规则是什么,与在现有实例上创建新线程的时间相比?

如果我有一个应用程序在每个请求上执行计算密集型操作,那么多线程会给我带来什么吗?换句话说,实例是多核实例还是单核?

或者,当现有线程在IO上等待时,新线程是否只会启动?

3 个答案:

答案 0 :(得分:36)

以下一组规则目前用于确定给定实例是否可以接受新请求:

if processing more than N concurrent requests (today N=10): false
elif exceeding the soft memory limit: false
elif exceeding the instance class CPU limit: false
elif warming up: false
else true

以下总CPU /核心限制当前适用于每个实例类:

CLASS 1: 600MHz 1 core
CLASS 2: 1.2GHz 1 core
CLASS 4: 2.4GHz 1 core
CLASS 8: 4.8GHz 2 core

因此,只有B8实例可以并行处理最多2个完全CPU绑定的请求。

为实例类设置threadsafe: true(Python)或<threadsafe>true</threadsafe>(Java)&lt; 8不允许在单个实例上并行处理多个CPU绑定请求。

如果您没有完全受CPU限制或进行I / O操作,Python和Java运行时将生成新线程,以便使用threadsafe: true

处理最多10个并发请求的新请求

另请注意,即使Go运行时是单线程的,它也支持并发请求: 它会在每次请求时产生1个goroutine,并在执行I / O时在goroutine之间进行控制。

答案 1 :(得分:1)

阅读Kyle Finley建议的link中的下一条消息

  

Jeff Schnitzer:还有10个线程的硬限制吗?

     

是的,但可能不是您期望的原因。我们的首要问题   遇到的是内存管理。如果我们将默认值提高到100,那么很多   应用程序会看到内存不足的死亡(比现在更多),以及   对于python / java / go,这些死亡的表现方式不同。正确的道路   转发是更智能的算法和内存,提供   可配置性等。这是各种各样的例子   我们为调度程序工作的项目,但与我们拥有的任何团队一样   优先考虑我们的项目。我建议提交此(或任何其他   公共问题跟踪器上的所需调度程序增强功能)   可以获得反馈/数据/投票。

答案 2 :(得分:0)

  

如果我在app.yaml文件中设置threadsafe:true,那么在创建新实例以提供请求时,与在现有实例上创建新线程时相比,有哪些规则可以管理?

就像人们在这里说的那样,如果前一个实例已经使用了10个线程,那么将启动一个带有新线程的新实例。如果所有其他线程都忙,则会创建一个新线程,它们必须等待某些响应或计算结果。

  

如果我有一个应用程序在每个请求上执行计算密集型操作,那么多线程会给我带来什么吗?换句话说,实例是多核实例还是单核?

现在这个问题很有争议。每个人都知道答案,但他们仍然持怀疑态度。如果您的任务仅基于计算,多线程永远不会给您带来任何好处,除非您使用多核处理器,不要问我为什么多核处理器会更好地帮助,您知道答案。现在谷歌应用程序引擎不够复杂,无法决定何时应将新线程分派到其他处理器/核心(如果存在),只会将新实例分派给其他核心/处理器。希望您的线程在其他核心/处理器中运行?那么,在那里扔一些技能和博雅!请记住,由您来决定线程是否应该在其他核心/处理器中运行,引擎不能承担这样的责任,因为这可能导致如此多的混淆,引擎不是上帝。简而言之,默认情况下,实例是单核,引擎无法决定何时应该进入多核。

  

或者,当现有线程在IO上等待时,新线程是否只会启动?

我的答案的第一部分清除了这一点。是的,它们只在现有线程忙时才会启动,这就是线程安全的工作方式,以防止死锁。

现在我可以告诉你这一切,根据我的个人经验,我在app引擎上工作了好几个月,编程/调试/测试的应用程序高度依赖于线程安全架构。如果你想我可以添加引用(我没有引用,只是个人经验,但我已经准备好为你搜索并把东西放在桌面上了),但我不认为在这种情况下需要它们,线程安全以明显的方式工作,我已经验证了自己。