http_load 对squid 进行压力测试
http_load 对squid 进行压力测试
本次压力测试的目的:
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.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 ): 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
用这个指标来衡量性能。似乎比 apache的ab准确率要高一些,也更有说服力一些。 Qpt-每秒响应用户数和response time,每连接响应用户时间。
测试的结果主要也是看这两个值。当然仅有这两个指标并不能完成对性能的分析,我们还需要对服务器的 cpu、men进行分析,才能得出结论
目录 返回
首页