
Overall
0
Activity
Funds Held
Trading Pairs
0
Registered Location
-
Followers
0
在Coinbase,我们对无服务器的潜力感到兴奋 - 如果正确实施,它可以以极低的成本提供强大的安全保障和“无限”可扩展性。当我们探索无服务器的潜力时,我们发现自己对某些用例的真实世界性能感到好奇。我们开始提出的一些问题包括:
- VPC冷启动惩罚真的有多大戏剧性?这对我们选择的数据库技术(AWS DynamoDB和AWS Aurora Serverless具有“公共”API)有很大影响。我们听说ENI冷启动可能长达10秒,这是真的吗?多久一次?
- Lambda的大小如何影响冷启动时间?如果较小的封装可以减少冷启动时间,将Lambdas划分为更小的封装可能是有意义的。否则,利用“巨石”Lambdas可能更有意义。
- 我们已经读过,在Lambda执行的上下文中, Python实际上可以比Golang表现出更快的冷启动时间 。作为Ruby / Golang商店,我们很想知道运行时的性能是如何叠加的。
术语
如果您在不跳过节拍的情况下阅读上述要点,请随时跳到下一部分。否则,以下词汇部分应该有助于回顾整篇文章中使用的一些术语。
- AWS Lambda - 完全托管的计算即服务。 AWS Lambda按需存储和运行代码(“功能”)。函数在AWS管理的主机上的沙盒容器内运行,并自动创建以响应不断变化的需求。
- 热启动 - 在功能执行之间,容器在主机上“暂停”。热启动是AWS Lambda函数的任何执行,其中空闲容器已存在于主机上并从此暂停状态执行。
- 冷启动 - 执行功能但空闲容器不存在时,AWS Lambda将启动一个新容器来执行您的功能。由于主机需要将功能加载到内存中(可能是S3),冷启动执行的执行时间比热启动要长。
- ENI - 弹性网络接口代表虚拟网卡,Lambda需要与AWS VPC(虚拟专用网络)内的资源进行通信,以访问内部负载平衡器或RDS或Elasticache等数据库之类的资源。
- ENI冷启动 - 为了在VPC内部进行通信,在初始化函数时,主机上必须存在与Lambda的安全组匹配的ENI。如果主机上尚不存在ENI,则必须在执行功能之前创建ENI。 ENI可以在共享相同安全组的Lambdas之间重用,但即使对于相同的VPC,也无法在安全组之间共享。 AWS计划在2019年的某个时候解决这些问题。
- Box Plot - 通过四分位直观表示数字数据的方法。在这篇文章中,异常值显示为框外的点。
安装程序
我们开始在互联网上寻找问题的答案,并找到了几篇很棒的论文和博客文章。但是,有一些问题我们认为没有直接回答,或者至少没有在我们使用的具体技术的背景下。此外,即使我们相信测试结果,为什么不验证?所以我们决定尝试发现我们自己对这些问题的答案。
我们编写了一个小型测试工具和一系列简单的Lambda来执行这些测试。实际上我们只需要我们的框架来执行给定Lambda包的一系列冷和热调用。我们能够通过在第一次执行时将全局变量“cold”设置为false来检测Lambda是被调用冷还是暖,这样当第一次调用将返回“cold = true”时,每次后续调用都将返回“cold = false” 。我们可以通过简单地重新上传函数的有效负载来强制冷启动。
我们使用三种不同的来源来衡量调用时间:计费持续时间,观察持续时间和AWS X射线跟踪统计信息。由于计费持续时间不包括冷启动时间,并且X射线跟踪统计信息不包括ENI创建时间,因此我们使用观察时间进行大多数测试。
数据库/ VPC性能
我们的第一个测试旨在测试Lambda内部最常见数据库的性能。由于我们利用的大多数数据库都存在于AWS VPC中,因此该测试还将固有地测试在VPC内创建的Lambdas的性能(这主要是在我们的Lambda所在的主机上初始化ENI所需的额外时间)。
我们测试了六个数据库,Aurora Serverless,Aurora MySQL,DynamoDB,Elasticache Redis,Elasticache Memcached和MongoDB(Atlas)。除Aurora无服务器和DynamoDB之外的所有要求我们在VPC内创建Lambda。
冷启动测试的结果让我们感到惊讶。我们原本期望ENI创建能够更频繁地为在VPC内部创建的Lambdas的冷启动时间做出贡献。相反,冷启动时间似乎总体上是一致的,而不是VPC Lambdas上明显更多的异常值。
从这些结果可以清楚地看出,并非每个VPC冷启动都需要ENI创建。相反,AWS在Lambda执行期间重用现有的ENI。因此,虽然技术上VPC中的Lambdas更容易遇到ENI冷启动,但冷启动次数取决于调用Lambda安全组中现有ENI的总数。
我们希望更可靠地了解ENI冷启动对Lambda调用时间的影响。因此,我们再次运行测试并通过在每次调用之前在临时新安全组中重新创建VPC Lambdas来强制创建ENI。这些测试更清楚地突出了ENI冷启动的严重损失,要求至少7.5秒且经常超过20秒!
这些测试提醒我们在将VPC Lambdas放置在热门或面向客户的路径时要小心。我们正在考虑减轻ENI冷启动影响的一些潜在策略是让相关的Lambdas共享安全组(以及ENI)或将所有VPC Lambdas放置在5-10分钟的计时器上,以确保在执行之前创建ENI。
包装尺寸
我们的第二个测试旨在了解AWS Lambda内存大小的软件包大小的冷启动性能。我们已经读过,提供给给定AWS Lambda函数的计算量是基于函数的预配内存。
此测试与之前的测试没有什么不同,除了这次我们只是在我们上传到Lambda的zip中包含大量随机生成的文件。
这项测试的结果很明确:大包装尺寸等于大冷启动罚款。由此可见,Lambda在冷启动时将一个函数的包下拉到调用主机,但不太清楚的是为什么在较大尺寸的包上会有如此大的惩罚。简单的数学运算是249MB软件包的10s冷启动下载速度为200mbps,远低于r5.metal或类似产品提供的25gbps。这表明AWS在每个lambda基础上限制冷启动带宽。大型内存Lambdas缺乏性能提升似乎意味着这不依赖于Lambda内存大小。
运行
我们的最终测试旨在了解各种AWS Lambda运行时的冷启动和热启动性能。我们选择比较Ruby和Golang(以及Python作为控件),因为它们是我们内部利用的主要语言。此测试执行一个非常简单的脚本,它只返回“冷”全局变量和根X射线跟踪ID。
测试结果表明,虽然Golang在冷启动和热启动性能方面都名列前茅,但三种语言之间的执行时间并没有显着差异。该测试的结果使我们能够轻松地让工程师以他们认为最舒适的语言编写Lambda函数。
摘要
总之,我们的一些主要内容包括:
- 在热/面向客户的路径中的任何ENI冷启动都将导致我们认为延迟不可接受的峰值。 ENI冷启动可以通过允许共享Lambda函数共享安全组来缓解(至少在AWS 在2019年某个时候解决这些问题之前 )。
- 对于冷启动执行,Lambda包大小确实很重要。用户应小心避免包含100MB +范围的热路径。
- 配置的Lambda内存大小比预期的要小 - 在规模的较低端(128MB),我们能够观察到响应时间的增加,但是大小对于大于512MB的lambda的影响可以忽略不计。
- 编译语言和解释语言(Golang vs Ruby)之间的差异远没有我们预期的那么显着。因此,我们可以放心地让开发人员以他们认为最舒适的语言编写函数。
我们很高兴能够在未来运行这些相同的测试,以了解AWS Lambda性能如何随时间而变化!
如果您有兴趣帮助我们为加密市场的未来构建一个现代化,可扩展的平台,我们将在旧金山和芝加哥招聘!
通过基准测试AWS Lambda探索无服务器技术最初发布于The Coinbase Blog on Medium,人们通过突出显示和回应此故事来继续对话。