一、背景介绍
 
       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 获取相应操作权限。
环境部署
 
        
        - 安装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
 
         
        
        - 编写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
 
         
        
        - 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
 
         
       此过程需要几分钟完成。
 
       通过控制台确定所有资源已正常运行。如下图:
 
       
 
       
 
       
 
        
        - 测试验证
获取api gateway endpoint
 
        
        aws cloudformation describe-stacks --stack-name sam-cardata-test --query 'Stacks[0].Outputs[0].OutputValue' --region us-west-2
 
         
        
       模拟发送数据,验证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)
 
        
        
         
          
          | 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
 
        
        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/
 
       本篇作者