常用压测工具

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

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 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

浅谈XXE攻击

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

2178
来自专栏北京马哥教育

使用 sphinx 制作简洁而又美观的文档

最近需要将API中的doc生成html给前端工程师参考调用。 于是粗率的学习了下sphinx ---- Sphinx 是用 Python 编写的,并且最初是为...

3856
来自专栏潇涧技术专栏

One Trip of building a Crawler

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

1412
来自专栏JavaEdge

视图重定向0 重定向视图 RedirectView1 向重定向目标传递数据2 重定向前缀——redirect:3 重定向前缀——forward:

3268
来自专栏JavaWeb

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

4087
来自专栏农夫安全

浅谈XXE攻击

前言 现在越来越多主要的web程序被发现和报告存在XXE(XML External Entity attack)漏洞,比如说facebook、paypal等等。...

3546
来自专栏草根专栏

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

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

4067
来自专栏技术随笔

Code::Blocks配置GTK+2和GTK+3

4728
来自专栏散尽浮华

centos6下redis cluster集群部署过程

一般来说,redis主从和mysql主从目的差不多,但redis主从配置很简单,主要在从节点配置文件指定主节点ip和端口,比如:slaveof 192.168....

57710
来自专栏编舟记

java9 模块化系统小试

JPMS 全称是 Java Platform Module system(Java 平台模块化系统)。它的目的简单直接:编译期间检查和强化封装。随之而来的好处就...

1843

扫码关注云+社区

领取腾讯云代金券