procpath
一个 Python 实现的小工具,我们可以用来不断监控某个进程 (或者一组进程) 的资源使用情况,比如内存、CPU、IO 等。使用说明在这里:Procpath · PyPI
pipx install Procpath
安装即可,然后使用这个命令先来生成一个统计数据存储在 sqlite,还可以生成统计图:
我之前排查一个内存问题时就用这个工具来调试,非常方便。比如我要统计 image-api
这个进程的内存情况,并生成图就使用下面这个脚本:
nohup ./image-api-go > infer.log &
sleep 3
pid=`pidof ./image-api-go`
echo "begin record $pid ..."
rm -rf ff.sqlite
/home/coder/.local/bin/procpath record -i 1 -r 60 -d ff.sqlite -p $pid
/home/coder/.local/bin/procpath plot -d ff.sqlite -q rss -p $pid -f rss.svg
echo "recorded $pid ...."
如果你看看 procpath 的代码发现也非常简单,就是通过 Linux 系统下的 /proc/{pid}
下面的数据来进行统计的:
/proc/{pid}/stat
:进程资源统计/proc/{pid}/io
:进程 IO 相关统计/proc/{pid}/fd
:进程句柄
具体通过 man proc
查询 Linux proc 相关的文档。类似的还有我以前记录过的 调优的小工具 RunLim。
Hyperfine
sharkdp/hyperfine: A command-line benchmarking tool
这个 Rust 命令行工具可以用来批量跑程序,找出程序的耗时区间,生成的结果可以输出为 JOSN 格式,这样能用来可视化对比结果。
比如我们使用这个工具来对比 youki
、crun
、runc
的性能,add the benchmark result to README, containers/youki
hyperfine --prepare 'sudo sync; echo 3 | sudo tee /proc/sys/vm/drop_caches' --warmup 10 --min-runs 100 'sudo ./youki create -b tutorial a && sudo ./youki start a && sudo ./youki delete -f a'
hyperfine --prepare 'sudo sync; echo 3 | sudo tee /proc/sys/vm/drop_caches' --warmup 10 --min-runs 100 'sudo crun create -b tutorial a && sudo crun start a && sudo crun delete -f a'
hyperfine --prepare 'sudo sync; echo 3 | sudo tee /proc/sys/vm/drop_caches' --warmup 10 --min-runs 100 'sudo runc create -b tutorial a && sudo runc start a && sudo runc delete -f a'
跑出结果如下:
这个工具的作者用 Rust 写了好几个非常好用的命令行工具,比如 fd
快速查找文件等。
wrk
wg/wrk: Modern HTTP benchmarking tool
这个工具可以用来批量发起 HTTP 请求,使用方法很简单:
wrk -t12 -c400 -d30s http://127.0.0.1:8080/index.html
使用 12 个线程、保持 400 个 HTTP 连接,跑 30 秒。我以前使用这个工具来对接口进行压力测试,非常方便。
还有个 Python 的测试工具叫作 Locust - A modern load testing framework,这个功能更强大一些,我们可以写 Python 脚本来扩展测试逻辑,当然也可以用来做压力测试。