首次分析

我们现在准备好分析其中一个示例应用了。第一个示例,我们使用 slow-event-loop。首先,我们通过在 examples 目录中运行 node slow-event-loop 来确认它已准备好并能工作。进程开始运行后,我们就可以在浏览器中访问 http://localhost:3000/ 进行检查。

We're now ready to profile one of the example applications. For the first example, we will use slow-event-loop. First, let's confirm that it is ready and working by running node slow-event-loop from inside the examples directory. Once the process seems to be running we can visit http://localhost:3000/ in a browser to check.

我们可以在浏览器中看到一些基本输出,比如 {}。在命令行中按 Ctrl-C 关闭 slow-event-loop 服务器。

We should see some basic output in the browser, like {}. Ctrl-C in the command line to close the slow-event-loop server.

因为这是一个服务器,所以我们需要进行负载测试。对只处理一个请求的服务器进行分析不会为我们提供太多信息,也不知道它在处理许多请求时会如何执行。我们建议使用基准测试工具 autocannon

This is a server, so we need to apply load. Profiling a server handling just one request doesn't give us much data or indication of how it performs when handling many requests. We recommend the benchmarking tool Autocannon.

当执行 clinic 时,我们也会在示例应用目录中执行 autocannon,所以我们先使用以下命令全局安装它:

We will execute autocannon in the example application directories when we call the clinic executable, so let's install it globally, with the following command:

npm install -g autocannon

要对服务器进行负载测试,我们需要使用 Doctor 运行它,并在它开始侦听端口时立即调用 autocannon。只要服务器准备好处理请求并且 Doctor 也准备好收集数据,就会使用大量请求轰炸服务器。

To load-test the server, we want to run it with Doctor, and point autocannon at it as soon as it starts listening on a port. This will bombard the server with requests, as soon as it is ready to handle them and Doctor is ready to collect data.

我们用下面这个命令完成所有操作,它会自动分配正确的端口:

Let's do all that with this single command, which automatically assigns the correct ports:

clinic doctor --on-port 'autocannon localhost:$PORT' -- node slow-event-loop

我们拆分一下这个命令:

Let's break this command down:

  • clinic doctor 调用 Doctor 命令行工具。

The clinic doctor portion invokes the Doctor command tool.

  • --on-port 参数指定在服务开始监听端口后马上执行的脚本,即 autocannon localhost:$PORT。

The --on-port flag will execute the supplied script as soon as the server starts listening on a port.

  • 脚本中的 $PORT 变量是服务器开始侦听的第一个端口。

The $PORT variable in that script is set to the first port that the server began listening on.

  • -- 后面的命令用于启动我们要分析的服务,比如这里的 node slow-event-loop

Everything after the double-dash (--) is the command which starts the server that we want to profile, in this case node slow-event-loop.

这行命令会运行三个可执行文件:父可执行文件 clinic flame, --on-port 中的可执行文件 autocannon,以及可执行文件 Node

This one command runs three executables: the clinic doctor parent executable, the autocannon executable in --on-port and the node executable.

运行该命令后,slow-event-loop 服务器将被 10 个并发连接的请求命中 10 秒(autocannon 的默认值)。然后将结果编译成单个 HTML 文件,该文件会浏览器中自动打开。

Upon running the command, the slow-event-loop server will be hit by requests from 10 concurrent connections for 10 seconds (as per autocannon defaults). then the results be compiled into a single HTML file that should automatically open in the browser.

生成的 HTML 类似于下面这样:

The resulting HTML should look similar to the following: