1. 程式人生 > >Locust一個分散式負載測試工具

Locust一個分散式負載測試工具

Locust簡介

Locust是一個簡單易用的分散式負載測試工具,主要用來對網站進行負載壓力測試。

Locust特性

  • 使用Python編寫模擬使用者行為的程式碼,無需繁瑣的配置
  • 分散式可擴充套件,能夠支援上百萬使用者
  • 自帶Web介面
  • 不僅能測試web系統,也可以測試其它系統

Locust思想

在測試過程中,一群使用者將訪問你的網站。每個使用者的行為由你編寫的Python程式碼定義,同時可以從Web介面中實時觀察到使用者的行為。

Locust完全是事件驅動的,因此在單臺機器上能夠支援幾千併發使用者訪問。與其它許多基於事件的應用相比,Locust並不使用回撥,而是使用gevent,而gevent是基於協程的,可以用同步的方式來編寫非同步執行的程式碼。每個使用者實際上執行在自己的greenlet中。

Locust安裝

Locust可以通過pip或者easy_install安裝:

pip install locustio
或者
easy_install locustio

安裝完Locust後,shell命令locust就可以使用了,可以檢視locust命令有哪些選項:

locust --help

如果打算以分散式模式執行Locust,建議同時安裝pyzmq:

pip install pyzmq
或者
easy_install pyzmq

Locust初步使用

locustfile.py例子

下面是一個簡單的locustfile.py檔案。

from locust import
HttpLocust, TaskSet def login(l): l.client.post("/login", {"username":"ellen_key", "password":"education"}) def index(l): l.client.get("/") def profile(l): l.client.get("/profile") class UserBehavior(TaskSet): tasks = {index:2, profile:1} def on_start(self): login(self
) class WebsiteUser(HttpLocust): task_set = UserBehavior min_wait=5000 max_wait=9000

在上面的程式碼中,定義了一些locust任務,這些任務是用Python函式定義的。這些函式傳入一個引數,也就是Locust類的例項。這些任務然後被聚集在TaskSet類的tasks屬性中,用來表示一個使用者訪問網站的行為。接著,HttpLocust類表示一個使用者,這個使用者具有哪些行為,以及該使用者在執行下一個任務之前應該等待多長時間。

HttpLocust類繼承於Locust類,它增加了一個client屬性,這個client實際上是HttpSession例項,可以用來發起HTTP請求。

上面的程式碼示例了一種定義任務的方式,下面是一種更方便的方式,該方式使用了task裝飾器。

from locust import HttpLocust, TaskSet, task

class UserBehavior(TaskSet):
    def on_start(self):
        """ on_start is called when a Locust start before any task is scheduled """
        self.login()

    def login(self):
        self.client.post("/login", {"username":"ellen_key", "password":"education"})

    @task(2)
    def index(self):
        self.client.get("/")

    @task(1)
    def profile(self):
        self.client.get("/profile")

class WebsiteUser(HttpLocust):
    task_set = UserBehavior
    min_wait=5000
    max_wait=9000

啟動Locust

在shell中執行locust命令即可啟動Locust。如果locustfile.py檔案在當前目錄,那麼直接執行locust命令即可。如果locustfile.py檔案在別的地方,可以執行

locust -f /path/to/locustfile.py

開啟Web介面

在shell中執行locust命令,如果沒有問題的話,命令輸出會提示可以在瀏覽器中開啟Locust的Web介面,訪問地址預設是http://127.0.0.1:8089。在瀏覽器中開啟該地址,就可以看到像下面這樣的Web介面:Locust的Web介面

這裡記錄下學習道路, 防止忘了

作業系統是centos:

首先是linux系統, 裝有Python 和 Python-devel (否則安裝軟體會提示python.h找不到, gcc error等問題...... )

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

然後安裝pip

  執行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('\r\n', '\n'), __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_code 和 response.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一個分散式負載測試工具

Locust簡介 Locust是一個簡單易用的分散式負載測試工具,主要用來對網站進行負載壓力測試。 Locust特性 使用Python編寫模擬使用者行為的程式碼,無需繁瑣的配置分散式可擴充套件,能夠支援上百萬使用者自帶Web介面不僅能測試web系統,也可以測試其它系統

HTTP/HLS/RTMP超級負載測試工具(轉)

解析 重復 run rtu port -i 連接 內容 ace 這個負載測試工具是網遊分享的工具,可以在http://blog.csdn.net/win_lin/article/details/11835011 或者https://github.com/winlinvip/

分享一個串口測試工具

分享 計算 tar 技術 字符 地址 自動 img target 串口調試工具很多,但是功能穩定、全面的不多,這個是自己在開發中的一個副產品。 功能特點: 1、自動加載設備的串口號,比好多寫死1-10或1-50的亂碰模式好的了。 系統有什麽串口就顯示什麽串口,容易選擇

開源負載測試工具k6比JMeter更容易的5件事

k6是GitHub上提供的開源負載測試工具。它是用Go編寫的,並執行用JavaScript編寫的測試指令碼。它受到了開發人員,測試人員和DevOps團隊的強烈興趣,並擁有超過4400名GitHub明星。k6是命令列驅動的,測試結果輸出到stdout或結果分析工具,如Load Impact Insights。

運用Kubernetes進行分散式負載測試_Kubernetes中文社群

前言 該教程描述如何在Kubernetes中進行分散式負載均衡測試,包括一個web應用、docker映象和Kubernetes controllers/services。更多資料請檢視Distributed Load Testing Using Kubernetes 。 注意:該測試是在我自

HTTP/HLS/RTMP超級負載測試工具

伺服器負載測試工具(st-load): 模擬huge併發:2G記憶體就可以開300k連線。基於states-threads的協程。支援HLS解析和測試,下載ts片後等待一個切片長度,模擬客戶端。支援HLS點播和直播。支援HTTP負載測試,所有併發重複下載一個http檔案。

AWS EC2+Docker+JMeter構建分散式負載測試基礎架構

[原文連結](https://medium.com/@DragosCampean/how-to-build-a-distributed-load-testing-infrastructure-with-aws-docker-and-jmeter-accf3c2aa3a3) @[Toc] ### 概述及範圍

基於python的性能測試工具locust

說我 代理 ans 裝飾 word 幹什麽 基於 配置 朋友 現在有很多的性能測試工具,比如說我們熟悉的loadrunner、jmeter、ab、webbench等等,這些工具如果對一個沒用過的朋友來說,學習起來比較不容易,但是如果你能看懂python代碼,會寫就更

測試工具之Jmeter(創建一個簡單測試用例)

管理器 view time http ati 測試用例 停止 調度器 until 前面介紹了如何使用badboy錄制jmeter腳本,以及如何導入腳本並進行測試 這裏介紹下手動創建測試用例,主要步驟如下: 1、創建線程組 第一次打開Jmeter只有一個測試計劃,右鍵

轉: Tsung:開源多協議分布式負載&壓力測試工具

phi mach level shel 同時 技術分享 event 工作 lib Main features High Performance: the load can be distributed on a cluster of client machines Mul

Tools - 負載效能測試工具JMeter

JMeter簡介 HomePage:http://jmeter.apache.org/ Apache JMeter是Apache組織開發的基於Java的開源負載效能測試工具。 可以用於對伺服器、網路應用或物件模擬巨大的負載,進行壓力和效能測試,分析整體效能。 通過建立帶有斷言

分享一個特別好的測試http協議的測試工具

二話不說,咱直接上程式碼!!!! public class TestPost {          private static final SimpleDateFormat format = new SimpleDateFormat("y

用c實現一個壓力測試工具

#include <stdlib.h> #include <stdio.h> #include <assert.h> #include <unistd.h> #include <sys/types.h> #include <sys/e

負載,效能測試工具-Gatling

<build> <sourceDirectory>src/main/scala</sourceDirectory> <testSourceDirectory>src/test/scala</testSource

效能測試工具 wrk,ab,locust,Jmeter 壓測結果比較

背景: 專案需要對一批介面進行壓測,要求是介面的QPS(Quest Per Second每秒請求數)達到6萬以上 由於樓主一直使用的壓力測試工具是jmeter,但是jmeter單臺電腦無法達到6萬的QPS,於是使用網傳比較好用的其他效能工具進行壓測比較,選出一款符合要求的工具進行壓測。

一個簡單的monkey測試工具

  Monkey的概念: “猴子測試”是指沒有測試經驗的人甚至對計算機根本不瞭解的人(就像猴子一樣)不需要知道程式的任何使用者互動方面的知識,如果給他一個程式,他就會針對他看到的介面進行操作,其操作是無目的的、亂點亂按的。 這種測試方式在產品週期中的早期階段會找到很多很好的bu

深入淺出開源效能測試工具Locust(使用篇)

在《【LocustPlus序】漫談服務端效能測試》中,我對服務端效能測試的基礎概念和效能測試工具的基本原理進行了介紹,並且重點推薦了Locust這一款開源效能測試工具。然而,當前在網路上針對Locust的教程極少,不管是中文還是英文,基本都是介紹安裝方法和簡單的測試案例演

一個簡單的藍芽指令測試工具

20180508更新,工具中一些不太人性化的地方修改了一些,且有朋友私聊說沒積分下載apk 所以我從新上傳個免費下載的apk ,新的apk是基於上面的庫封裝的,程式碼更加簡潔一些,只關心互動 節省了大量程式碼和工時,不是安卓開發的可以直接下載apk使用

一個分散式測試系統利器

Create an EC2 instance Sign up for AWSIn Services -> EC2, click “Launch Instance”Choose the 64 bit Debian Jessie imageHit review and launchSave your SS

介紹一個非常好的郵件伺服器線上測試工具

Mx lookup:查詢域名的MX資訊,supertool的查詢命令是mx:domain; Blacklists:查詢IP是否被列入了黑名單,supertool的查詢命令是blacklist:ip; Diagnostics :smtp伺服器診斷,會測試郵件伺服器是否開放中繼,測試郵件伺服器的反向解析是否匹配,