【性能測試】【locust】快速入門


簡介

locust是一個開源的分布式用戶負載壓力測試工具,對網站(其他系統,例如接口等)進行負載測試,並確定可以處理多少的並發用戶,locust特點利用了協程支持,達到高數量級別的並發,以及基於事件驅動使用gevent庫來實現網絡並發請求。https://www.locust.io/

環境配置

  • Python 3.8.2
  • pycharm
  • window or linux

安裝locust

pip install locust

依賴庫

安裝locust后,會自動下載對應的依賴庫

  1. gevent: gevent是第三方庫,通過greenlet實現協程, 當訪問網絡時,IO操作會消耗很長時間出現等待情況,greenlet會自動切換其他greenlet,直到IO操作完成,再切換回來,保證greenlet始終再運行,而不是再等待

  2. requests: requests庫,http庫,實現各種請求,get,post,put,delete, 這邊在locust封裝后與requests庫對應使用

request locust
request.post() client.post()
request.get() client.get()
request.delete() client.delete()
request.put() client.put()
  1. psutil:是一個監控庫,監控cpu, 內存,磁盤等

  2. flask, Flask-BasicAuth: flask web第三方框架,Flask-BasicAuth:權限驗證

  3. pyzmq: 可用於Locust分布運行在多個進程/機器上

實現原理

locust有比較重要的概念,一個定義用戶行為(繼承TaskSet), 一個是用戶類(繼承HttpUser)

TaskSet

定義一組用戶將要執行的tasks場景,實現了虛擬用戶所執行任務的調度算法,TaskSet子類重定義任務,采用@task裝飾器

例子

  • @task(1) 權重為1,@task(2)權重為2, 意思就是test_job2執行的頻率是test_job1的兩部
from locust import TaskSet, task
 
class UserBehavior(TaskSet):
    @task(1)
    def test_job1(self):
        self.client.get('/job1')
 
    @task(2)
    def test_job2(self):
        self.client.get('/job2')
  • 第二種權重寫法
from locust import TaskSet, task
 
class UserBehavior(TaskSet):
    @task
    def test_job1(self):
        self.client.get('/job1')
 
    @task
    def test_job2(self):
        self.client.get('/job2')


class WebUser(HttpUser):
    tasks = [test_job1, test_job2]  # 不寫的話比重就是1:1
    # tasks = {test_job1:1, test_job2:2} # 兩種方式等價

HttpUser

代替了之前版本的Httplocust實例化時創建一個client屬性,該屬性是一個具有支持的HTTP客戶端用於在請求之間保持用戶會話,創建的HttpSession的實例。客戶端支持cookies,因此在HTTP請求之間保持會話,由於request.Session, 再登陸系統后維持了登陸的seesion, 后面的task腳本操作都帶上了session

簡單示例

代碼示例

__author__ = 'wangxiao'

import os

# 導入包
from locust import HttpUser, task, between, TaskSet

# 定義task行為類繼承TaskSet
class SouMiSearch(TaskSet):
    # 
    @task
    def search(self):
        url = "/api/p/search/"
        body = {"keywords": "ceess"}
        with self.client.post(url, json=body) as response:
            print(response.text)


class WebUser(HttpUser):
    tasks = [SouMiSearch]
    wait_time = between(2, 5)
    host = "http://api.shoumilive.com:83"


if __name__ == '__main__':
    os.system("locust -f test_search.py")

# 運行

[2020-08-19 09:59:48,212] md2bkpyc/WARNING/locust.main: System open file limit setting is not high enough for load testing, and the OS wouldnt allow locust to increase it by itself. See https://docs.locust.io/en/stable/installation.html#increasing-maximum-number-of-open-files-limit for more info.
[2020-08-19 09:59:48,212] md2bkpyc/INFO/locust.main: Starting web interface at http://:8089
[2020-08-19 09:59:48,229] md2bkpyc/INFO/locust.main: Starting Locust 1.1.1

默認端口8089, 瀏覽器訪問127.0.0.1:8089

  1. Number of total users to simulate: 設置總共的模擬用戶總數
  2. Hatch rate (users spawned/second):每秒啟動的虛擬用戶數

場景設置

  • 設置用戶總數10個,每秒啟動5個

測試監控界面

Statustics

頁面指標 解析 備注
type 請求類型
Name 請求名稱 這個可以自定義,傳name參數即可
Requests 當前已完成的請求數量
Fails 失敗的請求數量
Requests 當前已完成的請求數量
Median 響應時間的中間值,即50%的響應時間在這個數值范圍內,單位為毫秒
90%ile 90%的響應時間在正態分布平均值下方,即小於這個值
Min 最小響應時間,單位為毫秒
Max 最大響應時間,單位為毫秒
average Size 平均每個請求的數據量,單位為字節
current RPS 每秒鍾處理請求的數量


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM