实测 AWS Lambda 不同内存配置下的 CPU 核心数

目前(2023-05-25) AWS Lambda 的内存选择区间是 128MB ~ 10240MB, 最长运行时间为 15 分钟,但没有 vCPU 个数的选择。vCPU 的数量是基于所选内存大小而有不同的,如果我们在 Lambda 中需使用多进程充分发挥 CPU 性能的话,有必要了解当前 Lambda 所在运行环境的 CPU 内核数,甚至是单核的频率。

CPU 个数可用如下 Python 内置的其中一个方法取得
multiprocessing.cpu_count()
os.cpu_count()
要获得 CPU 频率或内存的话,将要用到 psutil  组件的方法,可把 psutil 做成 Lambda  层以引用,或与 Lambda 函数代码一同打成  zip 包。

安装方法 psutil
pip install --target . psutil
psutil 会安装到当前目录,然后在当前目录下再创建 lambda_function.py 文件,再打包
zip -r lambda.zip *
部署这个 lambda.zip 到 AWS Lambda  函数即可,指定相应的 Handler: lambda_function.lambda_handler

lambda_function.py 的内容为
 1import psutil
 2import os
 3
 4
 5def lambda_handler(event, context):
 6    mem_usage = psutil.virtual_memory()
 7    return {
 8        "memory": f"{mem_usage.total/(1024**2):.0f}M",
 9        "cpu_count": os.cpu_count(),
10        "cpu_freq": f"{int(psutil.cpu_freq()[0])}MHz"
11    }

测试响应格式为
1{
2  "memory": "3166M",
3  "cpu_count": 2,
4  "cpu_freq": "2500MHz"
5}

下面是通过朴素的方式不断修改 Lambda 内存数获得的数据,内存设置从 128M 起,每次翻倍,直至 10240M,如有发现 CPU 个数变化再找到临界值,CPU 的频率全都是 2500 MHz

内存选择(M)psutil 显示总内存(M)CPU 个数
1281882
2563242
5126342
102411702
204831662
300831662
300955213
409655213
512055213
530755213
530872994
614472994
707672994
707790915
819290915
884590915
8846104926
10240104926

以上表格大概也只仅供参考,AWS 随时可能改变内存与 CPU 核心数的变化关系。

把内存选择与 vCPU 个数关系可以缩表如下:

内存(M)vCPU
128 - 30082
3009 - 53073
5308 - 70764
7077 - 88455
8846 - 102406

Lambda 实际运行环境中的总内存大小也并非选择多少就多少,而是有一系列点位值,选择的内存落在哪个区间就用向上接近的那个点位上的值。

链接:

  1. What is the psutil.cpu_freq() method?
  2. Python script to get CPU and RAM Usage
永久链接 https://yanbin.blog/get-aws-lambda-cpu-count-different-memory/, 来自 隔叶黄莺 Yanbin's Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。