Serverless小实验(一):对利用AWS中EFS文件系统lambda函数加载python依赖时间的测量

我心飞翔 分类:javascript

前言

在AWS平台上,可以利用自带的文件系统EFS在EC2实例里挂载文件系统,从而加载python的包或者其他文件,本文章会讨论如何将EFS挂载以及分析某些python依赖的加载时间以及影响它加载时间的一些因素。


提示:以下是本篇文章正文内容,下面案例可供参考

一、EFS挂载以及其他前置工作

参考文档:

  1. EFS文档
  2. Lambda函数文档
  3. EC2文档

创建lambda函数

import sys
import json
import time
def lambda_handler(event, context):
    start_time=time.time()
    print(start_time)
    sys.path.insert(0, '/mnt/test/tensorflow')
    #将挂载路径引入
    import tensorflow as tf
    #加载所需要的包
    # TODO implement
    end_time=time.time()
    download_time=end_time-start_time
    print(download_time)
    body={
        "message":"function time is",
        "input":download_time
    }
    return {
        'statusCode': 200,
        'body': json.dumps(body)
    }

 

VPC配置

所有 Lambda 函数都在默认的系统托管的 Virtual Private Cloud (VPC) 中安全运行。但是,您也可以将 Lambda 函数配置为访问自定义 VPC 中的资源。自定义 VPC 定义数据库、缓存实例或内部服务等资源的私有网络。

VPC配置需注意子网和安全组配置,子网需要和EC2在同一个子网中

如遇到有这样的情况,请在role策略中给role EC2 full access的权限

The provided execution role does not have permissions to call CreateNetworkInterface on EC2

EFS和挂载点配置

  1. 从lambda函数配置列表进入EFS文件系统,开启并选择python package,帮助我们创建一个python package
  2. 进入挂载点页面,点击链接,复制sudo mount命令行,将会帮我们在EC2里连接挂载点
  3. 进入EC2控制台,创建EC2实例,注意需选择linux系统,配置安全组选择现有安全组,和VPC保持一致。
  4. 等待审核,下载pem文件,创建EC2实例成功。
  5. 连接实例,注意在pem文件夹下打开终端,通过ssh连接到实例
  6. 在实例的/mnt文件夹下创建与EFS名称对应的挂载文件夹,输入sudo mount命令行,即可成功挂载文件夹
  7. 文件夹下存在tensorflow和anaconda等默认文件,即可确认挂载成功

通过SSH连接到实例

常见其它问题

函数运行时间超时

  1. import包在handle函数外引起的,运行时间过长
  2. 超时时间默认为3秒,可以改为1分钟甚至更长
  3. 分配的内存过小,默认分配128M内存,对于tensorflow等包来说,需要500M以上的内存

二、常用包在EFS文件系统下引入的延迟表现

测试tensorflow,研究它并发调用性能

并发测试tensorflow

  1. 测试100次

纵坐标表示测试编号,横坐标表示时间,单位为秒
红色为函数运行时间,蓝色是总运行时间
Serverless小实验(一):对利用AWS中EFS文件系统lambda函数加载python依赖时间的测量
2. 测试200次
在这里插入图片描述
3. 测试300次
在这里插入图片描述

  1. 测试500次

在这里插入图片描述5.测试550次
在这里插入图片描述

测试600次时,结果显示error

ValueError: operands could not be broadcast together with shapes (600,) (457,)

可能原因如下
1.网络延迟
2.最大并发数限制

多次测量发现发生延迟的数量不固定

ValueError: operands could not be broadcast together with shapes (575,) (307,)

因此推断,前面一种猜测可能性更大

其他发现

当我刚开始运行api的时候,调用个数会在50个左右就开始出现长时间延迟,而后增加并发调用个数,600左右才出现延迟,除了网络延迟的影响外,aws内部函数的启动模式是否会影响测量结果(是否存在缓存加载),还需进一步的研究。

总结

本文仅仅简单介绍了EFS文件系统下并发加载python依赖的延迟测量,仅供参考。

回复

我来回复
  • 暂无回复内容