我正在管理一个运行nodejs (next.js)应用程序的服务器,目前我将其视为一个黑盒子。我使用
运行
应用程序用于响应HTTP请求,并通过执行一些(或许很多)API调用来组装这些响应,这些API调用是对本地安装的Drupal网站进行的。Drupal网站对单个或并发请求的响应非常快,不是问题的一部分。
应用程序通常需要约7.5秒来生成响应。
这个很慢,但并不是问题的根本原因。
如果我同时发出3个请求,通常第一个请求会在大约7.5秒内完成,而其他两个请求会在大约22秒内完成。
请注意,3乘以7.5等于22.5,所以有些请求似乎会等待其他请求全部完成。
我执行了6个请求的测试,响应时间如下:
pm2
以fork模式运行该应用程序,使用ecosystem.config.js
配置文件。module.exports = {
apps: [
{
name: "app-frontend-nextjs",
cwd: "/home/user/app/frontend-nextjs",
script: "npm",
args: "start",
env: {}
}
]
};
运行
pm2 list
的结果如下:┌─────┬────────────────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id │ name │ namespace │ version │ mode │ pid │ uptime │ ↺ │ status │ cpu │ mem │ user │ watching │
├─────┼────────────────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 1 │ app-frontend-nextjs │ default │ N/A │ fork │ 2413063 │ 27D │ 5 │ online │ 0% │ 64.6mb │ xxxxxx │ disabled │
└─────┴────────────────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
host metrics | cpu: 2.3% | mem free: 62.0% | ens3: ⇓ 0mb/s ⇑ 0mb/s | disk: ⇓ 0mb/s ⇑ 0mb/s /dev/mapper/ubuntu--vg-ubuntu--lv 67.4% |
应用程序用于响应HTTP请求,并通过执行一些(或许很多)API调用来组装这些响应,这些API调用是对本地安装的Drupal网站进行的。Drupal网站对单个或并发请求的响应非常快,不是问题的一部分。
应用程序通常需要约7.5秒来生成响应。
$ curl -s -w 'seconds %{time_total}\n' -I 127.0.0.1:3000 | grep seconds
seconds 7.568871
这个很慢,但并不是问题的根本原因。
如果我同时发出3个请求,通常第一个请求会在大约7.5秒内完成,而其他两个请求会在大约22秒内完成。
$ curl -s -w 'seconds %{time_total}\n' -I 127.0.0.1:3000 | grep seconds &
[1] 482148
$ curl -s -w 'seconds %{time_total}\n' -I 127.0.0.1:3000 | grep seconds &
[2] 482150
$ curl -s -w 'seconds %{time_total}\n' -I 127.0.0.1:3000 | grep seconds &
[3] 482152
$
$ seconds 7.809088
seconds 22.355956
seconds 22.355522
请注意,3乘以7.5等于22.5,所以有些请求似乎会等待其他请求全部完成。
我执行了6个请求的测试,响应时间如下:
seconds 7.580153
seconds 14.922243
seconds 43.844184
seconds 43.841478
seconds 43.844960
seconds 43.848788
这证实了一些响应等待其他响应完成。
大多数并行响应在完全相同的时间内完成(毫秒级别),这很可疑,表明有一些奇怪的事情正在发生。某些东西阻止了这些响应的派发,直到它们全部完成处理。
为什么应用程序会表现出这种行为?是因为我在“fork”模式下运行应用程序,还是应该开始查看应用程序的代码,以确定是否存在某些神秘的锁定逻辑导致了这种行为?