https://github.com/benfred/py-spy py-spy 是 Python 程序的采样分析器。它可以让您直观地看到 Python 程序花费时间的情况,而无需重新启动程序或以任何方式修改代码。 py-spy 的开销极低:它是为了速度而用 Rust 编写的,并且不与分析的 Python 程序在同一进程中运行。
- 首先编译 x86_64的,我们的生成环境都是centos7的,所以先在centos:7 容器里装好rust , libunwind-devel, 就cargo build —release 开始编译,但报错了:
/usr/bin/ld: /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/libunwind-ptrace.a(_UPT_access_reg.o): relocation R_X86_64_32S against symbol `_UPT_reg_offset' can not be used when making a shared object; recompile with -fPIC
这串信息 问了AI,是说gcc版本太老了,推荐用更新一点的gcc,
我不想继续折腾centos了,于是想编译musl 版本的 不想依赖glibc 这样就可以在不同linux版本上跑 比如openeuler centos7
从github https://github.com/benfred/py-spy/blob/master/.github/workflows/build.yml 上已经发现作者已经贴心的提供了交叉编译的工具
用这个作者提供的 docker.io/benfred/rust-musl-cross:x86_64-musl docker镜像 进行编译就好了
- 然后是arm64的 也是交叉编译
docker run --rm -it docker.io/benfred/rust-musl-cross:aarch64-musl bash
#容器里
git clone https://github.com/benfred/py-spy
cd py-spy/
cargo build --release
root@c94b084a4e1b:/home/rust/src/py-spy# ls target/aarch64-unknown-linux-musl/release/py-spy
target/aarch64-unknown-linux-musl/release/py-spy
- 接下来是mips64el 也就是龙芯的 没有可用的交叉编译的环境 在github action之前用qemu编译过其他rust mips的,最终发现在龙芯上无法运行 依赖libc版本太高了
还是把rust包同步到龙芯的机器上 手动编译比较好
这时候就会用到cargo-local-registry这个 在外网的机器做如下操作
cargo install cargo-local-registry
cd py-spy
cargo local-registry --sync ./Cargo.lock ~/my-cargo-registry/
tar zcf my-cargo-registry.tar.gz my-cargo-registry/
到龙芯的机器先离线安装 https://static.rust-lang.org/dist/rust-1.70.0-mips64el-unknown-linux-gnuabi64.tar.gz (解压运行install.sh
)把my-cargo-registry.tar.gz解压,同时编辑下 config.toml 这样可以离线编译了
goblin 以及 py-spy都是改过的 https://github.com/wynemo/py-spy https://github.com/wynemo/goblin
cargo.toml里修改
+goblin = { path = "../goblin" }
直接编译 cargo build --release