剖析 Node.js 应用的性能

本页面介绍如何修改 Node.js 应用以捕获性能剖析数据,并将该数据发送到您的 Google Cloud 项目。如需了解性能剖析的常规信息,请参阅性能剖析相关概念

Node.js 的性能剖析文件类型:

  • 实际用时

支持的 Node.js 语言版本:

  • Node.js 14 或更高版本
  • 如需了解 Node.js 发布政策,请参阅发布时间表

支持的性能剖析代理版本:

  • 支持代理的最新版本。通常,不支持发布超过一年的版本。我们建议您使用最近发布的代理版本。

支持的操作系统:

  • Linux。Linux 内核支持剖析 Node.js 应用的性能,其标准 C 库是使用 glibcmusl 实现的。如需了解针对 Linux Alpine 内核的特定配置信息,请参阅在 Linux Alpine 上运行

支持的环境:

启用 Profiler API

在使用性能剖析代理之前,请确保已启用底层 Profiler API。您可以使用 Google Cloud CLI 或 Google Cloud 控制台查看该 API 的状态以及在必要时启用该 API:

gcloud CLI

  1. 如果您尚未在工作站上安装 Google Cloud CLI,请参阅 Google Cloud CLI 文档

  2. 运行以下命令:

    gcloud services enable cloudprofiler.googleapis.com
    

如需了解详情,请参阅 gcloud services

Google Cloud 控制台

  1. Enable the required API.

    Enable the API

  2. 如果系统显示 API 已启用,则表示此 API 已经启用。如未显示,请点击启用按钮。

使用 Cloud Profiler

在所有受支持的环境中,您可以通过以下方式使用 Profiler:安装软件包 @google-cloud/profiler,向应用添加 require 语句,然后以常规方式部署应用。

在安装 @google-cloud/profiler 之前

软件包 @google-cloud/profiler 依赖于原生模块。预构建 此原生模块的二进制文件可用于 Linux 和 Alpine Linux, 节点 14 和 16。不需要其他依赖项。 @google-cloud/profiler 使用 node-pre-gyp 确定要安装哪个预构建二进制文件。

在没有预构建二进制文件的其他环境中使用 @google-cloud/profiler 时,系统会使用模块 node-gyp 构建二进制文件。有关使用 node-gyp,请参阅 node-gyp 的安装 文档

安装

如需安装最新版本的 Cloud Profiler,请运行以下命令:

    npm install --save @google-cloud/profiler

如果您还使用 Trace 代理,那么当您 修改应用后,先导入 Profiler 软件包 跟踪代理软件包 (@google-cloud/trace-agent)。

Compute Engine

对于 Compute Engine,请执行以下操作:

  1. 安装最新版本的 Cloud Profiler:

    npm install --save @google-cloud/profiler
    
  2. 修改应用 require 代码以创建一个 serviceContext 对象,该对象会向 service 分配将被执行性能剖析的服务的名称。(可选)您可以向 version 分配将被执行性能剖析的服务的版本。如需详细了解这些配置选项,请参阅服务名称和版本参数

    require('@google-cloud/profiler').start({
      serviceContext: {
        service: 'your-service',
        version: '1.0.0',
      },
    });

GKE

对于 GKE,请执行以下操作:

  1. 修改 Dockerfile 以安装 Profiler 软件包:

    FROM node:10
    ...
    RUN npm install @google-cloud/profiler
    
  2. 修改应用 require 代码以创建一个 serviceContext 对象,该对象会向 service 分配将被执行性能剖析的服务的名称。(可选)您可以向 version 分配将被执行性能剖析的服务的版本。如需详细了解这些配置选项,请参阅服务名称和版本参数

    require('@google-cloud/profiler').start({
      serviceContext: {
        service: 'your-service',
        version: '1.0.0',
      },
    });

App Engine

对于 App Engine 柔性环境和 App Engine 标准环境,require 代码类似于以下内容:

require('@google-cloud/profiler').start();

在 App Engine 中,serviceversion 参数由环境生成,因此,您不必指定它们,也无需创建 serviceContext 对象。

分析数据

在 Profiler 收集数据后,您可以使用 Profiler 界面查看和分析这些数据。

在 Google Cloud 控制台中,前往性能分析器页面:

前往 Profiler

您也可以使用搜索栏查找此页面。

服务名称和版本参数

加载 Profiler 代理时,请指定服务名称参数和可选的服务版本参数,以对其进行配置。

凭借服务名称,Profiler 可以收集该服务所有副本的性能剖析数据。对于每个组合服务版本和区域中的每个服务名称,Profiler 服务将保证平均每分钟生成一个性能剖析文件的收集速率。

例如,如果您的服务有两个版本在三个区域中的副本上运行,那么 Profiler 平均每分钟将为该服务创建 6 个性能剖析文件。

如果您为副本使用不同的服务名称,那么对服务执行性能剖析的频率将超出必要频率,相应的开销也会更高。

选择服务名称时,应注意以下几点:

  • 选择的名称应能清楚地表示应用架构中的服务。如果您只运行单个服务或应用,那么服务名称的选择没那么重要;但如果您的应用作为一组微服务运行,则服务名称的选择较为重要。

  • 切勿在服务名称字符串中使用任何进程专用的值,例如进程 ID。

  • 服务名称字符串必须与如下正则表达式相符:

    ^[a-z0-9]([-a-z0-9_.]{0,253}[a-z0-9])?$

建议使用 imageproc-service 这样的静态字符串作为服务名称。

服务版本是可选的。如果您指定服务版本,则 Profiler 可以汇总来自多个实例的性能剖析信息并将其正确显示出来。服务版本可用于在部署服务时标记不同的版本。Profiler 界面支持您按服务版本过滤数据,这样一来,您就可以比较新旧版本代码的性能。

服务版本参数的值是一个使用自由格式的字符串,但此参数的值通常看起来像版本号,例如 1.0.02.1.2

代理日志记录

性能剖析代理可以报告日志记录信息。如需启用日志记录,请在启动代理时设置 logLevel 选项。支持的 logLevel 值如下:

  • 0:停用所有代理日志记录。
  • 1:启用错误日志记录。
  • 2:启用警告日志记录(默认)。
  • 3:启用信息日志记录。
  • 4:启用调试日志记录。

在提供服务环境的同一对象中设置 logLevel 值:

require('@google-cloud/profiler').start({
    serviceContext: { ... }
    logLevel:       3
});

使用 Linux Alpine 运行

只有 Google Kubernetes Engine 配置支持适用于 Linux Alpine 的 Node.js 剖析代理。

构建错误

如果您运行 npm install 并且构建失败并显示以下错误,则 您的 Dockerfile 缺少一些构建依赖项:

ERR! stack Error: not found: make

如需解决此问题,请将以下语句添加到 Dockerfile 的构建阶段:

RUN apk add python3 g++ make

身份验证错误

如果您的 Docker 映像使用 Linux Alpine(如 golang:alpine 或者只是 alpine)运行,您可能会看到以下身份验证错误:

connection error: desc = "transport: authentication handshake failed: x509: failed to load system roots and no roots provided"

请注意,您必须启用代理日志记录才能看到该错误。

该错误表示使用 Linux Alpine 的 Docker 映像没有默认安装 SSL 根证书。这些证书为性能剖析代理与性能剖析器 API 进行通信所必需。如需解决此错误,请将以下 apk 命令添加到您的 Dockerfile 中:

FROM alpine
...
RUN apk add --no-cache ca-certificates

然后,您需要重新构建并重新部署应用。

已知问题

Node.js 版性能剖析代理会干扰程序的正常退出。在程序中的所有任务都完成后,程序最多可能需要一个小时才能退出。当您发出 SIGINT 时(例如,使用 Ctrl-C),这会导致进程正常终止。

后续步骤