后台开发经常需要对服务进行压力测试,下面介绍常用的压测工具。
webbench 是常用的网站压力测试工具,webbench用C语言编写,代码仅有区区几百行。
webbench 使用简单,但是功能也比较局限。
Usage如下所示:
webbench [option]... URL
-f|--force Don't wait for reply from server.
-r|--reload Send reload request - Pragma: no-cache.
-t|--time <sec> Run benchmark for <sec> seconds. Default 30.
-p|--proxy <server:port> Use proxy server for request.
-c|--clients <n> Run <n> HTTP clients at once. Default one.
-9|--http09 Use HTTP/0.9 style requests.
-1|--http10 Use HTTP/1.0 protocol.
-2|--http11 Use HTTP/1.1 protocol.
--get Use GET request method.
--head Use HEAD request method.
--options Use OPTIONS request method.
--trace Use TRACE request method.
-?|-h|--help This information.
-V|--version Display program version.
通过简单的命令行即可启动压力测试。
如测试http://blog.csdn.net/ 如下:
./webbench -c 100 -t 60 http://blog.csdn.net/
参数含义参考Usage, 程序启动后,会创建100个线程用于向网站发送请求。
运行log如下:
Webbench - Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.
Request:
GET / HTTP/1.0
User-Agent: WebBench 1.5
Host: blog.csdn.net
Runing info: 100 clients, running 60 sec.
Speed=20420 pages/min, 126263 bytes/sec.
Requests: 20420 susceed, 0 failed.
最后两行是压测结构, 有测试的请求速度,成功的请求量、失败的请求量。
通过调用fork()创建子进程,模拟多个客户端。
代码仅有600行左右,基本按照如下流程:
main()
int speed=0; // 成功的请求量
int failed=0; // 失败的请求量
int bytes=0; // 成功读取的字节数子进程测试结束后,会把这三个全局变量的值通过pipe传递给初始进程。build_request()
bench()
benchcore()
bench()
+ benchcore()
+ **测试数据如何统计?**
fork出子进程之前,在bench()中通过pipe()常见了管道。进程间通信通过pipe实现。 程序中定义了三个全局变量用于统计数据:
int speed=0; // 成功的请求量
int failed=0; // 失败的请求量
int bytes=0; // 成功读取的字节数
子进程测试结束后,会把这三个全局变量的值通过pipe传递给初始进程。
+ **测试时间佮控制(子进程何时销毁)?**
在benchcore中通过SIGALRM信号设置测试时间。benchtime到达后,静态函数中的变量timerexpired会别置为1, 而每次发送请求之前会先检查下timerexpired的值。
+ **优化点:** 在fork之前,初始进程先尝试与网站创建socket连接,验证下网站的连通性。避免后面fork大量子进程后,发起大量无用的连接。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。