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
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