目前(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 的内容为
1 2 3 4 5 6 7 8 9 10 11 |
import psutil import os def lambda_handler(event, context): mem_usage = psutil.virtual_memory() return { "memory": f"{mem_usage.total/(1024**2):.0f}M", "cpu_count": os.cpu_count(), "cpu_freq": f"{int(psutil.cpu_freq()[0])}MHz" } |
测试响应格式为
1 2 3 4 5 |
{ "memory": "3166M", "cpu_count": 2, "cpu_freq": "2500MHz" } |
下面是通过朴素的方式不断修改 Lambda 内存数获得的数据,内存设置从 128M 起,每次翻倍,直至 10240M,如有发现 CPU 个数变化再找到临界值,CPU 的频率全都是 2500 MHz
内存选择(M) | psutil 显示总内存(M) | CPU 个数 |
128 | 188 | 2 |
256 | 324 | 2 |
512 | 634 | 2 |
1024 | 1170 | 2 |
2048 | 3166 | 2 |
3008 | 3166 | 2 |
3009 | 5521 | 3 |
4096 | 5521 | 3 |
5120 | 5521 | 3 |
5307 | 5521 | 3 |
5308 | 7299 | 4 |
6144 | 7299 | 4 |
7076 | 7299 | 4 |
7077 | 9091 | 5 |
8192 | 9091 | 5 |
8845 | 9091 | 5 |
8846 | 10492 | 6 |
10240 | 10492 | 6 |
以上表格大概也只仅供参考,AWS 随时可能改变内存与 CPU 核心数的变化关系。
把内存选择与 vCPU 个数关系可以缩表如下:
内存(M) | vCPU |
128 - 3008 | 2 |
3009 - 5307 | 3 |
5308 - 7076 | 4 |
7077 - 8845 | 5 |
8846 - 10240 | 6 |
Lambda 实际运行环境中的总内存大小也并非选择多少就多少,而是有一系列点位值,选择的内存落在哪个区间就用向上接近的那个点位上的值。
链接:
https://docs.aws.amazon.com/zh_cn/lambda/latest/dg/gettingstarted-limits.html
这个文档提到:内存大小为 1769MB 时,函数的处理能力与一个 vCPU 等效。可以根据自己函数的内存配置大致算一下
那就可能是配置了内存后,系统里看到的内存和 vCPU 还不算数,还存在一个 soft limit?