常用压测工具

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

webbench

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行左右,基本按照如下流程:

  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实现。 程序中定义了三个全局变量用于统计数据:

int speed=0;  // 成功的请求量
int failed=0;    // 失败的请求量
int bytes=0;    // 成功读取的字节数

子进程测试结束后,会把这三个全局变量的值通过pipe传递给初始进程。

+ **测试时间佮控制(子进程何时销毁)?**

在benchcore中通过SIGALRM信号设置测试时间。benchtime到达后,静态函数中的变量timerexpired会别置为1, 而每次发送请求之前会先检查下timerexpired的值。

+ **优化点:** 在fork之前,初始进程先尝试与网站创建socket连接,验证下网站的连通性。避免后面fork大量子进程后,发起大量无用的连接。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员互动联盟

【专业技术】8大你不得不知的Android调试工具

1. 查看当前堆栈 1) 功能:在程序中加入代码,使可以在logcat中看到打印出的当前函数调用关系 2) 方法: new Exception(“print ...

58013
来自专栏乐沙弥的世界

Percona XtraDB Cluster GCache和Record-Set缓存

在Percona XtraDB集群中,有一个GCache和Record-Set缓存(也可称为事务写集缓存)的概念。如果您正在运行长事务,那么使用这两个缓存通常会...

1140
来自专栏JavaWeb

Java Source Attacher插件(Eclipse自动下载jar包源码)

3837

Web服务器压力测试工具Siege

Siege是一款HTTP压力测试和基准测试的实用工具,可用于在压力条件下对Web服务器的性能进行测量。它的评估依据包括传输数据量、服务器的响应时间、事务处理速率...

2293
来自专栏前端杂货铺

服务端事件EventSource揭秘

服务端推 服务端推,指的是由服务器主动的向客户端发送消息(响应)。在应用层的HTTP协议实现中,“请求-响应”是一个round trip,它的起点来自客户端,因...

3085
来自专栏重庆的技术分享区

如何在Ubuntu 16.04上安装和配置Redis集群

Redis集群已经发展成为缓存,队列等的流行工具,因为它具有可扩展性和速度的潜力。本指南旨在使用三个Linode创建一个集群来演示分片。然后,如果发生故障,您将...

1326
来自专栏潇涧技术专栏

One Trip of building a Crawler

最近需要从网上抓取大量的数据,于是体验了一下爬虫程序的开发和部署,主要是学会了一些实用工具的操作。

1082
来自专栏FreeBuf

浅谈XXE攻击

0×00. 介绍 现在越来越多主要的web程序被发现和报告存在XXE(XML External Entity attack)漏洞,比如说facebook、pa...

2068
来自专栏好好学java的技术栈

java工程师必备linux常用命令,这篇文章就够了

bash 是一个为GNU计划编写的Unix shell。它的名字是一系列缩写:Bourne-Again SHell — 这是关于Bourne shell(sh)...

2351
来自专栏草根专栏

使用Angular CLI进行Build (构建) 和 Serve

Build. Build主要会做以下动作: 编译项目文件并输出到某个目录 Build targets决定了输出的结果 bundling 打包 生产环境的buil...

3757

扫码关注云+社区