一、背景介绍
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/
本篇作者