亚马逊AWS官方博客

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

一、背景介绍

AWS Graviton 由 Amazon Web Services 基于64 位 Arm Neoverse N1 内核定制,为在 Amazon计算资源中运行的工作负载提供更高性价比运行环境。与当前这一代基于 x86 的实例相比,基于Graviton 2的实例为各种工作负载(包括应用程序服务器、微服务、高性能计算、EDA、游戏、开源数据库和内存中的缓存)提供高达 40% 的性价比提升。除了基于x86 Amazon EC2 实例外,Amazon Lambda现在还允许您配置新的和现有的函数在基于Arm的Amazon Graviton 2处理器上运行。使用此处理器架构选项,您可以获得高达34%的性价比提升。

在汽车行业,AWS发布了针对车联领域的AWS 联网汽车解决方案架构,有许多客户也借助该方案基于AWS的无服务化服务的优势来快速高效的构建自己的车联网应用。除高可用,高性能外,在成本方面AWS也致力于持续为客户优化成本,本文主要以某客户真实场景为背景,着重介绍如何在Lambda中使用AWS Graviton 2 进一步优化车辆网应用的成本。

二、环境部署测试

环境说明:

  • 如上图通过AWS SAM 构建一个相似的车联网数据收集场景。
  • API Gateway 负责数据接入,Lambda 函数把接受数据并写入到DynamoDB中。
  • Amazon Lambda函数分别运行在x86 和 arm64 Architecture中,进行对比测试。
  • Lambda 函数使用python 3.9 开发,内存配置为256M。
  • 本环境在us-east-2区域进行构建,使用EC2 IAM role 获取相应操作权限。

环境部署

  1. 安装SAM
sudo mkdir /worktest
cd /worktest
wget https://github.com/aws/aws-sam-cli/releases/latest/download/aws-sam-cli-linux-x86_64.zip
unzip aws-sam-cli-linux-x86_64.zip -d sam-installation
sudo ./sam-installation/install
  1. 编写Lamdba 函数及环境模板
mkdir ./python-lambda
touch lambda.py
#lambda.py
import json
import uuid
import boto3
dynamodb = boto3.resource('dynamodb',region_name='us-west-2')
table = dynamodb.Table('cardata')
def create(event, context):
    data = json.loads(event['body'])
    item = {
        'id': str(uuid.uuid1()),
        'datatype': data['datatype'],
        'datavalue': data['datavalue'],
    }
    # write the db
    table.put_item(Item=item)
    # create a response
    response = {
        "statusCode": 201,
        "body": json.dumps(item)
    }
return response
touch template.yaml
# template.yaml
       AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: AWS Serverless Micronaut API
Resources:
  PythonFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: python-lambda/  
      Handler: lambda.create
      Runtime: python3.9
      MemorySize: 256
      Tracing: Active
      Policies:
        - DynamoDBCrudPolicy:
            TableName: !Ref BooksTable
      Timeout: 30
      Events:
        CreateBook:
          Type: Api
          Properties:
            Path: /py-x86/cardata
            Method: post


          PythonARMFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: python-lambda/
      Handler: lambda.create
      Runtime: python3.9
      MemorySize: 256
      Tracing: Active
      Architectures:   # 设置为arm 架构
        - arm64
      Policies:
        - DynamoDBCrudPolicy:
            TableName: !Ref BooksTable
      Timeout: 30
      Events:
        CreateBook:
          Type: Api
          Properties:
            Path: /py-arm/cardata
            Method: post
BooksTable:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: cardata
      AttributeDefinitions:
        - AttributeName: id
          AttributeType: S
      KeySchema:
        - AttributeName: id
          KeyType: HASH
      BillingMode: PAY_PER_REQUEST
Outputs:
  MyServiceApi:
    Description: URL for application
    Value: !Sub 'https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod'
    Export:
      Name: MyServiceApiUrl
  1. SAM部署

创建S3 bucket

create-bucket --bucket lei-lambda-test --region us-west-2 --create-bucket-configuration LocationConstraint=us-west-2

部署SAM模板

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

此过程需要几分钟完成。

通过控制台确定所有资源已正常运行。如下图:

  1. 测试验证

获取api gateway endpoint

aws cloudformation describe-stacks --stack-name sam-cardata-test --query 'Stacks[0].Outputs[0].OutputValue' --region us-west-2
  • Cold start test

模拟发送数据,验证Lamdba函数基于x86架构的链路响应

curl -X POST -w 'Total: %{time_total}s'  https://*.execute-api.us-west-2.amazonaws.com/Prod/py-x86/cardata -d '{"datatype":"hdmap","datavalue":"beijingdata"}'

Total: 0.627213s

模拟发送数据,验证Lamdba函数基于arm架构的链路响应

curl -X POST -w 'Total: %{time_total}s'  https://*.execute-api.us-west-2.amazonaws.com/Prod/py-arm/cardata -d '{"datatype":"alarm","datavalue":"dmsalarm"}'

Total: 0.551996s

另外也可以通过X-RAY 更加直观的查看两种架构的响应情况。

(Lambda x86)

(Lambda arm)

  • Duration test
1 2 3 4 5 6 7 8 9 10
0.078070s 0.069882s 0.077301s 0.065671s 0.067726s 0.080177s 0.074370s 0.066984s 0.073227s 0.072684s

(Lambda x86)

1 2 3 4 5 6 7 8 9 10
0.073550s 0.073990s 0.068542s 0.062004s 0.089615s 0.060765s 0.065035s 0.062175s 0.085470s 0.079319s

(Lambda arm)

  • Apache Benchmark 并发测试

安装apache benchmark

yum install httpd-tools

touch data.json
{"datatype":"warning","datavalue":"DMSdata"}

ab -p data.json -c 100 -n 1000 https://*.execute-api.us-west-2.amazonaws.com/Prod/py-x86/cardata

Lambda x86 并发数为100时,服务器平均请求等待时间为1.873ms

ab -p data.json -c 100 -n 1000 https://*.execute-api.us-west-2.amazonaws.com/Prod/py-arm/cardata

Lambda arm 并发数为100时,服务器平均请求等待时间为1.498ms

三、总结

我们可以看到本场景中同样的条件下,由 Graviton2 提供支持的 Lambda 函数具有更好的性能,函数可以更高效地运行;另外使用 Arm/Graviton2 架构的函数,持续时间费用比 x86 的当前定价低 20%,使用预置并发的函数的持续时间费用也可减少 20%。因此,由 Graviton2 提供支持的 Lambda 函数可以降低 20% 的成本的同时提供更高的性能提升,从而为客户提供了更完善的用户体验和更低的成本节约。

四、参考资料

https://github.com/aws/aws-sam-cli/releases/

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/cn/lambda/pricing/

本篇作者

梁战雷

AWS解决方案架构师,具有超过13年的运维工作经验,在微服务,容器,devops等云原生领域有丰富的项目落地实施经验,现在主要负责企业级客户的上云推广及支持工作。