一骑绝尘!使用 Amazon Graviton2 优化 Serverless 车联网架构

Serverless
亚马逊云科技
0
0
{"value":"#### **前言**\n\nAmazon Graviton2 基于 Arm Neoverse 内核定制,为在 Amazon 计算资源中运行的工作负载提供更高性价比运行环境。与当前这一代基于 x86 的实例相比,基于 Graviton2 的实例为各种工作负载(包括应用程序服务器、微服务、高性能计算、EDA、游戏、开源数据库和内存中的缓存)提供高达 40% 的性价比提升。除了基于 x86 Amazon EC2 实例外,Amazon Lambda 现在还允许您配置新的和现有的函数在基于 Arm 的 Graviton2 处理器上运行。使用此处理器架构选项,您可以获得高达 34% 的性价比提升。\n\n在汽车行业,亚马逊云科技发布了针对车联领域的联网汽车解决方案架构,有许多客户也借助该方案基于亚马逊云科技的无服务化服务的优势来快速高效地构建自己的车联网应用。除高可用,高性能外,在成本方面亚马逊云科技也致力于持续为客户优化成本,本文主要以某客户真实场景为背景,着重介绍如何在 Lambda 中使用亚马逊云科技 Graviton2 进一步优化车辆网应用的成本。\n\n了解更多联网汽车解决方案架构:[https://aws.amazon.com/cn/solutions/implementations/aws-connected-vehicle-solution/](https://aws.amazon.com/cn/solutions/implementations/aws-connected-vehicle-solution/)\n\n### **环境说明**\n![image.png](https://dev-media.amazoncloud.cn/b02b0b5420d1406fa21fff24d03cf108_image.png)\n- 如上图通过亚马逊云科技 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#### **1 安装SAM**\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/instal\n```\n#### **2 编写Lamdba 函数及环境模板**\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 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: MyServiceApiUr\n```\n#### **3 SAM部署**\n- **创建S3 bucket**\n```\ncreate-bucket --bucket lei-lambda-test --region us-west-2 --create-bucket-configuration LocationConstraint=us-west-2\n```\n- **部署SAM模板**\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![image.png](https://dev-media.amazoncloud.cn/13d57fdd99414460ae2d12c329a472e9_image.png)\n![image.png](https://dev-media.amazoncloud.cn/028deda562f445409e52411bf813b04f_image.png)\n![image.png](https://dev-media.amazoncloud.cn/5457b0366e154805bcfd452644ef5f78_image.png)\n#### **4 测试验证**\n```\naws cloudformation describe-stacks --stack-name sam-cardata-test --query 'Stacks[0].Outputs[0].OutputValue' --region us-west-2\n```\n- **Cold start test**\n模拟发送数据,验证 Lamdba 函数基于 x86 架构的链路响应:\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```\nTotal: 0.627213s\n\n模拟发送数据,验证 Lamdba 函数基于 arm 架构的链路响应:\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```\nTotal: 0.551996s\n\n另外也可以通过 X-RAY 更加直观地查看两种架构的响应情况。\n\n![image.png](https://dev-media.amazoncloud.cn/b06847522b2340c8aac96a1330511025_image.png)\n- **Duration test**\n\n![image.png](https://dev-media.amazoncloud.cn/7609d6c488a24122a5c8269bd0daa265_image.png)\n- **Apache Benchmark 并发测试**\n安装apache benchmark\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![image.png](https://dev-media.amazoncloud.cn/96473e0f16e34505933c9d9850d69578_image.png)\n\nLambda x86 并发数为100时,服务器平均请求等待时间为1.873ms\n\n![image.png](https://dev-media.amazoncloud.cn/1a8bacab55da449f9fc82042fc1cacb3_image.png)\n\nLambda arm 并发数为100时,服务器平均请求等待时间为1.498ms\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[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/](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**梁战雷**\n亚马逊云科技解决方案架构师,具有超过13年的运维工作经验,在微服务,容器,devops 等云原生领域有丰富的项目落地实施经验,现在主要负责企业级客户的上云推广及支持工作。\n\n\n[阅读原文](https://github.com/yuhuiaws/ML-study/tree/main/)","render":"<h4><a id=\"_0\"></a><strong>前言</strong></h4>\n<p>Amazon Graviton2 基于 Arm Neoverse 内核定制,为在 Amazon 计算资源中运行的工作负载提供更高性价比运行环境。与当前这一代基于 x86 的实例相比,基于 Graviton2 的实例为各种工作负载(包括应用程序服务器、微服务、高性能计算、EDA、游戏、开源数据库和内存中的缓存)提供高达 40% 的性价比提升。除了基于 x86 Amazon EC2 实例外,Amazon Lambda 现在还允许您配置新的和现有的函数在基于 Arm 的 Graviton2 处理器上运行。使用此处理器架构选项,您可以获得高达 34% 的性价比提升。</p>\n<p>在汽车行业,亚马逊云科技发布了针对车联领域的联网汽车解决方案架构,有许多客户也借助该方案基于亚马逊云科技的无服务化服务的优势来快速高效地构建自己的车联网应用。除高可用,高性能外,在成本方面亚马逊云科技也致力于持续为客户优化成本,本文主要以某客户真实场景为背景,着重介绍如何在 Lambda 中使用亚马逊云科技 Graviton2 进一步优化车辆网应用的成本。</p>\n<p>了解更多联网汽车解决方案架构:<a href=\"https://aws.amazon.com/cn/solutions/implementations/aws-connected-vehicle-solution/\" target=\"_blank\">https://aws.amazon.com/cn/solutions/implementations/aws-connected-vehicle-solution/</a></p>\n<h3><a id=\"_8\"></a><strong>环境说明</strong></h3>\n<p><img src=\"https://dev-media.amazoncloud.cn/b02b0b5420d1406fa21fff24d03cf108_image.png\" alt=\"image.png\" /></p>\n<ul>\n<li>如上图通过亚马逊云科技 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<h3><a id=\"_16\"></a><strong>环境部署</strong></h3>\n<h4><a id=\"1_SAM_17\"></a><strong>1 安装SAM</strong></h4>\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/instal\n</code></pre>\n<h4><a id=\"2_Lamdba__25\"></a><strong>2 编写Lamdba 函数及环境模板</strong></h4>\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 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: MyServiceApiUr\n</code></pre>\n<h4><a id=\"3_SAM_112\"></a><strong>3 SAM部署</strong></h4>\n<ul>\n<li><strong>创建S3 bucket</strong></li>\n</ul>\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<ul>\n<li><strong>部署SAM模板</strong></li>\n</ul>\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>此过程需要几分钟完成。<br />\n通过控制台确定所有资源已正常运行。如下图:<br />\n<img src=\"https://dev-media.amazoncloud.cn/13d57fdd99414460ae2d12c329a472e9_image.png\" alt=\"image.png\" /><br />\n<img src=\"https://dev-media.amazoncloud.cn/028deda562f445409e52411bf813b04f_image.png\" alt=\"image.png\" /><br />\n<img src=\"https://dev-media.amazoncloud.cn/5457b0366e154805bcfd452644ef5f78_image.png\" alt=\"image.png\" /></p>\n<h4><a id=\"4__126\"></a><strong>4 测试验证</strong></h4>\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><br />\n模拟发送数据,验证 Lamdba 函数基于 x86 架构的链路响应:</li>\n</ul>\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>Total: 0.627213s</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>Total: 0.551996s</p>\n<p>另外也可以通过 X-RAY 更加直观地查看两种架构的响应情况。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/b06847522b2340c8aac96a1330511025_image.png\" alt=\"image.png\" /></p>\n<ul>\n<li><strong>Duration test</strong></li>\n</ul>\n<p><img src=\"https://dev-media.amazoncloud.cn/7609d6c488a24122a5c8269bd0daa265_image.png\" alt=\"image.png\" /></p>\n<ul>\n<li><strong>Apache Benchmark 并发测试</strong><br />\n安装apache benchmark</li>\n</ul>\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/96473e0f16e34505933c9d9850d69578_image.png\" alt=\"image.png\" /></p>\n<p>Lambda x86 并发数为100时,服务器平均请求等待时间为1.873ms</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/1a8bacab55da449f9fc82042fc1cacb3_image.png\" alt=\"image.png\" /></p>\n<p>Lambda arm 并发数为100时,服务器平均请求等待时间为1.498ms</p>\n<h4><a id=\"_167\"></a><strong>总结</strong></h4>\n<p>本场景中同样的条件下,由 Graviton2 提供支持的 Lambda 函数具有更好的性能,函数可以更高效地运行;另外使用 Arm/Graviton2 架构的函数,持续时间费用比 x86 的当前定价低 20%,使用预置并发的函数的持续时间费用也可减少 20%。因此,由 Graviton2 提供支持的 Lambda 函数可以降低 20% 的成本的同时提供更高的性能提升,从而为客户提供了更完善的用户体验和更低的成本节约。</p>\n<p>了解更多相关信息:</p>\n<p><a href=\"https://github.com/aws/aws-sam-cli/releases/\" target=\"_blank\">https://github.com/aws/aws-sam-cli/releases/</a><br />\n<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/</a><br />\n<a href=\"https://aws.amazon.com/cn/lambda/pricing/\" target=\"_blank\">https://aws.amazon.com/cn/lambda/pricing/</a></p>\n<h5><a id=\"_176\"></a><strong>本篇作者</strong></h5>\n<p><strong>梁战雷</strong><br />\n亚马逊云科技解决方案架构师,具有超过13年的运维工作经验,在微服务,容器,devops 等云原生领域有丰富的项目落地实施经验,现在主要负责企业级客户的上云推广及支持工作。</p>\n<p><a href=\"https://github.com/yuhuiaws/ML-study/tree/main/\" target=\"_blank\">阅读原文</a></p>\n"}
目录
亚马逊云科技解决方案 基于行业客户应用场景及技术领域的解决方案
联系亚马逊云科技专家
亚马逊云科技解决方案
基于行业客户应用场景及技术领域的解决方案
联系专家
0
目录
关闭