前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >常用压测工具

常用压测工具

原创
作者头像
windealli
修改2018-09-27 16:23:32
3.7K0
修改2018-09-27 16:23:32
举报
文章被收录于专栏:windealliwindealli

后台开发经常需要对服务进行压力测试,下面介绍常用的压测工具。

webbench

webbench 是常用的网站压力测试工具,webbench用C语言编写,代码仅有区区几百行。

webbench 使用简单,但是功能也比较局限。

使用方法

Usage如下所示:

代码语言:txt
复制
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/ 如下:

代码语言:txt
复制
./webbench -c 100 -t 60 http://blog.csdn.net/

参数含义参考Usage, 程序启动后,会创建100个线程用于向网站发送请求。

运行log如下:

代码语言:txt
复制
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行左右,基本按照如下流程:

  1. 解析命令行参数 main()int speed=0; // 成功的请求量 int failed=0; // 失败的请求量 int bytes=0; // 成功读取的字节数子进程测试结束后,会把这三个全局变量的值通过pipe传递给初始进程。
  2. 构建请求 build_request()
  3. fork进程 bench()
  4. 发送请求benchcore()
  5. 统计 bench() + benchcore()

关键点:

+ **测试数据如何统计?**

fork出子进程之前,在bench()中通过pipe()常见了管道。进程间通信通过pipe实现。 程序中定义了三个全局变量用于统计数据:

代码语言:txt
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • webbench
    • 使用方法
      • 实现原理
        • 代码结构
          • 关键点:
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档