性能工程Skill performance-engineering

性能工程技能用于通过负载测试、性能剖析和优化策略来确保系统的可靠性、可扩展性和响应速度。关键词包括负载测试、压力测试、性能优化、CPU剖析、内存剖析、数据库优化、Core Web Vitals、性能SLOs等。

测试 0 次安装 2 次浏览 更新于 3/23/2026

name: 性能工程 description: 当在负载下验证系统性能、通过剖析识别瓶颈或优化应用响应速度时使用。涵盖负载测试(k6、Locust)、剖析(CPU、内存、I/O)和优化策略(缓存、查询优化、Core Web Vitals)。用于容量规划、回归检测和建立性能SLOs。

性能工程

目的

性能工程包括负载测试、剖析和优化,以提供可靠、可扩展的系统。本技能提供了选择正确性能测试方法(负载、压力、浸泡、峰值)、识别瓶颈的剖析技术(CPU、内存、I/O)以及后端API、数据库和前端应用的优化策略的框架。

使用此技能在发布前验证系统容量,在CI/CD管道中检测性能回归,通过剖析识别和解决瓶颈,并优化整个堆栈的应用响应速度。

何时使用此技能

常见触发点:

  • “验证API能处理预期流量”
  • “找到最大容量和断点”
  • “识别为什么应用慢”
  • “检测内存泄漏或资源耗尽”
  • “为SEO优化Core Web Vitals”
  • “在CI/CD中设置性能测试”
  • “降低云基础设施成本”

使用案例:

  • 发布前容量规划和负载验证
  • 重构后性能回归测试
  • 调查慢响应时间或高延迟
  • 检测长运行服务中的内存泄漏
  • 优化数据库查询性能
  • 验证自动扩展配置
  • 建立性能SLOs和预算

性能测试类型

负载测试

在预期流量水平下验证系统行为。

何时使用: 发布前容量规划、重构后回归测试、验证自动扩展。

压力测试

找到系统容量限制和故障模式。

何时使用: 容量规划、理解故障行为、基础设施大小决策。

浸泡测试

识别内存泄漏、资源耗尽和随时间退化。

何时使用: 检测内存泄漏、验证连接池清理、测试长运行批量作业。

峰值测试

验证系统对突然流量峰值的响应。

何时使用: 验证自动扩展、测试事件驱动系统(产品发布)、确保速率限制有效。

快速决策框架

使用哪种测试类型?

我想了解什么?
├─ 我的系统能处理预期流量吗? → 负载测试
├─ 最大容量是多少? → 压力测试
├─ 它会随时间保持稳定吗? → 浸泡测试
└─ 它能处理流量峰值吗? → 峰值测试

关于详细测试模式、负载场景和结果解释,请参见 references/testing-types.md

负载测试快速开始

k6(JavaScript)

安装:

brew install k6  # macOS
sudo apt-get install k6  # Linux

基本负载测试:

import http from 'k6/http';
import { check, sleep } from 'k6';

export const options = {
  stages: [
    { duration: '30s', target: 20 },
    { duration: '1m', target: 20 },
    { duration: '30s', target: 0 },
  ],
  thresholds: {
    http_req_duration: ['p(95)<500'],
    http_req_failed: ['rate<0.01'],
  },
};

export default function () {
  const res = http.get('https://api.example.com/products');
  check(res, {
    '状态是200': (r) => r.status === 200,
  });
  sleep(1);
}

运行: k6 run script.js

关于压力、浸泡和峰值测试示例,请参见 examples/k6/

Locust(Python)

安装:

pip install locust

基本负载测试:

from locust import HttpUser, task, between

class WebsiteUser(HttpUser):
    wait_time = between(1, 3)
    host = "https://api.example.com"

    @task(3)
    def view_products(self):
        self.client.get("/products")

    @task(1)
    def view_product_detail(self):
        self.client.get("/products/123")

运行: locust -f locustfile.py --headless -u 100 -r 10 --run-time 10m

关于REST API测试和数据驱动测试,请参见 examples/locust/

剖析快速开始

何时剖析

症状 剖析类型 工具
高CPU(>70%) CPU剖析 py-spy、pprof、DevTools
内存增长 内存剖析 memory_profiler、pprof heap
响应慢,低CPU I/O剖析 查询日志、pprof block

Python剖析

py-spy(生产安全):

pip install py-spy

# 剖析运行进程
py-spy record -o profile.svg --pid <PID> --duration 30

# Top-like视图
py-spy top --pid <PID>

内存剖析:

from memory_profiler import profile

@profile
def my_function():
    a = [1] * (10 ** 6)
    return a

# 运行:python -m memory_profiler script.py

Go剖析

pprof(内置):

import (
    "net/http"
    _ "net/http/pprof"
)

func main() {
    go func() {
        http.ListenAndServe("localhost:6060", nil)
    }()
    startApp()
}

捕获剖析:

# CPU剖析(30秒)
go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30

# 交互式分析
(pprof) top
(pprof) web

TypeScript/JavaScript剖析

Chrome DevTools(浏览器/Node.js):

Node.js:

node --inspect app.js
# 打开 chrome://inspect
# 性能标签 → 记录

clinic.js(Node.js):

npm install -g clinic
clinic doctor -- node app.js

关于详细剖析工作流和分析,请参见 references/profiling-guide.mdexamples/profiling/

优化策略

缓存

何时缓存:

  • 频繁查询的数据(>100 请求/分钟)
  • 数据新鲜度容忍度(>1 分钟可接受陈旧度)

Redis示例:

import redis
r = redis.Redis()

def get_cached_data(key, fn, ttl=300):
    cached = r.get(key)
    if cached:
        return json.loads(cached)
    data = fn()
    r.setex(key, ttl, json.dumps(data))
    return data

数据库查询优化

N+1预防:

# 差:N+1查询
users = User.query.all()
for user in users:
    print(user.orders)  # 每个用户单独查询

# 好:急切加载
users = User.query.options(joinedload(User.orders)).all()

索引:

CREATE INDEX idx_users_email ON users(email);

API性能

基于游标的分页:

app.get('/api/products', async (req, res) => {
  const { cursor, limit = 20 } = req.query;

  const products = await db.query(
    'SELECT * FROM products WHERE id > ? ORDER BY id LIMIT ?',
    [cursor || 0, limit]
  );

  res.json({
    data: products,
    next_cursor: products[products.length - 1]?.id,
  });
});

前端性能(Core Web Vitals)

关键指标:

  • LCP(最大内容绘制): < 2.5s
  • INP(交互到下次绘制): < 200ms
  • CLS(累积布局偏移): < 0.1

优化技术:

  • 代码分割(懒加载)
  • 图像优化(WebP、响应式、懒加载)
  • 预加载关键资源
  • 最小化渲染阻塞资源

关于详细优化策略,请参见 references/optimization-strategies.mdreferences/frontend-performance.md

性能SLOs

推荐服务类型SLOs

服务类型 p95 延迟 p99 延迟 可用性
面向用户API < 200ms < 500ms 99.9%
内部API < 100ms < 300ms 99.5%
数据库查询 < 50ms < 100ms 99.99%
后台作业 < 5s < 10s 99%
实时API < 50ms < 100ms 99.95%

SLO选择过程

  1. 测量基线性能
  2. 识别用户期望
  3. 设定可达成目标(比基线好10-20%)
  4. 随着系统成熟迭代

关于详细SLO框架和性能预算,请参见 references/slo-framework.md

CI/CD集成

管道中的性能测试

GitHub Actions示例:

name: 性能测试

on:
  pull_request:
    branches: [main]

jobs:
  load-test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: 安装 k6
        run: |
          curl https://github.com/grafana/k6/releases/download/v0.48.0/k6-v0.48.0-linux-amd64.tar.gz -L | tar xvz
          sudo mv k6-v0.48.0-linux-amd64/k6 /usr/local/bin/

      - name: 运行负载测试
        run: k6 run tests/load/api-test.js

性能预算:

// k6测试带阈值(如果违反则构建失败)
export const options = {
  thresholds: {
    http_req_duration: ['p(95)<500'],
    http_req_failed: ['rate<0.01'],
  },
};

剖析工作流

标准流程:

  1. 观察症状(高CPU、内存增长、慢响应)
  2. 假设瓶颈(CPU?内存?I/O?)
  3. 基于假设选择剖析类型
  4. 在实际负载下运行剖析器
  5. 分析剖析(火焰图、调用树)
  6. 识别热点(使用80%资源的前20%函数)
  7. 优化瓶颈
  8. 重新剖析以验证改进

最佳实践:

  • 在实际负载下剖析(非空闲系统)
  • 在生产中使用采样剖析器(py-spy、pprof)(低开销)
  • 关注热路径(先优化最大瓶颈)
  • 使用前后比较验证优化

工具推荐

负载测试

主要:k6(基于JavaScript,Grafana支持)

  • 现代架构,云原生
  • JavaScript DSL(ES6+)
  • Grafana/Prometheus集成
  • 多协议(HTTP/1.1、HTTP/2、WebSocket、gRPC)

何时使用: 现代API、微服务、CI/CD集成。

替代:Locust(基于Python)

  • Python原生(用Python编写测试)
  • Web UI实时监控
  • 灵活处理复杂用户场景

何时使用: Python重度团队、复杂用户流。

剖析

Python:

  • py-spy(采样、生产安全)
  • cProfile(确定性、详细)
  • memory_profiler(内存泄漏检测)

Go:

  • pprof(内置,CPU/堆/goroutine/块剖析)

TypeScript/JavaScript:

  • Chrome DevTools(浏览器/Node.js)
  • clinic.js(Node.js性能套件)

关于详细工具比较,请参见 references/testing-types.mdreferences/profiling-guide.md

参考文档

详细指南:

  • references/testing-types.md - 负载、压力、浸泡、峰值测试模式
  • references/profiling-guide.md - 跨语言CPU、内存、I/O剖析
  • references/optimization-strategies.md - 缓存、数据库、API优化
  • references/frontend-performance.md - Core Web Vitals、包优化
  • references/slo-framework.md - 设置SLOs、性能预算
  • references/benchmarking.md - 基准测试最佳实践

示例:

  • examples/k6/ - 负载、压力、浸泡、峰值测试
  • examples/locust/ - 基于Python的负载测试
  • examples/profiling/ - 剖析示例(Python、Go、TypeScript)
  • examples/optimization/ - 缓存、查询、API优化

相关技能

关于全面测试策略,请参见 testing-strategies 技能。

关于CI/CD集成模式,请参见 building-ci-pipelines 技能。

关于基于负载测试的基础设施大小,请参见 infrastructure-as-code 技能。

关于Kubernetes性能测试,请参见 kubernetes-operations 技能。