当思源笔记(SiYuan)出现卡顿、响应慢或 CPU/内存占用过高时,火焰图(Flame Graph)是一种强大的可视化工具,可以帮助快速定位性能瓶颈。本指南介绍如何生成和分析火焰图,优化思源性能。
1. 火焰图简介
火焰图是一种直观的性能分析图表,用于展示程序在运行时的函数调用栈及其耗时情况:
- X 轴 表示时间(采样次数),Y 轴 表示调用栈深度。
- 每一层 代表一个函数调用,宽度 表示该函数占用的 CPU 时间。
- 最宽的部分 通常是性能瓶颈所在。
示例火焰图(来自 perf
或 py-spy
):
text
复制
下载
_______________ | main() | |______|_______| | funcA() | <-- 耗时较长 |______|_______| | funcB() | |______|_______|
2. 生成火焰图(以 Linux 为例)
方法 1:使用 perf
(适用于 C/C++/Rust 程序)
-
安装
perf
和依赖
bash复制
下载
sudo apt install linux-tools-common linux-tools-generic # Ubuntu/Debian sudo yum install perf # CentOS/RHEL
-
采集性能数据
bash复制
下载
# 获取思源笔记的PID(假设进程名为 siyuan) pidof siyuan # 采样CPU调用栈(30秒) sudo perf record -F 99 -p <PID> -g -- sleep 30
-
生成火焰图
bash复制
下载
# 转换数据为可读格式 sudo perf script > out.perf # 使用 FlameGraph 工具生成SVG git clone https://github.com/brendangregg/FlameGraph.git cd FlameGraph ./stackcollapse-perf.pl < ../out.perf | ./flamegraph.pl > ../flame.svg
方法 2:使用 py-spy
(适用于 Python 程序)
如果思源部分模块是 Python 实现(如插件),可用 py-spy
采样:
bash
复制
下载
pip install py-spy py-spy record -p <PID> -o flame.svg --duration 30
3. 分析火焰图
- 打开生成的
flame.svg
(浏览器可直接查看)。 - 查找最宽的“塔”:
- 较宽的块代表耗时较长的函数。
- 检查是否涉及:
- 频繁的 I/O 操作(如文件读写、网络请求)。
- 高 CPU 计算(如正则匹配、复杂渲染)。
- 锁竞争(如多线程阻塞)。
- 常见优化点:
- 数据库查询慢:优化 SQL 或减少频繁查询。
- 渲染卡顿:检查前端代码(如 DOM 操作过多)。
- 插件性能问题:禁用可疑插件测试。
4. 针对性优化示例
案例 1:思源启动慢
- 火焰图显示:大量时间花在加载笔记文件上。
- 优化方案:
- 启用延迟加载(分块加载笔记)。
- 减少启动时自动打开的文档数量。
案例 2:输入卡顿
- 火焰图显示:频繁触发语法高亮或实时渲染。
- 优化方案:
- 调高渲染延迟(如从 200ms 改为 500ms)。
- 关闭不必要的实时预览功能。
案例 3:内存泄漏
- 结合
valgrind
或heaptrack
分析内存增长点。
5. 其他工具补充
工具 | 适用场景 | 命令示例 |
---|---|---|
htop | 实时监控 CPU/内存 | htop |
strace | 跟踪系统调用 | strace -p <PID> -T -e open,read |
valgrind | 内存泄漏检测 | valgrind --leak-check=full ./siyuan |
6. 提交问题报告
如果问题无法定位,可附上火焰图提交到思源 GitHub 仓库:
- 信息包括:
- 思源版本、操作系统。
- 火焰图文件(
.svg
)。 - 复现步骤(如“打开大型文档时卡顿”)。
总结:火焰图能快速定位性能瓶颈,结合代码逻辑分析可针对性优化。建议定期采样关键操作(如启动、搜索、渲染),保持思源流畅运行。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于