Phoenix性能分析Skill phx:perf

这个技能用于分析Elixir/Phoenix代码的性能问题,包括N+1查询、LiveView内存管理、查询优化和OTP瓶颈。适用于代码优化和性能剖析,帮助开发者提升应用性能。关键词:性能分析、Elixir、Phoenix、N+1查询、LiveView内存、OTP瓶颈、代码优化、后端开发。

后端开发 0 次安装 0 次浏览 更新于 3/11/2026

名称: phx:perf 描述: 分析Elixir/Phoenix代码的性能问题 — N+1查询、LiveView内存、查询模式、OTP瓶颈。在优化或性能分析时使用。 参数提示: [页面|上下文|模块] [–focus ecto|liveview|otp] 禁用模型调用: true

性能分析

分析代码在Ecto、LiveView和OTP层的性能问题。按影响和努力程度优先处理发现。

用法

/phx:perf                           # 分析整个项目
/phx:perf lib/my_app/accounts.ex    # 分析特定模块
/phx:perf --focus ecto              # 仅分析Ecto查询
/phx:perf --focus liveview          # 仅分析LiveView内存
/phx:perf --focus otp               # 仅分析OTP瓶颈

参数

$ARGUMENTS = 可选的模块/上下文路径和--focus标志。

铁律

  1. 优化前先测量 — 没有证据表明问题前绝不优化
  2. 数据库优先 — 90%的Elixir性能问题与查询相关
  3. 一次一个更改 — 隔离优化以测量影响

工作流程

步骤1: 确定范围

如果提供特定文件,则聚焦于此。否则:

# 查找热点路径:上下文、LiveViews、工作者
find lib/ -name "*.ex" | head -50

步骤2: 运行分析轨道

基于焦点并行启动分析代理:

Ecto轨道(默认或--focus ecto):

启动elixir-phoenix:elixir-reviewer,提示: “分析N+1查询、缺失预加载、未索引查询和低效模式。检查:循环中的Repo.all、带Repo调用的Enum.map、缺失preload、WHERE/JOIN列上无索引的查询。”

LiveView轨道(默认或--focus liveview):

启动elixir-phoenix:elixir-reviewer,提示: “分析LiveView内存问题:大型分配、列表缺失流、无界增长的分配、繁重的handle_info处理、慢操作缺失assign_async。”

OTP轨道(仅--focus otp时):

启动elixir-phoenix:otp-advisor,提示: “分析OTP瓶颈:GenServer邮箱增长、热路径中的同步调用、并行工作缺失Task.async、读密集型状态的ETS机会。”

步骤3: 优先处理发现

在2x2矩阵中为每个发现评分:

低努力 高努力
高影响 优先执行 计划
低影响 快速胜利 跳过

高影响 = 影响响应时间、每个用户的内存或查询数量。 低努力 = 单个文件更改,无需迁移。

步骤4: 呈现前5名

按优先级排序呈现发现:

## 性能分析: {范围}

### 1. {发现} — 优先执行
**影响**: {改进内容}
**位置**: {文件}:{行号}
**当前**: {问题模式}
**修复**: {优化模式}
**预计收益**: {例如,"消除N+1,将查询从O(n)减少到O(1)"}

### 2. {发现} — 计划
...

步骤5: 提供后续步骤

您希望如何继续?

- `/phx:plan` — 规划优化
- `/phx:work` — 直接应用最高优先级修复
- `/phx:investigate` — 深入调查特定发现

Tidewave集成

如果Tidewave MCP可用:

  • 使用mcp__tidewave__project_eval在可疑查询上运行Repo.query!("EXPLAIN ANALYZE ...")
  • 使用mcp__tidewave__project_eval检查Process.info(pid, :message_queue_len)以查找GenServer瓶颈
  • 使用mcp__tidewave__execute_sql_query检查缺失索引

参考资料

  • references/benchmarking.md — Benchee模式、性能分析、火焰图