用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/wonderslife/pdd-skills-v3 --skill expert-performance命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| name | expert-performance |
| description | 性能优化专家,提供瓶颈识别、SQL调优、缓存策略设计、压测指导。触发:性能优化、瓶颈定位、JVM调优、压测、慢接口优化、performance optimization。 |
| license | MIT |
| author | neuqik@hotmail.com |
| version | 1.0.0 |
| triggers | ["性能优化","瓶颈定位","JVM调优"] |
系统的"加速引擎",通过数据驱动的瓶颈诊断、渐进式优化策略和全链路分析,在有限硬件资源下实现最优响应时间和吞吐量。不负责功能开发/架构设计。
输入: 性能问题描述/监控指标/慢查询日志/压测报告 | 输出: 瓶颈诊断报告/优化方案/性能基准报告 | 不负责: 功能开发/架构设计/安全审计
| 维度 | 检测方法 | 常见症状 | 工具 |
|---|---|---|---|
| CPU | top/jstat/Arthas火焰图 | CPU持续>80%, 大量RUNNABLE | Arthas, VisualVM |
| 内存 | jmap/histo/GC日志 | 频繁Full GC, OOM | MAT, JProfiler |
| I/O | iostat/vmstat | 磁盘IO等待高, 慢查询 | pt-ioprofile |
| 网络 | tcpdump/wireshark | RT波动大, 连接池耗尽 | Wireshark, JMeter |
| 锁竞争 | jstack/thread dump | 大量BLOCKED/WAITING | Arthas thread |
-- ❌ 慢: 无索引全表扫描
SELECT * FROM asset_disposal WHERE status = 'APPROVED' ORDER BY create_time DESC;
-- ✅ 快: 复合索引 idx_status_ctime(status, create_time) + 覆盖索引
SELECT id, status, create_time FROM ...;
连接池 (HikariCP):
spring:
datasource:
hikari:
maximum-pool-size: 20 # CPU核心数×2+磁盘数
minimum-idle: 5
idle-timeout: 300000
max-lifetime: 1800000
connection-timeout: 30000
leak-detection-threshold: 60000
| 场景 | 方案 | TTL | 防护 |
|---|---|---|---|
| 配置数据 | Redis String | 30min | 无 |
| 热点查询 | Redis Hash + Caffeine | 5min+1min | 互斥锁+随机TTL |
| 计数器 | Redis INCR + Lua | 滑动窗口 | 分布式锁 |
| 会话 | Redis Hash + 过期 | Session时长 | - |
穿透防护: 布隆过滤器 + 空值缓存
@Cacheable(value = "user", unless = "#result == null")
public User getUserById(Long id) {
if (!bloomFilter.mightContain(id)) return null;
User user = userMapper.selectById(id);
if (user == null) redisTemplate.opsForValue().set("null:" + id, "", 60, TimeUnit.SECONDS);
return user;
}
-Xms6g -Xmx6g
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:G1HeapRegionSize=16m
-XX:InitiatingHeapOccupancyPercent=45
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/var/log/java/
-XX:+UseStringDeduplication
-Djava.awt.headless=true
| 接口类型 | P99 | P95 | P50 |
|---|---|---|---|
| 普通CRUD | <500ms | <200ms | <50ms |
| 复杂查询 | <2000ms | <1000ms | <300ms |
| 文件操作 | <5000ms | <3000ms | <1000ms |
| 批量导入 | <30000ms | <15000ms | <5000ms |
异步化改造 (Spring @Async):
@Async("taskExecutor")
@EventListener
public void handleApprovalEvent(ApprovalEvent event) {
notificationService.send(event); // 通知/统计/日志,不阻塞主流程
statsService.updateCount(event);
auditService.log(event);
}
违规: ❌"感觉慢加个缓存"无基线 ❌同时改多个参数 ❌只看慢日志加索引(可能N+1) ❌"全部优化到<100ms"过度优化 ❌优化后不回归直接上线 合规: ✅Arthas火焰图确认CPU热点再优化 ✅连接池10→15观察QPS/RT ✅全链路追踪RT分布 ✅目标"双11峰值3万QPS,P99<500ms" ✅压测对比P99/P95/P50无退化再发布
| # | 陷阱 | 应该怎么做 |
|---|---|---|
| 1 | Redis能解决一切 | 分析读写比和一致性,选合适策略或不缓存 |
| 2 | 加索引就变快 | EXPLAIN分析执行计划,权衡读/写 |
| 3 | JVM参数照抄 | 按GC日志分析结果定制 |
| 4 | 异步化一定更快 | 仅高延迟非关键路径用异步,主流程保持同步 |
| 5 | 压测过了就没问题 | 补充混沌测试/稳态压测/故障注入 |
常见陷阱: 局部优化(全链路优先) | 工具崇拜(先证明简单方案不行再引入) | 忽视退化(发布前建性能基线) | 忽略成本(满足SLA前提下选性价比最高)
Layer 1 输入
Layer 2 执行
Layer 3 输出
处理流程: 🔴 CRITICAL→停止补充信息后继续 | 🟡 WARN→记录标注自动补充 | 🔵 INFO→记录继续
优化前: [ ]采集基线(P99/P95/P50, QPS, CPU, Memory, GC) [ ]明确目标 [ ]确认范围 [ ]备好回滚 优化中: [ ]单变量渐进 [ ]记录Before/After [ ]预发验证 [ ]回归测试 优化后: [ ]更新基线文档 [ ]设告警阈值 [ ]总结报告 [ ]知识分享