在软件开发中,性能优化是永恒的主题,尤其对于 Rust 这类追求极致效率的语言。如果你正在寻找一款简单高效、跨平台的性能分析工具,那么最近在社区中崭露头角的 samply 值得你花时间了解一下。
这是一个由 Rust 编写的命令行采样性能分析器,支持 macOS、Linux 和 Windows 三大平台,并与强大的 Firefox Profiler 无缝集成。它能让开发者轻松生成可视化的程序执行采样报告,通过火焰图、调用栈等直观图表,迅速定位性能热点,是日常开发与优化的有力助手。
什么是 samply?
简单来说,samply 是一个命令行采样型性能分析器,由 Markus Stange 开发并开源在 GitHub 上。它的核心代码 99.6% 由 Rust 实现,这确保了其自身的性能与跨平台稳定性。
它的工作原理是定时(默认 1ms,即 1000Hz)采集正在运行程序的线程栈信息。在 macOS 和 Windows 上,它能捕获 CPU 上和 CPU 外的样本;在 Linux 上则主要关注 CPU 上样本。采集到的数据会存储在本地,并通过一个本地 Web 服务器提供符号化和源码查看功能。其用户界面直接基于成熟的 Firefox Profiler,所有数据都在本地处理,隐私性有保障。
相比于传统的 perf、gprof 等工具,samply 的优势在于开箱即用的简洁体验:
- 安装使用简单:无需复杂配置,一条命令即可开始分析。
- 自动可视化:分析结束后自动在浏览器中打开交互式报告界面。
- 现代交互体验:支持火焰图、调用树、源码视图,并可进行缩放、筛选等操作。
- 低开销:作为采样型分析器,对目标程序的影响很小。
- 无需插桩:直接分析可执行文件,无需重新编译或添加特殊编译选项。
如何安装 samply?
1. 预编译安装(推荐)
对于大多数用户,这是最快捷的方式。
- macOS / Linux:使用官方提供的安装脚本。
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/mstange/samply/releases/download/samply-v0.13.1/samply-installer.sh | sh
- Windows (PowerShell):
powershell -ExecutionPolicy Bypass -c "irm https://github.com/mstange/samply/releases/download/samply-v0.13.1/samply-installer.ps1 | iex"
安装完成后,可以通过以下命令验证:
samply --version
2. 使用 Cargo 安装
如果你已经配置好了 Rust 开发环境,那么通过 cargo 安装会非常方便,无需额外权限。
cargo install --locked samply
3. 从源码编译
对于想体验最新特性或参与贡献的开发者,可以选择从源码编译。
git clone https://github.com/mstange/samply
cd samply
cargo build --release
编译完成后,可执行文件位于 target/release/samply。
基本使用方式
samply 的核心用法极其简单:在想分析的程序执行命令前加上 samply record 即可。
samply record ./my_program arg1 arg2
这条命令会执行以下操作:
- 启动你的程序
./my_program arg1 arg2。
- 在程序运行期间持续采样,收集 CPU 使用信息。
- 程序结束后,自动打开默认浏览器,展示可视化的性能分析报告。
在浏览器打开的 Firefox Profiler 界面中,你可以清晰地看到:
- 程序整体的 CPU 时间分布。
- 各个函数调用的耗时排名。
- 直观的火焰图(Flame Graph),展示函数调用栈与耗时关系。
- 若程序包含调试信息,还能关联到具体的源码行。

上图展示了在代码编辑器编写 Rust 程序后,使用 samply 分析生成的火焰图界面。
常见问题及注意事项
为了获得最佳的分析体验,你可能需要注意以下几点。
1. Linux 下的权限配置
Linux 内核默认对性能事件访问有严格限制。如果遇到权限错误,可以尝试以下方法临时调整:
echo '1' | sudo tee /proc/sys/kernel/perf_event_paranoid
更持久的配置方式是:
sudo sysctl kernel.perf_event_paranoid=1
对于 Linux 5.8 及以上内核,也可以直接授予 samply 相关能力:
sudo setcap 'cap_perfmon+ep' $(which samply)
如果遇到 mmap failed (EPERM) 错误,可能需要增加内存锁定限制:
sudo sysctl kernel.perf_event_mlock_kb=2048
2. 获取更详细的调用栈信息(针对 Rust 项目)
默认的 --release 构建会剥离调试信息,导致火焰图中出现大量 unknown 函数。建议在 Cargo.toml 中定义一个专用于性能分析的编译配置(profile):
[profile.profiling]
inherits = "release"
debug = true
然后使用此配置进行构建和分析:
cargo build --profile profiling
samply record ./target/profiling/your_rust_binary
这样就能在享受优化编译的同时,获得包含完整函数名和源码位置的分析报告。这种方法在定位复杂的 后端架构 性能问题时尤其有用。
3. Windows 上的额外步骤
在 Windows 上使用 samply 需要安装 Windows Performance Toolkit(可通过 Windows ADK 获取)。分析时可以使用 -a 选项记录所有进程,并可指定符号服务器来解析系统库的符号:
samply record -a \
--windows-symbol-server https://msdl.microsoft.com/download/symbols \
--breakpad-symbol-server https://symbols.mozilla.org/try/ \
--windows-symbol-server https://chromium-browser-symsrv.commondatastorage.googleapis.com
当前版本的适用边界
samaply 作为一个正在快速迭代的新工具,其定位非常明确:快速、简单地定位应用级别的性能瓶颈。它目前可能不适合以下高级场景:
- 需要精确的指令级计数,而非基于采样的概览。
- 无法修改
perf_event_paranoid 系统设置的 Linux 环境。
- 需要分析缓存未命中、分支预测错误等底层硬件性能计数器。
- 跨系统的综合报告、长时间的持续性分析或生产环境监控等高级需求。
总而言之,如果你需要一个能无缝融入开发流程、上手即用、并能提供清晰可视化洞察的工具来优化你的 Rust 或 C/C++ 程序,samply 是一个非常实用且友好的选择。它的出现,让性能分析不再是少数专家的专属领域。
希望这篇介绍能帮助你在 性能优化 的道路上多一件得心应手的工具。欢迎在云栈社区分享你的使用心得。
参考链接