Appengine 上 google Go 与 Python 和 Java 的资源使用情况

Posted

技术标签:

【中文标题】Appengine 上 google Go 与 Python 和 Java 的资源使用情况【英文标题】:Resource usage of google Go vs Python and Java on Appengine 【发布时间】:2011-12-23 16:18:21 【问题描述】:

Google Go 会比 Appengine 上的 Python 和 Java 使用更少的资源吗? go 的实例启动时间是否比 Java 和 Python 的启动时间快?

go 程序是作为二进制文件还是源代码上传,如果是作为源代码上传,是编译一次还是在每次实例启动时编译?

换句话说:从成本角度来看,我会从在应用引擎中使用 Go 中受益吗? (仅考虑 appengine 资源的成本而不是开发时间)

【问题讨论】:

【参考方案1】:

Google Go 会比 Appengine 上的 Python 和 Java 使用更少的资源吗? Go 的实例启动时间是否比 Java 和 Python 快 启动时间?

是的,Go 实例的内存低于 Python 和 Java (

是的,Go 实例的启动速度比 Java 和 Python 等效,因为运行时只需要读取一个可执行文件即可启动应用程序。

即使是 atm 单线程,Go 实例也会使用 goroutines 并发处理传入请求,这意味着如果 1 个 goroutine 正在等待 I/O,另一个 goroutine 可以处理传入请求。

go 程序是作为二进制文件还是源代码上传,如果是 作为源代码上传,然后编译一次或在每个实例中编译 启动?

在使用 SDK 部署新版本的应用程序时,Go 程序作为源代码上传并编译(一次)为二进制文件。

换句话说:我是否会因在应用引擎中使用 Go 而受益? 观点?

Go 运行时在性能/价格比方面绝对具有优势,但它不会影响 Peter answer 所述的其他 API 配额的定价。

【讨论】:

听起来很有趣...有任何统计数据来支持这些断言吗? 我不了解统计数据,但考虑到他是 Google App Engine 团队的一员,我想他可能知道他在说什么。对于内存消耗,您可以在此处查看:shootout.alioth.debian.org/u64/…(但那是 python3,并且不清楚它与 GAE 的应用程度) 我很欣赏这一点,并不是在讽刺,我们在 GAE 上遇到了大型 Python 应用程序的问题,其中平台 goes through random periods of crapness 因需要在冷实例上完成的大量模块导入而加剧.似乎只加载一个可执行文件可能会有所帮助。但如果没有在 GAE 上运行的真实网络应用的统计数据,任何改进都只是猜测。 这里是使用 2 个非平凡示例应用程序的更多详细信息:1 个带有 2 个依赖项(google apis 和 mapreduce API)的 python 应用程序平均消耗 50MB 并需要 15 秒才能启动。另一个带有 1 个依赖项(google api)的 Go 应用程序平均消耗 8MB,启动时间为 1.5 秒。【参考方案2】:

实例成本只是应用成本的一部分。我现在只使用 Java 运行时,所以我不知道 Python 或 Go 的效率会有多少,但我不认为它会有数量级的不同。我知道实例并不是您需要考虑的唯一成本。根据您的应用程序的用途,您可能会发现 API 或存储成本比运行时之间的任何微小差异更为重要。无论您使用何种运行时,所有 API 成本都将相同。

语言“可能”会影响这些成本:

按需前端实例 预留的前端实例 支持的实例

语言独立成本:

高复制数据存储(每个存储的 gig) 传出带宽(每演出) 数据存储区 API(按操作) Blobstore API 存储(每演出) 电子邮件 API(每封电子邮件) XMPP API(每节) 频道 API(每个频道)

【讨论】:

【参考方案3】:

这个问题大多无关紧要。

Go 应用程序的最小内存占用小于 Python 应用程序,后者小于 Java 应用程序。它们的每个实例的成本都相同,因此除非您的应用程序在额外的堆空间中表现得更好,否则这个问题是无关紧要的。

Go 启动时间小于 Python 启动时间,而 Python 启动时间小于 Java 启动时间。除非您的应用程序有特定的理由要经历大量的实例启动/关闭周期,否则从成本的角度来看,这无关紧要。另一方面,如果您的应用在非常短的时间内异常突发,那么启动时间可能是一个优势。

正如其他答案所提到的,所有平台的许多成本都是相同的 - 特别是数据存储操作。就 Go vs Python vs Java 对实例工时账单的影响而言,它与:

您的应用会产生大量垃圾吗?对于许多应用程序,最大的计算成本是垃圾收集器。 Java 拥有迄今为止最成熟的 GC,并且序列化等基本操作比 Python 快得多。 Go 的垃圾收集器似乎是一个持续发展的主题,但从粗略的网络搜索来看,这似乎并不是一件值得骄傲的事情(目前)。

您的应用程序是计算密集型的吗? Java(JIT 编译)和 Go 在数学运算方面可能比 Python 更好。

这三种语言都有其优点和诅咒。在大多数情况下,您最好让其他问题占主导地位 - 您最喜欢使用哪种语言?

【讨论】:

AFAIK,Go 运行时确实将单个请求视为共享实例上的 goroutine(即:如果一个 goroutine 在 I/O 上阻塞,另一个 1 可以处理传入请求) 如果这是真的,我需要修改我的答案。但是,我找不到有关此事的任何官方文件。你能指出我正确的方向吗? 官方 google-appengine-go 组最近有一个关于此的帖子:groups.google.com/d/msg/google-appengine-go/3qEIZHRaLN8/… 谢谢约翰 - 我已经更正了答案。如果能在某处正式记录这种宏观行为,那就太好了。【参考方案4】:

这可能更多的是关于您如何分配资源而不是您的语言选择。我读到 GAE 是与语言无关的,因此任何语言都可能没有内置优势,但是您可以通过选择您感到舒适和积极的语言来获得优势。我使用 python,让我的部署更具成本效益的是升级到 python 2.7,如果你使用正确的 2.6 子集,你只能进行升级,这很好。因此,如果您选择一种自己熟悉的语言,您可能会从使用该语言的能力而不是组合语言 + 环境本身中获得优势。

简而言之,我会推荐 python,但这是我尝试过的唯一应用程序引擎语言,这是我的选择,即使我对 Java 非常了解,使用我最喜欢的语言 python,项目的代码会更加紧凑。

我的应用程序大小为 small 到 medium,而且它们的成本几乎为零:

【讨论】:

与 python 2.7 的主要区别在于能够让一个运行时处理多个线程,对吗?这大概允许您运行更少的实例? 我相信是今天新定价生效。因此,我可以发布运行 python 2.7 的更新详细信息,以估算完成升级后我节省的费用。【参考方案5】:

我没有使用过 Go,但我强烈怀疑它会更快地加载和执行实例,并且纯粹因为它是编译的而使用更少的内存。来自该小组的轶事,我相信 Python 比 Java 响应更快,至少在实例启动时间上。

实例加载/启动时间很重要,因为当您的实例遇到的请求超出其处理能力时,它会启动另一个实例。这使得该请求需要更长的时间,可能给人的印象是网站通常很慢。 Java 和 Python 都必须启动它们的虚拟机/解释器,所以我希望 Go 在这里会快一个数量级。

还有另一个问题 - 现在 Python2.7 可用,Go 是唯一的单线程选项(具有讽刺意味的是,鉴于 Go 被设计为现代多进程语言)。因此,尽管 Go 请求应该处理得更快,但实例只能串行处理请求。不过,如果这种限制持续很长时间,我会感到非常惊讶。

【讨论】:

即使 Go 运行时是单线程的,它也支持使用 Go 例程处理并发请求。它们不会并行执行,但如果一个 goroutine 正在执行 I/O,另一个可以处理传入的请求。 我相信 Go 运行时不再是单线程的,我有一个地图瓦片应用程序,有几个用户同时大量加载瓦片,并且一直只使用 1 个实例。

以上是关于Appengine 上 google Go 与 Python 和 Java 的资源使用情况的主要内容,如果未能解决你的问题,请参考以下文章

google.appengine.tools.devappserver2.errors.InvalidAppConfigError

使用 Django 未在 Google Appengine 上显示的静态文件

Go,AppEngine:如何为应用程序构建模板

带有经过身份验证的 Appengine 端点的 Google Volley 库?

Golang、App Engine、通道和线程安全

为整个应用设置 Python27 Google AppEngine 默认编码