5)网络性能测试工具
ab是Apache开发的性能测试工具。在Ubuntu 中使用要通过apt-get install -yapache2-utils命令来安装。
# ab -c 10 -n 1000 http://192.168.0.23:8000/
This is ApacheBench, Version 2.3 <$Revision: 1807734$>
Copyright 1996 Adam Twiss, Zeus Technology Ltd,http://www.zeustech.net/
Licensed to The Apache Software Foundation,http://www.apache.org/
Benchmarking 192.168.0.23 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests
Server Software: WSGIServer/0.2
Server Hostname: 192.168.0.23
Server Port: 8000
Document Path: /
Document Length: 1515 bytes
Concurrency Level: 10
Time taken for tests: 14.477 seconds
Complete requests: 1000
Failed requests: 0
Total transferred: 1882000 bytes
HTML transferred: 1515000 bytes
Requests per second: 69.08 [#/sec] (mean)
Time per request: 144.767 [ms] (mean)
Time per request: 14.477 [ms] (mean, across all concurrentrequests)
Transfer rate: 126.96 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.1 0 1
Processing: 38 144 42.5 142 330
Waiting: 17 119 39.3 117 298
Total: 38 144 42.5 142 330
Percentage of the requests served within a certaintime (ms)
50% 142
66% 158
75% 171
80% 177
90% 197
95% 219
98% 244
99% 263
100% 330 (longest request)
•ab -c 10 -n 1000 http:// 192.168.0.23:8000/。
测试URL为192.168.0.23的8000端口,并发数为10,共发送1000个请求。
•Server Software: WSGIServer/0.2。
测试服务器的名字。
•Server Hostname: 192.168.0.23。
请求的URL主机名。
•Server Port: 8000。
Web服务器监听的端口。
•Document Path: /。
请求的URL中的根绝对路径,通过该文件的后缀名,一般可以了解该请求的类型。
•Document Length: 1515 bytes。
HTTP响应数据的正文长度。
•Concurrency Level: 10。
并发用户数,即-c中的参数。
•Complete requests: 1000。
总请求数量,即-n中的参数。
•Failed requests: 0。
表示失败的请求数量,这里的失败是指请求在连接服务器、发送数据等环节发生异常,以及无响应后超时的情况。
•Total transferred: 1882000 bytes。
有请求的响应数据长度总和,包括每个HTTP响应数据的头信息和正文数据的长度。
•HTML transferred: 1515000 bytes。
所有请求的响应数据中正文数据的总和,也就是减去了Total transferred中HTTP响应数据中的头信息的长度。
•Requests per second: 69.08 [#/sec] (mean) 。
吞吐率,计算公式为Complete requests/Time taken for tests,总请求数/处理完成这些请求数所花费的时间。
•Time per request: 144.767 [ms] (mean)。
用户平均请求等待时间,计算公式:Time token for tests/(Complete requests/Concurrency Level)。处理完成所有请求数所花费的时间/(总请求数/并发用户数)。
•Time per request: 14.477 [ms] (mean, across allconcurrent requests)。
表示服务器平均请求等待时间,计算公式为Time taken for tests/Complete requests,恰好是吞吐率的倒数。也可以这么统计Time per request/Concurrency Level。
•Transfer rate: 126.96 [Kbytes/sec] received。
表示这些请求在单位时间内从服务器获取的数据长度,计算公式:Total trnasferred/ Time taken for tests。这个统计说明服务器的处理能力达到极限时,其出口宽带的需求量。
•Percentage of requests served within a certaintime(ms)。
这部分数据用于描述每个请求处理时间的分布情况,比如以上测试,80%的请求处理时间都不超过177ms,这个处理时间是指前面的Time per request,即对于单个用户而言,平均每个请求的处理时间。
wrk是一款简单的HTTP压测工具,它托管在Github上,https://github.com/wg/wrk。wrk的一个很好的特性就是能用很少的线程压出很大的并发量,原因是它使用了一些操作系统特定的高性能I/O机制, 比如select, epoll, kqueue等。它是复用了redis的ae异步事件驱动框架。确切地说ae事件驱动框架并不是redis发明的, 而是至于Tcl的解释器jim, 这个小巧高效的框架, 因为被redis采用而更多的被大家所熟知。
# wrk -t12 -c100 -d30s --latency http://192.168.0.23:8000
Running 30s test @ http://192.168.0.23:8000
12 threadsand 100 connections
ThreadStats Avg Stdev Max +/- Stdev
Latency 689.04ms 229.05ms 1.57s 71.98%
Req/Sec 12.43 9.36 80.00 82.00%
LatencyDistribution
50% 736.88ms
75% 852.13ms
90% 933.50ms
99% 1.08s
2391requests in 30.09s, 4.29MB read
Requests/sec: 79.46
Transfer/sec: 146.04KB
•--latency。
查看响应时间的分布。
•-t12 -c100 -d30s。
总共12个线程,100个连接(注意:并不是一个线程对应一个连接),持续30秒。
•latency和Req/Sec。
表示单个线程的统计数据,latency代表延迟时间,Req/Sec代表单个线程每秒完成的请求数,都具有平均值、标准偏差、最大值、正负一个标准差占比。
•2391 requests in 30.09s, 4.29MB read。
在30秒之内总共有2391个请求,总共读取4.29MB MB的数据。
•Requests/sec和Transfer/sec。
所有线程平均每秒钟完成了79.46个请求,每秒钟读取146.04KB数据量。
tcpdump工具可以将网络中传送的数据包完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。在运行性能测试的时候,可以通过tcpdump抓取,然后进行分析。
# tcpdump -nn udp port 53 orhost 123.56.135.186
tcpdump: verbose outputsuppressed, use -v or -vv for full protocol decode
listening on ens33,link-type EN10MB (Ethernet), capture size 262144 bytes
22:42:01.829302 IP192.168.58.129.39735 > 192.168.58.2.53: 49863+ A? www.3testing.com. (34)
22:42:01.829565 IP192.168.58.129.43751 > 192.168.58.2.53: 24308+ AAAA? www.3testing.com. (34)
22:42:01.960297 IP192.168.58.2.53 > 192.168.58.129.39735: 49863 1/0/0 A 123.56.135.186 (50)
22:42:01.961346 IP192.168.58.2.53 > 192.168.58.129.43751: 24308 0/1/0 (94)
22:42:01.961820 IP192.168.58.129 > 123.56.135.186: ICMP echo request, id 2414, seq 1, length64
22:42:01.996723 IP123.56.135.186 > 192.168.58.129: ICMP echo reply, id 2414, seq 1, length 64
22:42:01.997380 IP192.168.58.129.49101 > 192.168.58.2.53: 29852+ PTR?186.135.56.123.in-addr.arpa. (45)
22:42:02.856462 IP192.168.58.129.49101 > 192.168.58.2.53: 29852+ PTR?186.135.56.123.in-addr.arpa. (45)
22:42:04.606587 IP192.168.58.129.49101 > 192.168.58.2.53: 29852+ PTR? 186.135.56.123.in-addr.arpa.(45)
22:42:07.856421 IP192.168.58.129.49101 > 192.168.58.2.53: 29852+ PTR?186.135.56.123.in-addr.arpa. (45)
22:42:12.008686 IP192.168.58.129 > 123.56.135.186: ICMP echo request, id 2414, seq 2, length64
22:42:12.050959 IP123.56.135.186 > 192.168.58.129: ICMP echo reply, id 2414, seq 2, length 64
•tcpdump -nn udp port 53 or host 123.56.135.186。
Ø-nn。
表示不解析抓包中的域名(即不反向解析)、协议以及端口号。
Øudp port 53。
只显示UDP协议的端口号(包括源端口和目的端口)为53的包。
Øhost123.56.135.186。
只显示 IP 地址(包括源地址和目的地址)为123.56.135.186的包。这两个过滤条件中间的"or"表示或的关系,也就是说,只要满足上面两个条件中的任一个,就可以展示出来。
•22:42:01.829302 IP 192.168.58.129.39735 > 192.168.58.2.53: 49863+A? www.3testing.com. (34)
Ø22:42:01.829302。
时间戳。
ØIP。
协议。
Ø192.168.58.129.39735。
源地址.源端口。
Ø> 。
到。
Ø192.168.58.2.53:。
目的地址.目的端口。
Ø49863+ A? www.3testing.com.(34)。
网络包详细信息。
u49863+。
查询标识值,它也会出现在响应中,加号表示启用递归查询。
uA?。
查询A记录。
uwww.3testing.com.。
表示待查询的域名。
u(34)。
报文长度。
wireshark(前称Ethereal)是一个网络封包分析软件。网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料。Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换。在运行性能测试的时候,首先通过tcpdump工具加上-w 把结果存储在.pcap文件中。
tcpdump -nn host 192.168.58.129 -w web.pcap
然后启动wireshark工具就可以分析软件性能了。如图3-36所示。
图3-36 wireshark
关于wireshark的介绍资料在网上很多,在这里不进行详细介绍。
本节所涉及的概念有网络协议栈、Linux 网络栈和网络性能指标。涉及到的命令有ifconfig、ip、sar、ping、性能测试工具:ab和wrk、性能分析工具:tcpdump和wireshark。
Linux性能分析工具nmon请查看第8.4.1节,一般在做性能测试的时候,采用这个工具进行服务器端的监控,而上面进到的命令作为调试的时候使用。