使用AWS CloudWatch 调优Lambda函数 | 技术头条

戳蓝字“CSDN云计算”关注我们哦!

640?wx_fmt=jpeg

技术头条:干货、简洁、多维全面。更多云计算精华知识尽在眼前,get要点、solve难题,统统不在话下!

译者:风车牛马

整理:刘丹


Kyle Galbraith,高级软件工程师,AWS认证专业解决方案架构师。Kyle Galbraith开门见山的提到:“对于使用Serverless和AWS Lambda的新人来说,通常我们会为他们提供需要的功能。我们编码时会考虑服务会做什么,它会依赖什么。”

 

640?wx_fmt=png


当涉及到提供新服务时,需要对一些性能做出预测。估计有多少内存来提供功能;大致了解了运行函数并退出所需的时间,无服务器架构允许我们快速部署。

 

如果我们预测和估计错误呢?内存不足或将时间限制设置的较低,就会出现大量错误。亚马逊网络服务不会出现这些问题,这是一种责任。同时AWS为我们提供了一些工具和方法,允许我们自己检查这些问题。

 

本文我们将研究如何使用AWS CloudWatch来更好地理解Lambda函数——实际使用了多少内存和执行时间。在此基础上,可以调整功能,以平衡成本问题,同时不降低性能。


AWS CloudWatch

 

早在去年11月,AWS就发布了CloudWatch。几乎所有的AWS服务都会创建某种类型的日志,这些日志通常包含许多关于服务器的有价值的信息。

 

该版本发布之前,需要几跳地址获取这些数据并将其可视化。虽然可以对日志组执行基本查询,但很多时候,必须将日志转存到能够查询的地方。

 

CloudWatch 避免了这样的负担,可以直接查询所感兴趣的数据点。例如,查询函数实际使用了多少内存,针对各种不同的AWS服务编写自己的定制查询。这对于生成特定服务器的报告和可视化非常有用。

 

我们下面来探索CloudWatch如何优化分配的内存,从而节省一点钱。注意,CloudWatch 中运行查询的价格是每GB扫描数据0.005美元,所以要注意查询的数据量。

 

举个例子——AWS Lambda函数

 

我们首先假设一个实际应用的场景,已经过分分配了Lambda函数的内存。

 

640?wx_fmt=png


我编写了一个Lambda函数自动创建MailChimp活动。该函数通过查询一个谷歌列表来获取一周的文章,然后使用电子邮件模板创建MailChimp活动。

 

这个函数一周运行一次,所以不会耗尽资源。但我们假设这个函数每周被调用10,000次。想象一下,这样跟得上吗? 下面开始详细讨论。

 

首先看看为这个连续不断的函数准备了多少内存,可以通过serverless.yml文件来看到。

 

有趣的是,我们在这个YAML文件中没有看到任何有关内存的内容,为什么?这意味着使用了无服务器框架的默认内存值,为这个函数提供了1024 MB的内存。

 

对于读取列表并调用MailChimp API的函数,我们真的需要这些内存吗?也许吧,但实际上我们可以通过使用CloudWatch得到答案。

 

确定超配的内存

 

CloudWatch 附带了许多开箱即用的示例查询。您可以使用它们查看最近的CloudTrail事件、查询VPC流日志、查看Route53区域正在接收多少请求等等。

 

这里感兴趣的是超配给内存的查询。我们可以通过登录到AWS控制台,然后进入CloudWatch来查询结果。一旦进入CloudWatch服务,我们就可以选择日志下面的链接。

进入CloudWatch 页面后,我们可以选择Sample Queries下拉菜单,然后打开Lambda选项。在这里,我们看到“Determine the amount of overprovisioned memory sample query” (查询过量内存的数量),然后选择它。如下所示:

 

640?wx_fmt=png


查询的结果有已分配的内存、最小使用量、平均使用量、最大使用量,并计算内存的过度分配情况。在选择的时间段内(默认为1小时)进行计算。

 

在查询编辑器中,我们还看到一个下拉菜单,它允许我们选择查询的AWS资源。

 

640?wx_fmt=png


我们看到这个函数过去四周运行了四次。假设这个函数每周被调用10,000次,函数在过去4周内被调用了40000次。可以得出以下结果。

 

640?wx_fmt=png


我们所分配的内存是976 MB,但是平均内存使用量只有95 MB,这意味着函数被超额分配了881 MB。只使用提供的内存的9%意味着什么呢?

 

最简单的答案是,我们在浪费资源,因此也在浪费金钱。让我们来看看价格细分。

 

Lambda函数提供1024 MB内存,每次调用大约需要7000毫秒执行。对于每周10,000次调用,我们的成本分解如下所示。

 

640?wx_fmt=png


以每GB每秒0.00001667美元的速率,我们得到的总成本为:

 

640?wx_fmt=png


在此计算中,还有几美分需要考虑到请求的成本,但是在这个场景中,这些成本非常小。

老实说,一个月运行4万次的函数每月5美元似乎不算太糟。实际上不太值得您花时间优化它,但是为了方便讨论,假设将内存更改为128mb,这将如何影响我们的成本?

 

640?wx_fmt=png


以每GB每秒0.00001667美元的速率,我们得到的总成本为:

 

640?wx_fmt=png


哇,现在比1024 MB内存时便宜88%。好吧,这有什么大不了的,每个月只能省下4美元,可能不会对你的AWS账单产生明显的影响。

 

但是请记住,当我们使用无服务器框架来提供Lambda函数时,1024 MB是提供给它的默认内存。那么4-5名开发人员组成的团队需要将该Lambda函数迁移到无服务器架构时,情况会怎样? 他们是否对实际需要的内存做了足够分析?也许会吧,也许不会。

 

进一步假设有300个Lambda函数,它们的性能和我们的例子相似。当我们的功能供大于求时,无服务器架构的成本将是每月4.66 x 300美元是1398.00美元。如果我们对内存进行调优,成本会显著降低,每月0.58 x 300美元是174美元。对于如此小的变化,差异是巨大的。

 

其他要点

 

对于上述示例,我们将内存从1024 MB减少到128 MB,并且函数的性能没有改变,函数仍然在7秒内完成了其功能。

 

然而情况并不总是这样。在某些运行情况下,将所分配的内存更改88%将会更改函数执行所需的时间。如果减少内存导致增加6倍的时间来完成,那么反而影响了性能和效率。

 

另一方面,增加内存分配可以更快的调用。对于上述示例函数,我们可以将内存从1024 MB更改为2048 MB,并将执行时间从7秒降低到3.5秒。这意味着我们可以将函数的执行时间缩短一半,而不需要比1024 MB时多花一分钱。

 

要记住的是,可以根据需要对内存分配进行微调。超过900 MB的过剩内存,明显说明您可以缩减内存。能否调整到128mb可能会根据具体情况而定。

 

结论

 

Serverless是一种非常强大的体系结构,可以带来很多好处。节省成本,让开发人员将精力放在业务驱动而不是服务器上。但是,如果没有正确地配置和调优函数,成本效益就会很快消失。

 

要对分配给函数的内存进行调优,CloudWatch 是一个很好的方法。正如在示例函数中看到的,我们可以将函数调优到它实际使用的值(节省88%)。内存是成本控制的一个杠杆。另外,它还能以同样的成本获得性能优势。


640?wx_fmt=png


640?wx_fmt=jpeg


福利

扫描添加小编微信,备注“姓名+公司职位”,加入【云计算学习交流群】,和志同道合的朋友们共同打卡学习!


640?wx_fmt=jpeg


推荐阅读:

  • 图解分布式架构的发展和演进 | 技术干货

  • Docker 系列学习文章 | 什么是容器云?

  • 任正非:华为海思芯片不是“备胎”!

  • 揭秘清华 AI 学堂班:姚期智担任首席教授,2019 年首批招收 30 人

  • Google Android 向华为“闭源”!华为手机迎来至暗时刻!

  • "两年前我对区块链的了解为零, 两年后我成了工程师" 我是如何得到第一份工作的?

  • 《使女的故事》大火,AI是背后最大推手?


640?wx_fmt=png真香,朕在看了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/523676.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记录greater和less

引言 本文针对C11中greater和less做简单的记录。本文使用visual studio 2017下控制台输出程序可以直接使用c11特性。 内部实现 查看greater和less会看到其下面的实现; template<class _Ty void>struct greater{ // functor for operator>_CXX17_DEPRECATE_ADAPTO…

操作标签

如果标签打错了&#xff0c;也可以删除&#xff1a; $ git tag -d v0.1 Deleted tag v0.1 (was f15b0dd)因为创建的标签都只存储在本地&#xff0c;不会自动推送到远程。所以&#xff0c;打错的标签可以在本地安全删除。 如果要推送某个标签到远程&#xff0c;使用命令git pu…

ARM到底是一家什么样的公司?

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;作者&#xff1a;小枣君转自&#xff1a;鲜枣课堂这两天&#xff0c;一家叫做ARM的公司…

Visual Studio中输入英文会在字母之间自动增加空格

现象 不小心按了什么键之后字母之间增加了空格&#xff0c;如下面&#xff1a; ![在这里插入图片描述](https://img-blog.csdnimg.cn/b211b973b9c8470fae4402161ddb3935.png 解决办法 针对上面图片中显示的这种英文字母之间出现空格&#xff0c;是输入法出现了问题。恢复的…

Git 文件重命名

重命名 git mv oldFileName newFileName git commit -am"修改记录说明"

C中指针与成员变量生命周期的示例

引言 本文针对于碰到的指针做一些记录。详见下面的示例。 示例一 返回char类型指针&#xff0c;使用局部静态数组。 #include <stdlib.h>char * GetTestMemory(void) {static char p[] "hello world";printf("src%x\n",p);//数组首地址printf(&…

从Spark Streaming到Apache Flink: 实时数据流在爱奇艺的演进 | 技术头条

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;作者&#xff1a;陈越晨转自&#xff1a;高可用架构本文将为大家介绍Apache Flink在爱…

Git 添加和提交组合命令

组合命令&#xff1a; git commit -am"修改记录说明"单条命令&#xff1a; git add 文件名 git commit -m"修改记录说明"

Storm精华问答 | Storm的配置需要注意什么问题?

戳蓝字“CSDN云计算”关注我们哦&#xff01;Apache Storm是一个分布式实时大数据处理系统。Storm设计用于在容错和水平可扩展方法中处理大量数据。它是一个流数据框架&#xff0c;具有最高的摄取率。今天&#xff0c;我们就挑一些Storm的安装配置问题来看看吧。1Q&#xff1a;…

ifndef与#program once的区别

概述 平时我们为了防止头文件的重复包含&#xff0c;会使用#ifndef或者#program once。这里记录一下它们之间的区别。 区别 ifndef需要定义宏名&#xff0c;且可以跨平台使用&#xff0c;#program once却是windows专用的&#xff1b;ifndef相对于#program once而言&#xff…

这可能是把策略模式讲的最通俗易懂得文章了!

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;周末无事&#xff0c;窝在家里面看《权力的游戏第八季》&#xff0c;看的很是津津有味…

忽略特殊文件

有些时候&#xff0c;你必须把某些文件放到Git工作目录中&#xff0c;但又不能提交它们&#xff0c;比如保存了数据库密码的配置文件啦&#xff0c;等等&#xff0c;每次git status都会显示Untracked files ...&#xff0c;有强迫症的童鞋心里肯定不爽。 好在Git考虑到了大家的…

C++中动态数组实现

实现动态数组动态数组示例代码运行环境运行效果动态数组 动态数组Vector可以动态扩展内存&#xff0c;其采用连续的内存空间&#xff0c;当内存空间不足&#xff0c;便以原来的容量的2倍或者1.5倍成倍的扩展&#xff0c;将原有的数组元素拷贝到新分配的内存空间中&#xff0c;…

华为面试改革,我们该怎么跟进?

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;近日&#xff0c;华为轮值董事长徐直军撰写了《关于公司高端精英类、软件类人才面试方…

使用GitHub

我们一直用GitHub作为免费的远程仓库&#xff0c;如果是个人的开源项目&#xff0c;放到GitHub上是完全没有问题的。其实GitHub还是一个开源协作社区&#xff0c;通过GitHub&#xff0c;既可以让别人参与你的开源项目&#xff0c;也可以参与别人的开源项目。 在GitHub出现以前…

C++中单链表的实现

单链表的实现单链表示例代码开发环境运行结果单链表 链表内存空间不一定连续&#xff0c;其扩展性较好。多余的不多说了。该文主要记录单链表的实现&#xff0c;该单链表含有一个非空的头节点。链表的操作实际上是对其指针域与数据域的操作。 示例代码 直接上代码&#xff1…

使用说明_预拌混凝土使用说明

尊敬的客户感谢您使用我公司的混凝土。为保证您的工程质量&#xff0c;我公司根据配制的混凝土性能&#xff0c;参与《预拌混凝土》GB/T14902-2003、混凝土施工有关标准以及工程施工过程中常见问题制定出本说明书和技术交底。敬请认真阅读并按本说明书和技术交底等规定的有关操…

【算法精讲】分享一道很不错的算法题

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;作者&#xff1a;帅地转自&#xff1a;苦逼的码农分享一道leetcode上的题&#xff0c;…

C++中实现Stack

栈的实现栈示例代码开发环境运行结果栈 栈本着先进后出的原则&#xff0c;来存取数据。作为数据结构中的一种&#xff0c;这里不多介绍相关栈。仅以此文记录C中栈的实现&#xff0c;可帮助提升编程能力与对栈的理解。 示例代码 直接上代码。 SeqStack.h #pragma once#defin…

使用码云

使用GitHub时&#xff0c;国内的用户经常遇到的问题是访问速度太慢&#xff0c;有时候还会出现无法连接的情况&#xff08;原因你懂的&#xff09;。 如果我们希望体验Git飞一般的速度&#xff0c;可以使用国内的Git托管服务——码云&#xff08;gitee.com&#xff09;。 和G…