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.md 和 examples/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.md 和 references/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选择过程
- 测量基线性能
- 识别用户期望
- 设定可达成目标(比基线好10-20%)
- 随着系统成熟迭代
关于详细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'],
},
};
剖析工作流
标准流程:
- 观察症状(高CPU、内存增长、慢响应)
- 假设瓶颈(CPU?内存?I/O?)
- 基于假设选择剖析类型
- 在实际负载下运行剖析器
- 分析剖析(火焰图、调用树)
- 识别热点(使用80%资源的前20%函数)
- 优化瓶颈
- 重新剖析以验证改进
最佳实践:
- 在实际负载下剖析(非空闲系统)
- 在生产中使用采样剖析器(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.md 和 references/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 技能。