为什么 bcryptjs 在 AWS Lambda 上比在本地 docker 上慢?

Why is bcryptjs slower on AWS Lambda than in local docker?

我用 NodeJS 编写了 Lambda。我注意到需要几秒钟才能完成。我添加了日志,发现bcrypt很慢。

包:

"dependencies": {
  "bcryptjs": "^2.4.3",

源代码:

const bcrypt = require('bcryptjs');

console.log("User was found"); // following part takes more than 1 second!
if (bcrypt.compareSync(password, user.password)) {
    console.log("Password verified"); //

这是来自 AWS LogWatch 的日志:

2020-01-13T20:25:30.951 User was found
2020-01-13T20:25:32.670 Password verified

2020-01-13T20:31:20.192 User was found
2020-01-13T20:31:21.550 Password verified

因此需要 1.7 秒。我 运行 我的机器 docker 中的相同代码

2020-01-13T20:09:48.109 User was found
2020-01-13T20:09:48.211 Password verified

本地只需要 120 毫秒。 AWS 使用 NodeJS 10.x,本地 docker 图片大概是 8.x。我不知道如何告诉 docker 反映 packaged.yaml 的变化。

这是 NodeJS 回归吗?或者 AWS 配置有问题?

我有同样的问题,这是因为您正在使用 bcryptjs 库尝试使用 bcrypt 快得多。 Bcryptjs 使用纯 javascipt,这就是为什么另一方面太慢 bcrypt 使用 c++ 扩展

加密性能通常 CPU 受限。 AWS Lambda CPU 与RAM成正比,所以你应该选择最大的(3008 MB)并重新测试。

当我 运行 在 us-east-1 的 3008 MB RAM Lambda 上的 Lambda 函数处理程序中执行此操作时,compareSync 调用始终需要 90-100 毫秒。对于 128 MB 的 Lambda,它需要 1 秒多一点的时间。

在相关说明中,理解选择最低 (128 MB) RAM 选项是有帮助的,仅仅因为它每 GB-s 更便宜,并不总是最好的选择。虽然最高的 RAM 选项(CPU 和网络比例更高)肯定每 GB-s 更昂贵,但它也可以更快地完成 Lambda 函数。因此,举例来说,您可能能够以 1/10 的时间完成任务,而成本仅为 1.75 倍。在很多情况下,这可能非常有价值。

有一个项目可以帮助您为您的 Lambdas 调整 price/performance:alexcasalboni/aws-lambda-power-tuning