本次压力测试的目的:
a. 查看单个squid 的在大量的url 访问时 Cache 命中率
b. 在此过程中,查看squid 的平均响应时间
c. 查看 cpu mem io 的瓶颈
http_load 的配置安装, 网上很多,这里就不多话了
在一台服务器上搭建一个回源webservice (这里用apache 要记得设置cache-control),将 域名 cdnxxx.com指向该台服务器的IP
在cdnxxx.com的根目录 生成大量测试的小图片(因为主要是测试cache、热点命中率,所以图片一般小于35KB),准备20个jpg 小图片 放到src文件夹中,将src 拷贝到cdnxxx.com的根目录,在根目录创建0文件夹(mkdir 0)
a. 生成代码,用python写的,先在0这个目录下生成6000个jpg图片
'' '
Created on 2013 - 7 - 16
@author: xie
'' '
#!/usr/bin/python
import string, random, os
# create uri
def UriTotal():
uri_total = 6000
dir_total = 20
uri_number = 1
dir_number = 0
while uri_number < uri_total:
os.system( "cp ./src/" + str(uri_number% 20 ) + ".jpg ./0/" + str(uri_number) + ".jpg" )
uri_number += 1
if __name__ == '__main__' :
UriTotal()
|
b. 在生成6000个文件夹
1
2
3
4
5
6
7
8
9
10
11
|
#!/usr/bin/python
import string, random, os
# create uri
dir_total = 5999
uri_number = 1
dir_number = 1
while dir_number < dir_total:
os.system( "/bin/ln -s ./0/ " + str(dir_number) )
dir_number += 1
|
4. 在你准备http_load 测试的那台服务器 执行一下脚本,生成 6000 * 6000个url
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
# -*- coding: utf- 8 -*-
'' '
Created on 2013 - 7 - 17
@author: xie
'' '
def write2(filename, lines):
try :
f = open(filename, 'w' )
except IOError:
raise Exception( 'error open ' + filename)
f.write( '\n' .join(lines))
f.close()
if __name__ == '__main__' :
# 从 0 - 5999
dir_total = 6000
# 从 1 - 5999 个
file_total = 6000
f = open( 'ab.txt' , 'w' )
for i in range( 0 , dir_total):
for j in range( 1 ,file_total):
f.write( 'http://cdnxx.com/' + str(i)+ '/' + str(j)+ '.jpg\n' )
f.close()
|
5. 在指定服务器搭建squid(可以参考我之前的配置,这里不需要haproxy,直接对单个squid进行压力测试)
这里注意squid 有好几个模式,不用ha 代理的时候,针对80端口测试,需要把squid 的模式设置为http_port 80 transparent
在acl 中配置一个频道用来做测试 cdnxxx.com
启动squid
6. 在这台测试机上,绑定cdnxxx.com 的ip , ip为对外提供服务的squid那台服务器的IP
wget -c http://soft.kwx.gd/tools/http_load-12mar2006.tar.gz
yum -y install gcc gcc-c++ #安装GCC编辑器
tar xzvf http_load-12mar2006.tar.gz #解压http_load压缩包
cd http_load-12mar2006 #进入http_load目录
mkdir /usr/local/man #创建目录
make && make install #编译并安装
/maichuang/ab/http_load/http_load -parallel 1000 -fetches 10000 /maichuang/ab/ab.txt >> /maichuang/ab.result.txt
7. 对squid 进行预加载
# -*- coding: utf- 8 -*-
'' '
Created on 2013 - 7 - 4
@author: xie
'' '
import socket,re,pycurl,urllib
class CurlM(object):
def __init__(self, urls):
self._urls = urls
self.m = pycurl.CurlMulti()
self.m.handles = []
self.Init()
def run(self): #说明该curl集 已经运行完成,可以删除此类
flag = False
while 1 :
if flag:
break
while 1 :
if self.m is None or len(self.m.handles) <= 0 :
self.close()
flag = True
break
ret, num_handles = self.m.perform()
if ret == pycurl.E_CALL_MULTI_PERFORM:
break
if num_handles <= 0 :
self.close()
flag = True
break
ret = self.m.select( 0.01 )
break
def write(self,buff):
pass
def Init(self):
for url in self._urls:
if url is None:
continue
c = pycurl.Curl()
c.setopt(pycurl.URL, str(url))
c.setopt(pycurl.CONNECTTIMEOUT, 10 )#链接超时
c.setopt(pycurl.WRITEFUNCTION, self.write)#写(下载)回传函数,传递一个写指针供外部操作, 一次回调内容大小在
c.setopt(pycurl.TIMEOUT, 10 )#下载超时
c.setopt(pycurl.PROXY, '127.0.0.1:80' )# 使用代理
self.m.handles.append(c)
self.m.add_handle(c)
def close(self):
for c in self.m.handles:
if c is not None:
c.close()
if self.m is not None:
self.m.close()
self.m = None
self._caches = []
self._urls = []
if __name__ == '__main__' :
xie = []
for i in xrange( 0 , 1000 ):
for x in xrange( 1 , 1000 ):
xie.append( 'http://cdnxxx.com/' +str(i)+ '/' +str(x)+ '.jpg' )
c = CurlM(xie)
c.run()
|
8. 查看squid 的信息
/maichuang/squid/bin/squidclient -p 80 mgr:info
9. http_load 的返回结果 可以看见每秒响应请求次数,服务器响应的平均时间
测试结果
#100000个请求,最大并发数1000,总计传输的数据为2.73427e+09bytes,运行时间362.318秒。关注点:总请求数、最大并发进程数
100000 fetches, 1000 max parallel, 2.73427e+09 bytes, in 362.318 seconds
#每一连接平均传输的数据量2.73427e+09/100000=27342.7
27342.7 mean bytes/connection
#每秒的响应请求为276,每秒传递的数据为7.5466e+06btyes/sec,关注点:每秒的响应请求数(对应LR中的每秒响应用户数)
276 fetches/sec, 7.5466e+06 bytes/sec
#每次连接的平均响应时间是136.121 msecs,最大响应时间1236.32 msecs,最小响应时间62.531 msecs。关注点:每个连接的平均响应时间(对应QTP中的response time,每连接响应用户时间 )
msecs/connect: 136.121 mean, 1236.32 max, 62.531 min
msecs/first-response: 491.341 mean, 59717.1 max, 62.605 min
2916 timeouts
1192 bad byte counts
HTTP response codes:
code 200 -- 99780
测试结果中主要的指标是 fetches/sec、msecs/connect 这个选项,即服务器每秒能够响应的查询次数,
用这个指标来衡量性能。似乎比 apache的ab准确率要高一些,也更有说服力一些。 Qpt-每秒响应用户数和response time,每连接响应用户时间。
测试的结果主要也是看这两个值。当然仅有这两个指标并不能完成对性能的分析,我们还需要对服务器的 cpu、men进行分析,才能得出结论