2 个版本

0.1.9 2022年2月10日
0.1.8 2021年5月21日

#217性能分析

Apache-2.0 OR MIT

55KB
717

sirun 🚨

sirun(发音类似于“siren”)是一个用于获取进程在整个生命周期中基本性能测量值的工具。它从内核获取内存和计时信息,并允许将Statsd消息发送到udp://localhost:$SIRUN_STATSD_PORT(端口号由sirun随机分配,但您也可以自行设置),这些信息将包含在输出度量值中。

此工具旨在用于运行时间较短的基准测试,而不是用于不与外部交互就死亡的长生命周期的进程。当然,您可以使用它来运行长生命周期的进程,但这并不是它的强项。

安装

通过 Cargo

cargo安装 sirun

从版本发布

为每个支持的平台提供了发布包。将二进制文件解压缩到某个位置并使用它。

从源代码

请确保您已安装rustup,并使用它确保您已启用最新的稳定 Rust 工具链。

从本地仓库克隆

cargo安装 .

不本地克隆

通过 SSH

cargo安装 --gitssh://[email protected]:22/DataDog/sirun.git --分支main

或者通过 HTTPS

cargo安装 --githttps://github.com/DataDog/sirun.git --分支main

用法

请参阅文档

创建一个包含以下属性的 JSON 或 YAML 文件

  • name:这将包含在结果 JSON 中。
  • run:要运行和测试的命令。您可以像 shell 命令一样格式化此命令,但请注意,它将不会使用 shell 作为中间进程。请注意,子进程将通过内核进行测量,但它们仍然可以使用 Statsd。要在此进程内部将度量值发送到 Statsd,请将它们发送到udp://localhost:$SIRUN_STATSD_PORT
  • setup:在测试之前运行的命令。使用此命令确保服务的可用性或检索一些最后时刻的依赖项。它可以与 run 的格式相同。它将在退出状态码为 0 之前以 1 秒的间隔重复运行。
  • teardown:在测试之后运行的命令。这与 setup 的运行方式相同,只是在测试运行之后而不是之前。
  • timeout:如果提供,这是 run 测试可以运行的最大时间,以秒为单位。如果超时,sirun 将无结果退出,终止测试。
  • env:一组环境变量,可用于 runsetup 程序。这应该是一个对象,其键是环境变量名称,其值是环境变量值。
  • iterations:运行 run 测试的次数。每次迭代的结果将包含在最终的 JSON 中的 iterations 数组中。默认值为 1。
  • cachegrind:如果设置为 true,将在正常运行测试之后使用 cachegrind 向结果 JSON 添加指令计数。它只会发生一次,并插入到顶层 JSON 中,不管 iterations 如何。这需要在您的系统上安装 valgrind
  • variants:一个数组或对象,其值是配置对象,其属性可以是上述任何属性。不建议在变体中包含 name。变体名称(如果 variants 是一个对象)或索引(如果 variants 是一个数组)将包含在最终的 JSON 中。

环境变量

  • GIT_COMMIT_HASH:如果设置,将在结果中包含一个 version
  • SIRUN_NAME:如果设置,将在结果中包含一个 name。这将覆盖在配置 JSON/YAML 中设置的任何 name 属性。
  • SIRUN_NO_STDIO:如果设置,将抑制测试程序的输出。
  • SIRUN_VARIANT:选择要运行的测试变体。如果配置 JSON/YAML 中存在 variants 属性,并且此变量未设置,则将运行 所有 变体,逐个运行,每个变体都有自己的输出 JSON 行。
  • SIRUN_STATSD_PORT:用于测试程序和 sirun 之间 Statsd 通信的 localhost 上的 UDP 端口。默认情况下,将分配一个随机端口。您应该从测试程序中读取此变量以确定要发送数据的端口。

示例

这是一个示例 JSON 文件。作为一个 setup 脚本的例子,它正在检查连接到 Google 的连通性。运行脚本 run 没做什么,但它确实通过 Statsd 发送了一个度量(名称为 udp.data 值为 50)。它在 4 秒后超时,我们不太可能达到这一点。

{
  "setup": "curl -I http://www.google.com -o /dev/null",
  "run": "bash -c \"echo udp.data:50\\|g > /dev/udp/127.0.0.1/$SIRUN_STATSD_PORT\"",
  "timeout": 4
}

然后,您可以将此 JSON 文件传递给命令行上的 sirun。请记住,您可以使用环境变量设置输出中的 git 提交哈希和测试名称。

SIRUN_NAME=test_some_stuff GIT_COMMIT_HASH=123abc sirun ./my_benchmark.json

这将输出类似以下的内容。

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
{"version":"123abc","name":"test_some_stuff",iterations:[{"user.time":6389.0,"system.time":8737.0,"udp.data":50.0,"max.res.size":2240512.0}]}

摘要

如果您提供了--summarize选项,sirun将切换到总结模式。在总结模式下,它将从stdin读取,期待从之前sirun运行中逐行输出的结果。然后它将按测试名称和变体进行聚合,并针对迭代提供总结统计。输出为格式化的JSON。

例如:

$ sirun foo-test.json >> results.ndjson
$ sirun bar-test.json >> results.ndjson
$ sirun baz-test.json >> results.ndjson
$ cat results.ndjson | sirun --summarize > summary.json

许可协议

根据您的选择,以下任一许可协议:

供您选择。

贡献

除非您明确表示,否则任何有意提交并由您包含在本作品中的贡献(如Apache-2.0许可中定义的),将按照上述方式双许可,而不附加任何额外条款或条件。

依赖关系

约10-20MB
约291K SLoC