ab
ab(Apache Bench)是apache自帶的壓力測試工具。ab非常實用,它不僅可以對apache服務(wù)器進(jìn)行網(wǎng)站訪問壓力測試,也可以對或其它類型的服務(wù)器進(jìn)行壓力測試。比如nginx、tomcat、IIS等。
安裝
我使用的環(huán)境為Ubuntu-14.04,輸入命令:
apt-get install apache2-utils
安裝成功后就可以開始進(jìn)行測試。
測試
測試命令的格式為:
ab [options] [http://]hostname[:port]/path
options為參數(shù),有以下幾種:
- -A auth-username:password
對服務(wù)器提供BASIC認(rèn)證信任。 用戶名和密碼由一個:隔開,并以base64編碼形式發(fā)送。 無論服務(wù)器是否需要(即, 是否發(fā)送了401認(rèn)證需求代碼),此字符串都會被發(fā)送。 - -c concurrency
一次產(chǎn)生的請求個數(shù)。默認(rèn)是一次一個。
- -C cookie-name=value
對請求附加一個Cookie:行。 其典型形式是name=value的一個參數(shù)對。 此參數(shù)可以重復(fù)。 - -d
不顯示"percentage served within XX [ms] table"的消息(為以前的版本提供支持)。 - -e csv-file
產(chǎn)生一個以逗號分隔的(CSV)文件, 其中包含了處理每個相應(yīng)百分比的請求所需要(從1%到100%)的相應(yīng)百分比的(以微妙為單位)時間。 由于這種格式已經(jīng)“二進(jìn)制化”,所以比'gnuplot'格式更有用。 - -g gnuplot-file
把所有測試結(jié)果寫入一個'gnuplot'或者TSV (以Tab分隔的)文件。 此文件可以方便地導(dǎo)入到Gnuplot, IDL, Mathematica, Igor甚至Excel中。 其中的第一行為標(biāo)題。 - -h 顯示使用方法。
- -H custom-header 對請求附加額外的頭信息。
此參數(shù)的典型形式是一個有效的頭信息行,其中包含了以冒號分隔的字段和值的對 (如, "Accept-Encoding: zip/zop;8bit"). - -i 執(zhí)行HEAD請求,而不是GET。
- -k 啟用HTTP KeepAlive功能
在一個HTTP會話中執(zhí)行多個請求。 默認(rèn)時,不啟用KeepAlive功能. -n requests 在測試會話中所執(zhí)行的請求個數(shù)。 默認(rèn)時,僅執(zhí)行一個請求,但通常其結(jié)果不具有代表意義。 - -p POST-file包含了需要POST的數(shù)據(jù)的文件.
- -P proxy-auth-username:password
對一個中轉(zhuǎn)代理提供BASIC認(rèn)證信任。 用戶名和密碼由一個:隔開,并以base64編碼形式發(fā)送。 無論服務(wù)器是否需要(即, 是否發(fā)送了401認(rèn)證需求代碼),此字符串都會被發(fā)送。 - -q 如果處理的請求數(shù)大于150, ab每處理大約10%或者100個請求時,會在stderr輸出一個進(jìn)度計數(shù)。 此-q標(biāo)記可以抑制這些信息。
- -s 用于編譯中(ab -h會顯示相關(guān)信息)使用了SSL的受保護的https, 而不是http協(xié)議的時候。此功能是實驗性的,也是很簡陋的。最好不要用。
- -S 不顯示中值和標(biāo)準(zhǔn)背離值。而且在均值和中值為標(biāo)準(zhǔn)背離值的1到2倍時,也不顯示警告或出錯信息。 默認(rèn)時,會顯示 最小值/均值/最大值等數(shù)值。(為以前的版本提供支持).
- -t timelimit 測試所進(jìn)行的最大秒數(shù)。其內(nèi)部隱含值是-n 50000。 它可以使對服務(wù)器的測試限制在一個固定的總時間以內(nèi)。默認(rèn)時,沒有時間限制。
- -T content-type POST數(shù)據(jù)所使用的Content-type頭信息。
- -v verbosity 設(shè)置顯示信息的詳細(xì)程度
4或更大值會顯示頭信息, 3或更大值可以顯示響應(yīng)代碼(404, 200等), 2或更大值可以顯示警告和其他信息。 - -V 顯示版本號并退出。
- -w 以HTML表的格式輸出結(jié)果。默認(rèn)時,它是白色背景的兩列寬度的一張表。
- -x <table>-attributes 設(shè)置<table>屬性的字符串。 此屬性被填入<table 這里 >.
- -X proxy[:port] 對請求使用代理服務(wù)器。
- -y <tr>-attributes 設(shè)置<tr>屬性的字符串.
- -z <td>-attributes 設(shè)置<td>屬性的字符串
參數(shù)很多,但我們通常使用到的是 -n 和 -c,即總的請求數(shù) 和同時并發(fā)數(shù)。
在命令行輸入:
ab -n 100 -c 20 http://www.test.com/
即對此域名的服務(wù)器進(jìn)行并發(fā)數(shù)20,總的請求為100的壓力測試。
實例
首先,在我本機運行一個tornado的http服務(wù)器的demo,然后輸入測試命令:
ab -n 2000 -c 100 http://localhost:9998/
然后可以看到輸出的測試結(jié)果:
Server Software: TornadoServer/4.4.1
Server Hostname: localhost
Server Port: 9998
//這段是服務(wù)器信息,可以看到使用的是Tornado,地址為本地,端口為9998
Document Path: /
Document Length: 790 bytes
//測試的頁面和頁面大小
Concurrency Level: 100
//測試的并發(fā)數(shù)
Time taken for tests: 4.746 seconds
//測試持續(xù)時長
Complete requests: 2000
//測試的請求數(shù)
Failed requests: 0
//失敗的請求數(shù)
Total transferred: 1972000 bytes
//整個過程中數(shù)據(jù)量
HTML transferred: 1580000 bytes
//整個過程中HTML數(shù)據(jù)量
Requests per second: 421.43 [#/sec] (mean)
//平均每秒處理請求數(shù)
Time per request: 237.288 [ms] (mean)
//平均每個請求處理時長(并發(fā)數(shù)為一個整體,即100個并發(fā)同時請求)
Time per request: 2.373 [ms] (mean, across all concurrent requests)
//平均每個請求處理時長(對于并發(fā)請求,cpu實際上并不是同時處理的,而是按照每個請求獲得的時間片逐個輪轉(zhuǎn)處理的,所以基本上第一個Time per request時間約等于第二個Time per request時間乘以并發(fā)請求數(shù))
Transfer rate: 405.79 [Kbytes/sec] received
//平均每秒網(wǎng)絡(luò)上的流量,可以幫助排除是否存在網(wǎng)絡(luò)流量過大導(dǎo)致響應(yīng)時間延長的問題
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 17 75.6 0 443
Processing: 6 209 350.2 98 1720
Waiting: 6 208 349.5 98 1716
Total: 6 226 420.4 98 2156
//網(wǎng)絡(luò)上消耗的時間的分解
Percentage of the requests served within a certain time (ms)
50% 98
66% 108
75% 114
80% 121
90% 507
95% 534
98% 2058
99% 2093
100% 2156 (longest request)
//整個場景中所有請求的響應(yīng)情況。在場景中每個請求都有一個響應(yīng)時間,其中50%的用戶響應(yīng)時間小于98毫秒,最大的響應(yīng)時間小于2156毫秒。
幾個重要指標(biāo)
吞吐率(Requests per second)
概念:服務(wù)器并發(fā)處理能力的量化描述,單位是reqs/s,指的是某個并發(fā)用戶數(shù)下單位時間內(nèi)處理的請求數(shù)。某個并發(fā)用戶數(shù)下單位時間內(nèi)能處理的最大請求數(shù),稱之為最大吞吐率。
計算公式:總請求數(shù) / 處理完成這些請求數(shù)所花費的時間,即
Request per second = Complete requests / Time taken for tests并發(fā)連接數(shù)(The number of concurrent connections)
概念:某個時刻服務(wù)器所接受的請求數(shù)目,簡單的講,就是一個會話。并發(fā)用戶數(shù)(The number of concurrent users,Concurrency Level)
概念:要注意區(qū)分這個概念和并發(fā)連接數(shù)之間的區(qū)別,一個用戶可能同時會產(chǎn)生多個會話,也即連接數(shù)。用戶平均請求等待時間(Time per request)
計算公式:處理完成所有請求數(shù)所花費的時間/ (總請求數(shù) / 并發(fā)用戶數(shù)),即
Time per request = Time taken for tests /( Complete requests / Concurrency Level)服務(wù)器平均請求等待時間(Time per request: across all concurrent requests)
計算公式:處理完成所有請求數(shù)所花費的時間 / 總請求數(shù),即
Time taken for / testsComplete requests
可以看到,它是吞吐率的倒數(shù)。
同時,它也=用戶平均請求等待時間/并發(fā)用戶數(shù),即
Time per request / Concurrency Level
layout: post
title: "使用 Apache AB 對服務(wù)器進(jìn)行壓力測試"
subtitle: ""
date: 2017-03-01 12:00:00
author: "ZWY"
header-img: "img/in-post/3-1/banner.jpg"
catalog: true
tags:
- 壓測
- 教程
- 服務(wù)器