使用 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 实例外,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
目录
关闭