剖析 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 已经启用。如未显示,请点击启用按钮。

向服务账号授予 IAM 角色

如果您在 Google Cloud 资源上部署应用,并且使用的是默认服务账号,并且未修改向该服务账号授予的角色,则可以跳过本部分。

如果您执行以下任何操作,则需要向服务账号授予 Cloud Profiler Agent (roles/cloudprofiler.agent) IAM 角色:

  1. 您使用的是默认服务账号,但修改了其角色授予。
  2. 您使用的是用户创建的服务账号。
  3. 您使用的是 Workload Identity,请向 Kubernetes 服务账号授予 Cloud Profiler Agent 角色。

您可以使用 Google Cloud 控制台或 Google Cloud CLI 向服务账号授予 IAM 角色。例如,您可以使用 gcloud projects add-iam-policy-binding 命令:

gcloud projects add-iam-policy-binding GCP_PROJECT_ID \
    --member serviceAccount:MY_SVC_ACCT_ID@GCP_PROJECT_ID.iam.gserviceaccount.com \
    --role roles/cloudprofiler.agent

在使用上一个命令之前,请替换以下内容:

  • GCP_PROJECT_ID:您的项目 ID。
  • MY_SVC_ACCT_ID:您的服务账号的名称。

如需了解详情,请参阅管理对项目、文件夹和组织的访问权限

使用 Cloud Profiler

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

在安装 @google-cloud/profiler 之前

软件包 @google-cloud/profiler 依赖于内置模块。此内置模块的预构建二进制文件适用于 Node 14 和 16 的 Linux 和 Alpine Linux。无需额外的依赖项。 @google-cloud/profiler 使用 node-pre-gyp 确定要安装哪个预构建二进制文件。

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

安装

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

    npm install --save @google-cloud/profiler

如果您同时还使用 Trace 代理,则在修改应用时,请先导入 Trace 代理软件包 (@google-cloud/trace-agent),然后再导入 Profiler 软件包。

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),这会导致进程正常终止。

后续步骤