使用 Graviton 2 优化 Serverless 车联网架构

0
0
{"value":"### **一、背景介绍**\n\nAmazon Graviton 由 Amazon Web Services 基于64 位 Arm Neoverse N1 内核定制,为在 Amazon 计算资源中运行的工作负载提供更高性价比运行环境。与当前这一代基于 x86 的实例相比,基于 Graviton 2 的实例为各种工作负载(包括应用程序服务器、微服务、高性能计算、EDA、游戏、开源数据库和内存中的缓存)提供高达 40% 的性价比提升。除了基于 x86 [Amazon EC2 ](https://aws.amazon.com/cn/ec2/?trk=cndc-detail)实例外,Amazon Lambda 现在还允许您配置新的和现有的函数在基于 Arm 的 Amazon Graviton 2 处理器上运行。使用此处理器架构选项,您可以获得高达34%的性价比提升。\n\n在汽车行业,Amazon 发布了针对车联领域的 Amazon 联网汽车解决方案架构,有许多客户也借助该方案基于 Amazon 的无服务化服务的优势来快速高效的构建自己的车联网应用。除高可用,高性能外,在成本方面 Amazon 也致力于持续为客户优化成本,本文主要以某客户真实场景为背景,着重介绍如何在 Lambda 中使用 Amazon Graviton 2 进一步优化车辆网应用的成本。\n\n### **二、环境部署测试**\n\n![image.png](https://dev-media.amazoncloud.cn/cd09fc7225e442d08ebc3c1aa87f05fa_image.png)\n\n环境说明:\n\n- 如上图通过 Amazon SAM 构建一个相似的车联网数据收集场景。\n- API Gateway 负责数据接入,Lambda 函数把接受数据并写入到 DynamoDB 中。\n- Amazon Lambda 函数分别运行在 x86 和 arm64 Architecture 中,进行对比测试。\n- Lambda 函数使用 python 3.9 开发,内存配置为 256M。\n- 本环境在 us-east-2 区域进行构建,使用 EC2 IAM role 获取相应操作权限。\n\n环境部署\n\n1. 安装 SAM\n\n```\\nsudo mkdir /worktest\\ncd /worktest\\nwget https://github.com/aws/aws-sam-cli/releases/latest/download/aws-sam-cli-linux-x86_64.zip\\nunzip aws-sam-cli-linux-x86_64.zip -d sam-installation\\nsudo ./sam-installation/install\\n```\n\n2. 编写 Lamdba 函数及环境模板\n\n```\\nmkdir ./python-lambda\\ntouch lambda.py\\n#lambda.py\\nimport json\\nimport uuid\\nimport boto3\\ndynamodb = boto3.resource('dynamodb',region_name='us-west-2')\\ntable = dynamodb.Table('cardata')\\ndef create(event, context):\\n data = json.loads(event['body'])\\n item = {\\n 'id': str(uuid.uuid1()),\\n 'datatype': data['datatype'],\\n 'datavalue': data['datavalue'],\\n }\\n # write the db\\n table.put_item(Item=item)\\n # create a response\\n response = {\\n \\"statusCode\\": 201,\\n \\"body\\": json.dumps(item)\\n }\\nreturn response\\ntouch template.yaml\\n# template.yaml\\n AWSTemplateFormatVersion: '2010-09-09'\\nTransform: AWS::Serverless-2016-10-31\\nDescription: AWS Serverless Micronaut API\\nResources:\\n PythonFunction:\\n Type: AWS::Serverless::Function\\n Properties:\\n CodeUri: python-lambda/ \\n Handler: lambda.create\\n Runtime: python3.9\\n MemorySize: 256\\n Tracing: Active\\n Policies:\\n - DynamoDBCrudPolicy:\\n TableName: !Ref BooksTable\\n Timeout: 30\\n Events:\\n CreateBook:\\n Type: Api\\n Properties:\\n Path: /py-x86/cardata\\n Method: post\\n\\n\\n PythonARMFunction:\\n Type: AWS::Serverless::Function\\n Properties:\\n CodeUri: python-lambda/\\n Handler: lambda.create\\n Runtime: python3.9\\n MemorySize: 256\\n Tracing: Active\\n Architectures: # 设置为arm 架构\\n - arm64\\n Policies:\\n - DynamoDBCrudPolicy:\\n TableName: !Ref BooksTable\\n Timeout: 30\\n Events:\\n CreateBook:\\n Type: Api\\n Properties:\\n Path: /py-arm/cardata\\n Method: post\\nBooksTable:\\n Type: AWS::DynamoDB::Table\\n Properties:\\n TableName: cardata\\n AttributeDefinitions:\\n - AttributeName: id\\n AttributeType: S\\n KeySchema:\\n - AttributeName: id\\n KeyType: HASH\\n BillingMode: PAY_PER_REQUEST\\nOutputs:\\n MyServiceApi:\\n Description: URL for application\\n Value: !Sub 'https://\${ServerlessRestApi}.execute-api.\${AWS::Region}.amazonaws.com/Prod'\\n Export:\\n Name: MyServiceApiUrl\\n```\n\n3. SAM 部署\n\n创建 S3 bucket\n\n```\\ncreate-bucket --bucket lei-lambda-test --region us-west-2 --create-bucket-configuration LocationConstraint=us-west-2\\n```\n\n部署 SAM 模板\n\n```\\nsam deploy -t template.yaml --no-confirm-changeset --no-fail-on-empty-changeset --stack-name sam-cardata-test --s3-bucket lei-lambda-test --capabilities CAPABILITY_IAM\\n```\n\n此过程需要几分钟完成。\n\n通过控制台确定所有资源已正常运行。如下图:\n\n![image.png](https://dev-media.amazoncloud.cn/b67b573e14ec43e1ac4a1bf89ce25be7_image.png)\n\n![image.png](https://dev-media.amazoncloud.cn/3021ff10f23041dd9d8d56166eda3f32_image.png)\n\n![image.png](https://dev-media.amazoncloud.cn/fe7f5cc5a2a742c9994b4d90d8c38b2f_image.png)\n\n4. 测试验证\n\n获取api gateway endpoint\n\n```\\naws cloudformation describe-stacks --stack-name sam-cardata-test --query 'Stacks[0].Outputs[0].OutputValue' --region us-west-2\\n```\n\n- **Cold start test**\n\n模拟发送数据,验证 Lamdba 函数基于 x86 架构的链路响应\n\n```\\ncurl -X POST -w 'Total: %{time_total}s' https://*.execute-api.us-west-2.amazonaws.com/Prod/py-x86/cardata -d '{\\"datatype\\":\\"hdmap\\",\\"datavalue\\":\\"beijingdata\\"}'\\n```\n\n**Total: 0.627213s**\n\n模拟发送数据,验证 Lamdba 函数基于 arm 架构的链路响应\n\n```\\ncurl -X POST -w 'Total: %{time_total}s' https://*.execute-api.us-west-2.amazonaws.com/Prod/py-arm/cardata -d '{\\"datatype\\":\\"alarm\\",\\"datavalue\\":\\"dmsalarm\\"}'\\n```\n\n**Total: 0.551996s**\n\n另外也可以通过 X-RAY 更加直观的查看两种架构的响应情况。\n\n![image.png](https://dev-media.amazoncloud.cn/bf515611b38847b586925097f44c0378_image.png)\n::: hljs-center\n\n(Lambda x86)\n\n:::\n\n![image.png](https://dev-media.amazoncloud.cn/c733211e0534435498371c180a5c21d5_image.png)\n::: hljs-center\n\n(Lambda arm)\n\n:::\n\n- **Duration test**\n\n![image.png](https://dev-media.amazoncloud.cn/a398ffdd88444b22befade5944821f62_image.png)\n\n(Lambda x86)\n\n![image.png](https://dev-media.amazoncloud.cn/2c66d7572df34c8a9cc2a96a9135a8dc_image.png)\n\n(Lambda arm)\n\n- **Apache Benchmark 并发测试**\n\n安装 apache benchmark\n\n```\\nyum install httpd-tools\\n\\ntouch data.json\\n{\\"datatype\\":\\"warning\\",\\"datavalue\\":\\"DMSdata\\"}\\n\\nab -p data.json -c 100 -n 1000 https://*.execute-api.us-west-2.amazonaws.com/Prod/py-x86/cardata\\n```\n\n![image.png](https://dev-media.amazoncloud.cn/2829623257ed400b9e1be0cba3da416f_image.png)\n\nLambda x86 并发数为 100 时,服务器平均请求等待时间为 1.873ms\n\n```\\nab -p data.json -c 100 -n 1000 https://*.execute-api.us-west-2.amazonaws.com/Prod/py-arm/cardata\\n```\n\n![image.png](https://dev-media.amazoncloud.cn/fc4c612ba71a4dcaa9423849e9539e34_image.png)\n\nLambda arm 并发数为 100 时,服务器平均请求等待时间为 1.498ms\n\n### **三、总结**\n\n我们可以看到本场景中同样的条件下,由 Graviton2 提供支持的 Lambda 函数具有更好的性能,函数可以更高效地运行;另外使用 Arm/Graviton2 架构的函数,持续时间费用比 x86 的当前定价低 20%,使用预置并发的函数的持续时间费用也可减少 20%。因此,由 Graviton2 提供支持的 Lambda 函数可以降低 20% 的成本的同时提供更高的性能提升,从而为客户提供了更完善的用户体验和更低的成本节约。\n\n### **四、参考资料**\n\n[https://github.com/aws/aws-sam-cli/releases/](https://github.com/aws/aws-sam-cli/releases/)\n\n[https://aws.amazon.com/jp/blogs/aws/aws-lambda-functions-powered-by-aws-graviton2-processor-run-your-functions-on-arm-and-get-up-to-34-better-price-performance/\\n](https://aws.amazon.com/jp/blogs/aws/aws-lambda-functions-powered-by-aws-graviton2-processor-run-your-functions-on-arm-and-get-up-to-34-better-price-performance/)\n[https://aws.amazon.com/cn/lambda/pricing/](https://aws.amazon.com/cn/lambda/pricing/)\n\n### **本篇作者**\n\n![image.png](https://dev-media.amazoncloud.cn/4710516308854d608e2659c0c8b0d27b_image.png)\n\n#### **梁战雷**\n\nAmazon 解决方案架构师,具有超过13年的运维工作经验,在微服务,容器,devops 等云原生领域有丰富的项目落地实施经验,现在主要负责企业级客户的上云推广及支持工作。","render":"<h3><a id=\\"_0\\"></a><strong>一、背景介绍</strong></h3>\\n<p>Amazon Graviton 由 Amazon Web Services 基于64 位 Arm Neoverse N1 内核定制,为在 Amazon 计算资源中运行的工作负载提供更高性价比运行环境。与当前这一代基于 x86 的实例相比,基于 Graviton 2 的实例为各种工作负载(包括应用程序服务器、微服务、高性能计算、EDA、游戏、开源数据库和内存中的缓存)提供高达 40% 的性价比提升。除了基于 x86 Amazon EC2 实例外,Amazon Lambda 现在还允许您配置新的和现有的函数在基于 Arm 的 Amazon Graviton 2 处理器上运行。使用此处理器架构选项,您可以获得高达34%的性价比提升。</p>\n<p>在汽车行业,Amazon 发布了针对车联领域的 Amazon 联网汽车解决方案架构,有许多客户也借助该方案基于 Amazon 的无服务化服务的优势来快速高效的构建自己的车联网应用。除高可用,高性能外,在成本方面 Amazon 也致力于持续为客户优化成本,本文主要以某客户真实场景为背景,着重介绍如何在 Lambda 中使用 Amazon Graviton 2 进一步优化车辆网应用的成本。</p>\n<h3><a id=\\"_6\\"></a><strong>二、环境部署测试</strong></h3>\\n<p><img src=\\"https://dev-media.amazoncloud.cn/cd09fc7225e442d08ebc3c1aa87f05fa_image.png\\" alt=\\"image.png\\" /></p>\n<p>环境说明:</p>\n<ul>\\n<li>如上图通过 Amazon SAM 构建一个相似的车联网数据收集场景。</li>\n<li>API Gateway 负责数据接入,Lambda 函数把接受数据并写入到 DynamoDB 中。</li>\n<li>Amazon Lambda 函数分别运行在 x86 和 arm64 Architecture 中,进行对比测试。</li>\n<li>Lambda 函数使用 python 3.9 开发,内存配置为 256M。</li>\n<li>本环境在 us-east-2 区域进行构建,使用 EC2 IAM role 获取相应操作权限。</li>\n</ul>\\n<p>环境部署</p>\n<ol>\\n<li>安装 SAM</li>\n</ol>\\n<pre><code class=\\"lang-\\">sudo mkdir /worktest\\ncd /worktest\\nwget https://github.com/aws/aws-sam-cli/releases/latest/download/aws-sam-cli-linux-x86_64.zip\\nunzip aws-sam-cli-linux-x86_64.zip -d sam-installation\\nsudo ./sam-installation/install\\n</code></pre>\\n<ol start=\\"2\\">\\n<li>编写 Lamdba 函数及环境模板</li>\n</ol>\\n<pre><code class=\\"lang-\\">mkdir ./python-lambda\\ntouch lambda.py\\n#lambda.py\\nimport json\\nimport uuid\\nimport boto3\\ndynamodb = boto3.resource('dynamodb',region_name='us-west-2')\\ntable = dynamodb.Table('cardata')\\ndef create(event, context):\\n data = json.loads(event['body'])\\n item = {\\n 'id': str(uuid.uuid1()),\\n 'datatype': data['datatype'],\\n 'datavalue': data['datavalue'],\\n }\\n # write the db\\n table.put_item(Item=item)\\n # create a response\\n response = {\\n &quot;statusCode&quot;: 201,\\n &quot;body&quot;: json.dumps(item)\\n }\\nreturn response\\ntouch template.yaml\\n# template.yaml\\n AWSTemplateFormatVersion: '2010-09-09'\\nTransform: AWS::Serverless-2016-10-31\\nDescription: AWS Serverless Micronaut API\\nResources:\\n PythonFunction:\\n Type: AWS::Serverless::Function\\n Properties:\\n CodeUri: python-lambda/ \\n Handler: lambda.create\\n Runtime: python3.9\\n MemorySize: 256\\n Tracing: Active\\n Policies:\\n - DynamoDBCrudPolicy:\\n TableName: !Ref BooksTable\\n Timeout: 30\\n Events:\\n CreateBook:\\n Type: Api\\n Properties:\\n Path: /py-x86/cardata\\n Method: post\\n\\n\\n PythonARMFunction:\\n Type: AWS::Serverless::Function\\n Properties:\\n CodeUri: python-lambda/\\n Handler: lambda.create\\n Runtime: python3.9\\n MemorySize: 256\\n Tracing: Active\\n Architectures: # 设置为arm 架构\\n - arm64\\n Policies:\\n - DynamoDBCrudPolicy:\\n TableName: !Ref BooksTable\\n Timeout: 30\\n Events:\\n CreateBook:\\n Type: Api\\n Properties:\\n Path: /py-arm/cardata\\n Method: post\\nBooksTable:\\n Type: AWS::DynamoDB::Table\\n Properties:\\n TableName: cardata\\n AttributeDefinitions:\\n - AttributeName: id\\n AttributeType: S\\n KeySchema:\\n - AttributeName: id\\n KeyType: HASH\\n BillingMode: PAY_PER_REQUEST\\nOutputs:\\n MyServiceApi:\\n Description: URL for application\\n Value: !Sub 'https://\${ServerlessRestApi}.execute-api.\${AWS::Region}.amazonaws.com/Prod'\\n Export:\\n Name: MyServiceApiUrl\\n</code></pre>\\n<ol start=\\"3\\">\\n<li>SAM 部署</li>\n</ol>\\n<p>创建 S3 bucket</p>\n<pre><code class=\\"lang-\\">create-bucket --bucket lei-lambda-test --region us-west-2 --create-bucket-configuration LocationConstraint=us-west-2\\n</code></pre>\\n<p>部署 SAM 模板</p>\n<pre><code class=\\"lang-\\">sam deploy -t template.yaml --no-confirm-changeset --no-fail-on-empty-changeset --stack-name sam-cardata-test --s3-bucket lei-lambda-test --capabilities CAPABILITY_IAM\\n</code></pre>\\n<p>此过程需要几分钟完成。</p>\n<p>通过控制台确定所有资源已正常运行。如下图:</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/b67b573e14ec43e1ac4a1bf89ce25be7_image.png\\" alt=\\"image.png\\" /></p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/3021ff10f23041dd9d8d56166eda3f32_image.png\\" alt=\\"image.png\\" /></p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/fe7f5cc5a2a742c9994b4d90d8c38b2f_image.png\\" alt=\\"image.png\\" /></p>\n<ol start=\\"4\\">\\n<li>测试验证</li>\n</ol>\\n<p>获取api gateway endpoint</p>\n<pre><code class=\\"lang-\\">aws cloudformation describe-stacks --stack-name sam-cardata-test --query 'Stacks[0].Outputs[0].OutputValue' --region us-west-2\\n</code></pre>\\n<ul>\\n<li><strong>Cold start test</strong></li>\\n</ul>\n<p>模拟发送数据,验证 Lamdba 函数基于 x86 架构的链路响应</p>\n<pre><code class=\\"lang-\\">curl -X POST -w 'Total: %{time_total}s' https://*.execute-api.us-west-2.amazonaws.com/Prod/py-x86/cardata -d '{&quot;datatype&quot;:&quot;hdmap&quot;,&quot;datavalue&quot;:&quot;beijingdata&quot;}'\\n</code></pre>\\n<p><strong>Total: 0.627213s</strong></p>\\n<p>模拟发送数据,验证 Lamdba 函数基于 arm 架构的链路响应</p>\n<pre><code class=\\"lang-\\">curl -X POST -w 'Total: %{time_total}s' https://*.execute-api.us-west-2.amazonaws.com/Prod/py-arm/cardata -d '{&quot;datatype&quot;:&quot;alarm&quot;,&quot;datavalue&quot;:&quot;dmsalarm&quot;}'\\n</code></pre>\\n<p><strong>Total: 0.551996s</strong></p>\\n<p>另外也可以通过 X-RAY 更加直观的查看两种架构的响应情况。</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/bf515611b38847b586925097f44c0378_image.png\\" alt=\\"image.png\\" /></p>\n<div class=\\"hljs-center\\">\\n<p>(Lambda x86)</p>\n</div>\\n<p><img src=\\"https://dev-media.amazoncloud.cn/c733211e0534435498371c180a5c21d5_image.png\\" alt=\\"image.png\\" /></p>\n<div class=\\"hljs-center\\">\\n<p>(Lambda arm)</p>\n</div>\\n<ul>\\n<li><strong>Duration test</strong></li>\\n</ul>\n<p><img src=\\"https://dev-media.amazoncloud.cn/a398ffdd88444b22befade5944821f62_image.png\\" alt=\\"image.png\\" /></p>\n<p>(Lambda x86)</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/2c66d7572df34c8a9cc2a96a9135a8dc_image.png\\" alt=\\"image.png\\" /></p>\n<p>(Lambda arm)</p>\n<ul>\\n<li><strong>Apache Benchmark 并发测试</strong></li>\\n</ul>\n<p>安装 apache benchmark</p>\n<pre><code class=\\"lang-\\">yum install httpd-tools\\n\\ntouch data.json\\n{&quot;datatype&quot;:&quot;warning&quot;,&quot;datavalue&quot;:&quot;DMSdata&quot;}\\n\\nab -p data.json -c 100 -n 1000 https://*.execute-api.us-west-2.amazonaws.com/Prod/py-x86/cardata\\n</code></pre>\\n<p><img src=\\"https://dev-media.amazoncloud.cn/2829623257ed400b9e1be0cba3da416f_image.png\\" alt=\\"image.png\\" /></p>\n<p>Lambda x86 并发数为 100 时,服务器平均请求等待时间为 1.873ms</p>\n<pre><code class=\\"lang-\\">ab -p data.json -c 100 -n 1000 https://*.execute-api.us-west-2.amazonaws.com/Prod/py-arm/cardata\\n</code></pre>\\n<p><img src=\\"https://dev-media.amazoncloud.cn/fc4c612ba71a4dcaa9423849e9539e34_image.png\\" alt=\\"image.png\\" /></p>\n<p>Lambda arm 并发数为 100 时,服务器平均请求等待时间为 1.498ms</p>\n<h3><a id=\\"_222\\"></a><strong>三、总结</strong></h3>\\n<p>我们可以看到本场景中同样的条件下,由 Graviton2 提供支持的 Lambda 函数具有更好的性能,函数可以更高效地运行;另外使用 Arm/Graviton2 架构的函数,持续时间费用比 x86 的当前定价低 20%,使用预置并发的函数的持续时间费用也可减少 20%。因此,由 Graviton2 提供支持的 Lambda 函数可以降低 20% 的成本的同时提供更高的性能提升,从而为客户提供了更完善的用户体验和更低的成本节约。</p>\n<h3><a id=\\"_226\\"></a><strong>四、参考资料</strong></h3>\\n<p><a href=\\"https://github.com/aws/aws-sam-cli/releases/\\" target=\\"_blank\\">https://github.com/aws/aws-sam-cli/releases/</a></p>\\n<p><a href=\\"https://aws.amazon.com/jp/blogs/aws/aws-lambda-functions-powered-by-aws-graviton2-processor-run-your-functions-on-arm-and-get-up-to-34-better-price-performance/\\" target=\\"_blank\\">https://aws.amazon.com/jp/blogs/aws/aws-lambda-functions-powered-by-aws-graviton2-processor-run-your-functions-on-arm-and-get-up-to-34-better-price-performance/<br />\\n</a><br />\\n<a href=\\"https://aws.amazon.com/cn/lambda/pricing/\\" target=\\"_blank\\">https://aws.amazon.com/cn/lambda/pricing/</a></p>\\n<h3><a id=\\"_234\\"></a><strong>本篇作者</strong></h3>\\n<p><img src=\\"https://dev-media.amazoncloud.cn/4710516308854d608e2659c0c8b0d27b_image.png\\" alt=\\"image.png\\" /></p>\n<h4><a id=\\"_238\\"></a><strong>梁战雷</strong></h4>\\n<p>Amazon 解决方案架构师,具有超过13年的运维工作经验,在微服务,容器,devops 等云原生领域有丰富的项目落地实施经验,现在主要负责企业级客户的上云推广及支持工作。</p>\n"}
目录
亚马逊云科技解决方案 基于行业客户应用场景及技术领域的解决方案
联系亚马逊云科技专家
亚马逊云科技解决方案
基于行业客户应用场景及技术领域的解决方案
联系专家
0
目录
关闭