http_load 对squid 进行压力测试

本次压力测试的目的:

    a. 查看单个squid  的在大量的url 访问时 Cache 命中率

    b. 在此过程中,查看squid 的平均响应时间

    c.  查看  cpu mem io 的瓶颈

  1. http_load 的配置安装, 网上很多,这里就不多话了

  2. 在一台服务器上搭建一个回源webservice (这里用apache  要记得设置cache-control),将 域名 cdnxxx.com指向该台服务器的IP

  3. 在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 in range(0, dir_total):
        for in range(1,file_total):
            f.write('http://cdnxx.com/'+ str(i)+'/' + str(j)+'.jpg\n')
 
    f.close()

        

5. 在指定服务器搭建squid(可以参考我之前的配置,这里不需要haproxy,直接对单个squid进行压力测试)

    1. 这里注意squid 有好几个模式,不用ha  代理的时候,针对80端口测试,需要把squid 的模式设置为http_port 80 transparent

    2. 在acl  中配置一个频道用来做测试 cdnxxx.com

    3. 启动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 in self.m.handles:
            if 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 in xrange(0,1000):
        for 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进行分析,才能得出结论 

你可能感兴趣的:(squid,压力测试)