3 个稳定版本

使用旧的 Rust 2015

2.0.3 2017年5月1日
2.0.2 2017年4月20日
2.0.1 2017年4月17日
1.0.0-nightly.20160404 2016年4月4日
1.0.0-nightly.20160324 2016年3月24日

#132 in 性能分析

每月41次下载

Apache-2.0

160KB
3.5K SLoC

rpc-perf - RPC 性能测试

rpc-perf 是为了帮助测量缓存系统的性能而创建的。我们发现这个工具对于验证缓存后端性能、内核版本和系统调整的影响,以及测试新的硬件平台和网络变化都很有用。

注意 rpc-perf 可以写入目标位置,并且可以生成许多请求

  • 在服务器中的数据可能丢失/损坏/损坏等情况下运行
  • 在您了解在网络中发送大量流量的影响时运行

内容

获取 rpc-perf

rpc-perf 通过 rust 附带的 cargo 命令构建。如果您还没有安装 rust,我建议使用 multirust 来管理您的 rust 安装。否则,请按照 rust-lang.org 上的说明来安装 rust 和 cargo。rpc-perf 面向稳定 rust。

从源码构建

安装 rust 后,克隆此仓库,然后进入此文件夹

git clone https://github.com/twitter/rpc-perf.git
cd rpc-perf
cargo build --release

如果您想使用 x86_64 TSC 进行计时,请使用夜间 rust

git clone https://github.com/twitter/rpc-perf.git
cd rpc-perf
cargo build --release --features asm

这将生成一个位于 ./target/release/rpc-perf 的二进制文件,可以直接在该位置运行或复制到系统上的更方便位置。

配置

rpc-perf 的配置是通过 TOML 配置文件和命令行参数的组合来实现的。工作负载始终在配置文件中指定。一些运行时参数通过命令行传递。尽可能的情况下,命令行可以覆盖配置文件。例如,可以将协议覆盖为测试与相同工作负载的 memcache 或 redis。

某些配置仅通过命令行参数进行

  • --server [HOST:PORT] 目标服务器 始终 是必需的。您可以选择多个。
  • --trace [FILE] 可选的延迟跟踪文件
  • --waterfall [FILE] 可选的 PNG 水波图

所有其他测试配置参数都可通过 TOML 配置文件和/或命令行获得。当两者都指定时,命令行参数将具有优先权。

示例配置可在此项目的 configs 目录中找到。命令行参数通过 --help 选项进行说明。配置参数的命名与选项相同:例如,命令行上的 --protocol 和文件中的 protocol 是相同的

示例用法

请注意 在运行 rpc-perf 时请谨慎操作

# display help
./target/release/rpc-perf --help

# memcache get hit
./target/release/rpc-perf --config configs/hotkey_hit.toml --server 127.0.0.1:11211

# memcache get miss
./target/release/rpc-perf --config configs/hotkey_hit.toml --server 127.0.0.1:11211 --flush

# redis mixed workload
./target/release/rpc-perf ---config configs/mixed_workload.toml -server 127.0.0.1:6379 --protocol redis

# run the same test against memcache and redis
./target/release/rpc-perf --config configs/default.toml --server 127.0.0.1:11211 --protocol memcache
./target/release/rpc-perf --config configs/default.toml --server 127.0.0.1:6379 --protocol redis

示例输出

$ rpc-perf --server 127.0.0.1:11211 --config hotkey_hit.toml --windows 1
2016-03-25 15:00:37 INFO  [rpc-perf] rpc-perf 1.0.0-nightly.20160324 initializing...
2016-03-25 15:00:37 INFO  [rpc-perf] -----
2016-03-25 15:00:37 INFO  [rpc-perf] Config:
2016-03-25 15:00:37 INFO  [rpc-perf] Config: Server: 127.0.0.1:11211 Protocol: memcache
2016-03-25 15:00:37 INFO  [rpc-perf] Config: IP: IP::Any TCP_NODELAY: false
2016-03-25 15:00:37 INFO  [rpc-perf] Config: Threads: 1 Connections: 1
2016-03-25 15:00:37 INFO  [rpc-perf] Config: Windows: 1 Duration: 60
2016-03-25 15:00:37 INFO  [rpc-perf] -----
2016-03-25 15:00:37 INFO  [rpc-perf] Workload:
2016-03-25 15:00:37 INFO  [rpc-perf] Workload 0: Method: get Rate: 0
2016-03-25 15:00:37 INFO  [rpc-perf] Parameter: Static { size: 1, seed: 0 }
2016-03-25 15:00:37 INFO  [rpc-perf] Workload 1: Method: set Rate: 1
2016-03-25 15:00:37 INFO  [rpc-perf] Parameter: Static { size: 1, seed: 0 }
2016-03-25 15:00:37 INFO  [rpc-perf] Parameter: Random { size: 128, regenerate: false }
2016-03-25 15:00:37 INFO  [rpc-perf] -----
2016-03-25 15:00:37 INFO  [rpc-perf] Connecting...
2016-03-25 15:00:37 INFO  [rpc-perf] Client: 0
2016-03-25 15:00:37 INFO  [rpc-perf] Connections: 1 Failures: 0
2016-03-25 15:01:37 INFO  [rpc-perf] -----
2016-03-25 15:01:37 INFO  [rpc-perf] Warmup complete
2016-03-25 15:02:37 INFO  [rpc-perf] -----
2016-03-25 15:02:37 INFO  [rpc-perf] Window: 1
2016-03-25 15:02:37 INFO  [rpc-perf] Requests: 986233 Ok: 986233 Miss: 0 Error: 0 Closed: 0
2016-03-25 15:02:37 INFO  [rpc-perf] Rate: 16437.21 rps Success: 100.00 % Hitrate: 100.00 %
2016-03-25 15:02:38 INFO  [rpc-perf] Latency: min: 24103 ns max: 37876243 ns avg: 49437 ns stddev: 83165 ns
2016-03-25 15:02:38 INFO  [rpc-perf] Percentiles: p50: 47393 ns p90: 55116 ns p99: 75688 ns p999: 224553 ns p9999: 3929854 ns

实践

  • 在运行跨越更长时间段的测试之前,先进行短时间的测试 --duration 1 --windows 1 用于快速烟测试
  • 在进行峰值吞吐量基准测试时,请确保运行足够多的工人,并保持足够的连接以保持它们忙于发送请求和读取响应。线程过少时,延迟会影响吞吐量。线程过多时,客户端可能会因为 CPU 而饿死
  • 在进行延迟基准测试时,请确保速率限制并比较各种速率。使用 --duration 60(默认值)将直方图锁定在一分钟间隔,以与报告百分比的客户端相匹配
  • 记录您的配置和结果,这有助于您重复实验并可靠地比较结果

功能

  • 高分辨率延迟指标
  • 支持 memcache 和 redis 协议
  • mio 用于异步网络
  • 可选的跟踪文件以进行进一步分析
  • 可选的延迟水波可视化
  • 速率限制的工作负载
  • 混合工作负载(get/set/...)

未来工作

  • 扩展 memcache 和 redis 协议的命令集
  • UDP 支持
  • 命令日志回放

贡献

  • 在 github 上分叉
  • 克隆您的分叉
  • 创建一个功能分支
  • 别忘了运行 rustfmt
  • 推送到您的功能分支
  • 创建一个 pull request

依赖关系

~10MB
~177K SLoC