#load-testing #testing-tools #tcp #tool #async #connection #read

bin+lib clobber

基于异步 Rust 的 TCP 压力测试工具

6 个版本

0.3.0 2019 年 11 月 5 日
0.2.2 2019 年 9 月 9 日
0.2.1 2019 年 8 月 21 日
0.1.1 2019 年 7 月 3 日

#25#load-testing

MIT 许可证

33KB
588 行代码(不含注释)

clobber

clobber 是一个简单的 TCP 压力测试工具,使用 Rust 编写。配置负载测试可能是一项繁重的工作。 clobber 的目标是简单地向主机发送大量流量,很多时候这已经足够了。 clobber 尝试提供合理的默认设置,以及简单的旋钮来调整,如果您需要更高级的配置。

clobber 使用 async/await 语法,这目前需要 nightly 分支,但目标是稳定在 1.39 版本左右。该项目是为了尝试新语法的可行性,因为网络 I/O 密集型工具非常适合异步并发模型。

我对这个项目的目标是让代码高效、易于阅读且易于使用。如果您发现某个区域效率低下或令人困惑,我非常欢迎您在 issue 或 PR 中提供反馈。

示例

# Only --target/-t is mandatory
echo "GET / HTTP/1.1\r\nHost: localhost:8000\r\n\r\n" | clobber --target=0.0.0.0:8000
# Other options can be provided via their own option flags. See Usage for full details.

TARGET=0.0.0.0:8000
CONNECTIONS=10000
DURATION=1m30s
THREADS=4

# An easy pattern is to save a request to a file, and send it to clobber via the stdin pipe
cat my_request | clobber \
    --target=$TARGET \
    --connections=$CONNECTIONS \
    --duration=$DURATION \
    --threads=$THREADS

用法

clobber 0.1
tcp load testing tool

USAGE:
    clobber [FLAGS] [OPTIONS] --target <target>

FLAGS:
    -h, --help       Prints help information
    -v               Sets the log level, from -v to -vvv
    -V, --version    Prints version information

OPTIONS:
        --connect-timeout <connect-timeout>    Timeout for initial TCP syn timeout
    -c, --connections <connections>            Max number of open connections at any given time
    -d, --duration <duration>                  Length of the run (e.g. 5s, 10m, 2h, etc...)
    -l, --limit <limit>                        Total number of requests
        --rate <rate>                          Limit to a particular rate per-second.
        --read-timeout <read-timeout>          Timeout for reading response from target
    -t, --target <target>                      Host to clobber
        --threads <threads>                    Number of threads

解决 TCP 性能问题

打开文件限制

导致 TCP 带宽问题的常见原因是打开的文件数量。您可以使用 ulimit -n 来检查。如果您看到与打开文件数量相关的问题,您可以使用 ulimit 来提高此限制。如果不起作用,您可能需要编辑 /etc/security/limits.conf 来提高您账户的限制。

连接超时

TCP 握手的初始 syn 阶段有一个很长的超时时间;通常在数百秒。这由 /proc/sys/net/ipv4/tcp_syn_retries 控制,但即使您将其设置为很小的数字,单个超时也可能需要很长时间。这通常不是使用 clobber 测试本地运行的服务器时的主要问题,但如果您的握手不可靠,您可以尝试配置 connect-timeout 选项。

读取超时

如果你不知道应该读取多少数据,那么知道何时停止从TCP流中读取是很棘手的。这取决于协议,而clobber并不知道。如果服务器不发送一个EOF,你可能会长时间等待更多数据,这可能会阻塞连接。对于某些协议(例如HTTP),你可以发送一个像Connection: close这样的头部,以通知主机你将不再发送任何请求,并且它们应该在他们响应后发送一个EOF。这可以解决某些HTTP服务器的高吞吐量问题。如果这不可能,你应该配置read-timeout,但这确实会对高端性能(尤其是与大量连接一起使用时)产生一定影响。

依赖关系

~8–16MB
~200K SLoC