在 Cloudflare Worker 请求的上下文中,CPU time 和 Wall time 是什么?

What is CPU time and Wall time in the context of Cloudflare Worker request?

如果您在免费计划中看到 Cloudflare Workers here 的定价部分,他们有以下内容

Up to 10ms CPU time per request

并在以下付费计划中

Up to 30s wall time per request

通常执行有用的脚本需要超过 10 毫秒的时间。根据任务的不同,甚至 30 秒的挂墙时间也可能很短。

如果您查看 Worker 的文档 limits: CPU runtime 部分,它有

Most Worker requests consume less than a millisecond. It is rare to find a normally operating Workers script that exceeds the CPU time limit. A Worker may consume up to 10ms on the free plan and up to 50ms for Bundled Workers on the Paid Plan. The Paid Plan also offers up to a 30 second duration for increased compute time. The 10ms allowance on the free plan is enough execution time for most use cases including application hosting.

There is no limit on the real runtime for a Workers script. As long as the client that sent the request remains connected, the Workers script can continue processing, making subrequests, and setting timeouts on behalf of that request. When the client disconnects, all tasks associated with that client request are canceled. You can use event.waitUntil() to delay cancellation for another 30 seconds or until the promise passed to waitUntil() completes.

虽然在一般意义上 CPU 时间,但在 post 中提到的 Wall time 是正确的。我不认为这是在这种情况下的准确含义,因为在 post 链接中,CPU 时间是内核或用户 space.

中的代码执行时间

CPU time per request 与 AWS Lambda 中的代码执行时间 CPU 也不相似,因为它提到了以下

There is no limit on the real runtime for a Workers script.

因此脚本实际运行时间(即:CPU 执行时间)不像在 AWS Lambda 中那样限制为 15 分钟。

然后

"CPU 时间" 表示 CPU 主动执行您的 JavaScript 代码的时间量。这特别不包括 CPU 等待某事发生的时间,例如等待 fetch() 完成或 setTimeout() 触发。

许多 Worker 的执行时间不到 CPU 毫秒。例如,如果您只是在每个请求上更改 header 然后将其发送到另一台服务器,您的 Worker 可能只需要 [=28] 的几百 微秒 =] 每个请求的时间(因此,十分之几毫秒)。在免费计划下,worker 每次请求的时间限制为 10 毫秒 CPU,这实际上足够做很多事情了。

“墙上时间”指的是墙上的钟表计时的时间,即real-world时间。与 CPU 时间不同,wall time 包括等待时间。因此,如果您向其他服务器执行 fetch()(HTTP 请求),并且响应需要 3 秒,则整个过程可能需要不到 CPU 时间的毫秒,但 3 秒的墙时间.

付费计划指定了 30 秒的请求处理限制。事实上,这里的 enforced 限制也是在 CPU 时间,而不是墙上时间。因此,一个请求可能需要超过 30 秒的时间,只要它不是一直在执行代码。但是,请注意,当请求花费的时间超过 30 秒时,请求随机中断的变化会增加。例如,非常 long-running 的请求可能会遇到 TCP 超时或随机网络断开连接。此外,当 Workers Runtime 收到代码更新时,它会给所有 in-flight 请求 30 秒(墙上时间)来完成,然后再取消它们。因此,请求 运行 超过 30 秒的应用程序需要在随机断开连接的情况下实现重试逻辑。 (即使对于较短的请求,重试逻辑也是一个好主意,因为随机中断对于任何长度的请求都是可能的,但是 运行 超过 30 秒的请求承担更高的风险。)