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/pythonimport 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 += 1if __name__ == '__main__':    UriTotal() | 
b. 在生成6000个文件夹
1 2 3 4 5 6 7 8 9 10 11  | #!/usr/bin/pythonimport string, random, os# create uri dir_total = 5999uri_number = 1dir_number = 1while 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,urllibclass 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进行分析,才能得出结论
目录 返回
首页