zoukankan      html  css  js  c++  java
  • locustio压力测试

    2015年7月17日 22:19:17 星期五

    这里记录下学习道路, 防止忘了

    操作系统是centos:

    首先是linux系统, 装有Python 和 Python-devel (否则安装软件会提示python.h找不到, gcc error等问题...... )

    1 yum install -y python
    2 yum install -y python-devel

    然后安装pip

      下载 get-pip.py 文件到linux

      运行Python 命令执行该文件: 

    python get-pip.py

    安装 greenlet (协程/微线程)

    pip install greenlet

    安装 gevent (网络io用)

    pip install gevent

    安装locustio: 

    pip install locustio

    进行压测

    locust --host=http://127.0.0.1 --port=8089 -f ./test.py

    locustio有自己的web页面, 上边的命令意思是: 在浏览器里打开 http://127.0.0.1:8089 显示locustio的web控制页面, 需要被压测的网站域名和URL放在test.py里

    ====================

    下边列出缺少python-devel(Ubuntu: python-dev)包时的错误信息, 可以通过百度搜索, 让出错的同学搜索到本篇文章解决类似的问题

    Command "/usr/bin/python -c "import setuptools, tokenize;__file__='/tmp/pip-build-6zEhZN/greenlet/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace(' ', ' '), __file__, 'exec'))" install --record /tmp/pip-dEs44u-record/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /tmp/pip-build-6zEhZN/greenlet

    ============

    概念理解(翻译):

    1. 超级类是 locust 类,它的每一个实例代表了一个用户, 守护程序会为每一个模拟用户生成一个实例

    2. httplocust 继承了locust 类, 添加了可以发送http请求的功能

    3. locust 有一个属性(成员变量)是 task_set , 它可以定义用户的行为, 就是访问哪些URL, post还是get, 每个连接占总访问量比是多少

    这个task_set 是类TaskSet(或其子类)的一个实例, 上边说的各种行为就是在这个类里边定义的

    4. locsut类:

    属性: min_wait/max_wait  模拟用户有在上边说的类中定义了好多任务/行为, 每个任务/行为间隔多久执行一次, 单位是毫秒, 默认1000, 也即隔一秒种后执行下一个任务

    属性: weight 权重: 模拟时, 同一段时间, 手机用户的访问量要比PC的访问量大, 那么对应的locust(或其子类)的weight值就大小不一

    属性: host 就是需要被压测的网站的域名(或域名前缀), 如果启动服务时没有通过参数-host来指定域名, 那么就用使用该host属性指定的值

    TaskSet类:

    1. 推荐的是, 在taskset类(或子类)中通过在行为(回调函数)前加@task(weight)描述符来指定某一个行为被执行的频率

    2. 或者先定义行为(回调函数), 然后通过属性tasks来指定每一个行为被执行的频率 tasks=[fun1, fun2....] 或者 tasks={fun1:weight1, fun2:weight2......}

    3. 不管怎样定义, 里边的行为或函数是被随机调用/执行的, 只是根据weight的不通, 随机到的频率不通而已

    4. 而且, 行为/任务可以嵌套执行, 先执行task1(也就是 fun1 下同), 然后执行task2 ..... 这样会更真实的模拟,

    其写法就是, 将这些有关联任务定义/封装到一个taskset子类中, 然后通过上边介绍的 tasks属性tasks={classname:weight}, 在另一个TaskSet子类中去关联该类以达到嵌套的目的

    5. 在执行子任务时, 通过 self.interrupt() 来终止子任务的执行, 来回到父任务类中执行, 否则子任务会一直执行

    6. 成员函数, on_start(), 如果定义的话, 就会在开始的时候执行

    HttpLocust类

    1. 他可以发送http请求, 他有一个属性叫client(实例化的时候自动生成), 存储HttpSession类的实例(HttpSession类在实例化Locust的时候自动创建), 用来保存请求session

    2. TaskSet类里也有属性client: self.client.get()或者self.client.post(), 这个client内部就是httplocust里的client

    3. 请求返回一个对象, 他有两个成员, response.status_coderesponse.content

    4. 如果因连接失败, 超时等等原因造成请求失败, 不会发出异常, 而是将上边的content置为空, status_code 置为0

    5. 可以对返回content内容自定义处理, 因为有的时候返回404是你希望得到的

    1 with client.get("/does_not_exist/", catch_response=True) as response:
    2     if response.status_code == 404:
    3         response.success()

    6.对网站来说, 一个URL的参数是固定的, 但是参数值是不定的, 也可以处理

    1 # Statistics for these requests will be grouped under: /blog/?id=[id]
    2 for i in range(10):
    3     client.get("/blog?id=%i" % i, name="/blog?id=[id]")

    其他, locust还有很多事件hook可以扩展开发, 有需要的可以去看官方文档, 内容没多少

     

    Finger PHP 框架  

  • 相关阅读:
    131. Palindrome Partitioning
    130. Surrounded Regions
    129. Sum Root to Leaf Numbers
    128. Longest Consecutive Sequence
    125. Valid Palindrome
    124. Binary Tree Maximum Path Sum
    122. Best Time to Buy and Sell Stock II
    121. Best Time to Buy and Sell Stock
    120. Triangle
    119. Pascal's Triangle II
  • 原文地址:https://www.cnblogs.com/iLoveMyD/p/4655845.html
Copyright © 2011-2022 走看看