#prometheus-metrics #http-request #benchmarking #performance #requests #networking #rate

app perf-gauge

测量网络服务的性能。支持快照或持续监控,并支持Prometheus指标。

28 个版本

0.1.20 2023年3月27日
0.1.18 2022年8月8日
0.1.17 2022年7月10日
0.1.15 2022年3月21日
0.0.7 2020年11月30日

406网络编程 类别中排名

Download history 1/week @ 2024-03-14 7/week @ 2024-03-28 2/week @ 2024-04-04

每月 93 次下载

MIT/Apache

6.5MB
2.5K SLoC

Crate Clippy/Fmt Tests Coverage Status

概述

网络服务的基准测试工具。目前仅限于HTTP(H1或H2,通过TCP或TLS)。但很容易扩展到其他协议。

它支持以下模式

  1. ab 类模式。只需向指定端点发送流量一段时间,或指定请求数量。
    1. 无限请求速率(以找到最大吞吐量)。
    2. 选择请求速率和并发级别。
    3. 测量精度到 µs
  2. 线性增加请求速率,例如,每分钟增加 1,000,以查看服务如何随着负载而扩展。
  3. 它可以通过 pushgateway 将指标报告给 Prometheus

例如:

发出的指标包括

  • request_count - 所有请求的计数器
  • success_count - 仅成功请求的计数器
  • bytes_count - 总传输字节数
  • response_codes - 响应代码(200、400等)的计数器
  • success_latency - 仅成功请求的延迟直方图
  • error_latency - 失败请求(如有)的延迟直方图
  • throughput - 仅成功请求的吞吐量直方图
  • latency - 所有请求的延迟直方图
  • latency_{statistic} - {statistic} = {min, mean, max, stddev, p50, p90, p99, p99_9, p99_99, tm99, tm99.9, tm99.99} - 延迟统计仪表

例如,对不同语言的TCP代理进行基准测试:C、C++、Rust、Golang、Java、Python。

安装

对于MacOSUbuntuWindows,您可以使用发布部分中的二进制文件。

或者您可以在您的机器上构建它

安装cargo - 按照这些说明进行。

在Debian上解决OpenSSL构建问题。例如,在Debian上

sudo apt-get install pkg-config libssl-dev

Red-Hat

sudo dnf install pkg-config openssl-devel
# or
sudo yum install pkg-config openssl-devel

然后

$ cargo install perf-gauge --features full

支持的功能

  • default - 如果没有指定功能,则仅支持http流量
  • tls-native - TLS支持(基于OpenSSL
  • tls-boring - TLS支持(基于BoringSSL)。不支持自签名证书。
  • report-to-prometheus - 支持使用Prometheus进行指标收集
  • full - report-to-prometheus + tls-native
  • full-boring - report-to-prometheus + tls-boring

用法

$ perf-gauge help 
Gauging performance of network services. Snapshot or continuous, supports Prometheus metrics.

USAGE:
    perf-gauge [OPTIONS] <SUBCOMMAND>

OPTIONS:
    -c, --concurrency <CONCURRENCY>
            Concurrent clients. Default `1` [default: 1]

        --continuous
            If it's a part of a continuous run. In this case metrics are not reset at the end to
            avoid saw-like plots

    -d, --duration <DURATION>
            Duration of the test

    -h, --help
            Print help information

    -m, --max_iter <MAX_ITER>
            takes_value "The number of iterations with the max rate. By default `1` [default: 1]

    -n, --num_req <NUM_REQ>
            Number of requests per client

    -N, --name <NAME>
            Test case name. Optional. Can be used for tagging metrics

        --prometheus <PROMETHEUS>
            If you'd like to send metrics to Prometheus PushGateway, specify the server URL. E.g.
            10.0.0.1:9091

        --prometheus_job <PROMETHEUS_JOB>
            Prometheus Job (by default `pushgateway`)

    -r, --rate <RATE>
            Request rate per second. E.g. 100 or 0.1. By default no limit

        --rate_max <RATE_MAX>
            Max rate per second. Requires --rate-step

        --rate_step <RATE_STEP>
            Rate increase step (until it reaches --rate_max)
            
        --request_timeout <REQUEST_TIMEOUT>
           Timeout of a single request. E.g. "--request_timeout 30s". Timeouts are treated as fatal
           errors

    -V, --version
            Print version information

SUBCOMMANDS:
    help    Print this message or the help of the given subcommand(s)
    http    Run in HTTP(S) mode

http命令的帮助

$ perf-gauge help http
Run in HTTP(S) mode

USAGE:
    perf-gauge http [OPTIONS] [TARGET]...

ARGS:
    <TARGET>...    Target, e.g. https://my-service.com:8443/8kb Can be multiple ones (with
                   random choice balancing)


OPTIONS:
    -B, --body <BODY>                Body of the request. Could be either `random://[0-9]+`,
                                     `file://$filename` or `base64://${valid_base64}`. Optional
        --conn_reuse                 If connections should be re-used
    -E, --error_stop <ERROR_STOP>    Stop immediately on error codes. E.g. `-E 401 -E 403`
    -h, --help                       Print help information
    -H, --header <HEADER>            Headers in \"Name:Value1\" form. Can be provided multiple
                                     times. It can contain multiple values, e.g.
                                     \"Name:Value1:Value2:Value3\". In this case a random one is
                                     chosen for each request
        --http2_only                 Enforce HTTP/2 only
        --ignore_cert                Allow self signed certificates
    -M, --method <METHOD>            Method. By default GET
    -V, --version                    Print version information

例如,使用单次运行测试端点,5秒(最大可能的请求速率)

$ perf-gauge --concurrency 10 \
               --duration 1m \
               http https://127.0.0.1/10kb --conn_reuse

参数

  • --concurrency 10 - 生成负载的并发客户端数量
  • --duration 1m - 步骤持续时间 1m(或 10s5m等)
  • http http://local-nginx.org/10kb --conn_reuse - 在http模式下运行到指定的端点,重用连接。

将性能指标报告给Prometheus

另一个用例是增加请求速率并观察延迟如何降低。

例如,每分钟增加1,000 RPS

export PROMETHEUS_HOST=10.138.0.2

$ perf-gauge --concurrency 10 \
               --request_timeout 30s \
               --rate 1000 --rate_step 1000 --rate_max 25000 \
               --max_iter 15 \
               --duration 1m \
               --name nginx-direct \
               --prometheus $PROMETHEUS_HOST:9091 \
               http https://127.0.0.1/10kb --conn_reuse --ignore_cert
  • --concurrency 10 - 生成负载的并发客户端数量
  • --request_timeout 30s - 如果响应超过30秒,则不等待响应并停止执行。
  • --rate 1000 --rate_step 1000 --rate_max 25000 - 以1000 rps的速率开始,然后在每个步骤后添加1000 rps,直到达到25k。
  • --duration 1m - 步骤持续时间 1m
  • --max_iter 15 - 以最大速率执行15次迭代
  • --name nginx-direct - 测试名称(用于将指标报告到prometheus
  • --prometheus $PROMETHEUS_HOST:9091 - 将指标推送到 Prometheus 的 host:port 推送网关。
  • http http://local-nginx.org/10kb --conn_reuse - 以 https 模式运行到指定端点,重用连接且不检查证书。

依赖项

~11–31MB
~511K SLoC