그림 Locust



소개



Locust문서 는 알기 쉽지만,
여러가지 신경이 쓰인 점이 있었으므로 소스 코드 을 읽고 그림으로 해 보았습니다.

Locust의 움직임





보충



Locust를 지원하는 것



Locust는 Gevent이라는 동시 처리를 지원하는 모듈을 사용합니다.
몇개의 Locust는 실제로는 단일의 greenlet 속에서 스케줄링 하면서 움직이고 있어 이벤트 베이스로 제어되고 있다.

Task 사이를 가로지르는 행동의 제어는 어떻게 하는 것인가?



SQLite나 Redis를 사용하여 관리할 것인가.

Summary에 자신의 정보를 추가하고 싶습니다.



소스 코드를 따라가면 locust/stats.py#L553global_stats 에 흘려 넣으면 된다는 것을 알 수 있다.
global_stats.log_request('foo', 'bar', 0, 0)

자물쇠



gevent 의 lock 를 사용한다.
예를 들어 Locust 의 setup 가 , 한 번만 그리고 모든 인스턴스의 on_start 의 앞에 불리는 것도 , 이것을 사용해 실현되고 있다. => locust/core.py#L136
import gevent

_lock = gevent.lock.Semaphore()

def do_samething():
 _lock.acquire()
 # なんか処理
 _lock.release()

Taskset을 nest하면 어떻게됩니까?



stackoverflow: taskset-class-vs-function-task .
소스 코드를 보면 차이는 분명하지만 문서에서도 설명을 볼 수 있습니다.

Task를 동적으로 결정하고 싶습니다.



schedule_task 를 부르면 좋다.
class SampleTaskset(TaskSet):
    def on_start(self):
        if self.client.is_new:
            self.schedule_task(hoge, first=True)
        else:
            self.schedule_task(fuga, first=True)

   @task
   def hoge:
       print("hoge")

   @task
   def fuga:
       print("fuga")

클라이언트 수 얻기


locust -c 6 그렇다면 6마리.
from locust import runners

runners.locust_runner.num_clients

test 는 locust 테스트 와 python 단위 테스트의 2개 쓰기인가?



이 Issue가 도움이됩니다.
Feature request: "run through" each test once

결론



master-slave에 의한 분산형 부하 시험이나 seq_task에 의한 task의 연결 표현, WebUI 등등에 대해서는 문서 참조.


비고



다이어그램의 소스. 초잡. UML이라든가 처음으로 썼다.
@startuml
skinparam NoteFontSize 16
skinparam TitleFontSize 24
skinparam ArrowThickness 3
title 【 Locust の動き 】

rectangle bucket #LightGreen {
   agent Locust_A as Locust_A_1
   agent Locust_A as Locust_A_2
   agent Locust_A as Locust_A_3
   agent Locust_B as Locust_B_1
   agent Locust_B as Locust_B_2
   agent Locust_C as Locust_C_1
}
note right of bucket
Locust_A,B,C の weight が 3:2:1 で locust -c 6 した時の例。
bucket は locust_classes を重み付けしたものの名称。
end note

skinparam InterfaceFontSize 20
skinparam InterfaceFontColor #Red
interface spawn_locusts
bucket ---down-> spawn_locusts
note right of spawn_locusts
locust をたくさん spawn (発生)させる。
hatch_rate に基づき、locust を random で選んで生んでいく。
end note

agent Locust_A as Locust_A_3_spawned
agent Locust_C as Locust_C_1_spawned
agent Locust_B as Locust_B_2_spawned
agent Locust_A as Locust_A_1_spawned
agent Locust_A as Locust_A_2_spawned
agent Locust_B as Locust_B_1_spawned

spawn_locusts -[#green]down-> Locust_A_3_spawned: 1/hatch_rate 秒後。\nLocust の setup()
spawn_locusts --[#green]down-> Locust_C_1_spawned: 2/hatch_rate 秒後。\nLocust の setup()
spawn_locusts ---[#green]down-> Locust_B_2_spawned: 3/hatch_rate 秒後。\nLocust の setup()
spawn_locusts ----[#green]down-> Locust_A_1_spawned: 4/hatch_rate 秒後。
spawn_locusts -----[#green]down-> Locust_A_2_spawned: 5/hatch_rate 秒後。
spawn_locusts ------[#green]down-> Locust_B_1_spawned
note on link
☆☆☆
setup(), teardown() は、クラスにつき一度だけ実行される。
この2つのメソッドが並列に実行されることはない。重要
これは上手く図示できてないけど...
☆☆☆
end note

agent Locust_A_TaskSet as Locust_A_1_TaskSet
agent Locust_A_TaskSet as Locust_A_2_TaskSet
agent Locust_A_TaskSet as Locust_A_3_TaskSet
agent Locust_B_TaskSet as Locust_B_1_TaskSet
agent Locust_B_TaskSet as Locust_B_2_TaskSet
agent Locust_C_TaskSet as Locust_C_1_TaskSet
Locust_A_1_spawned -down-> Locust_A_1_TaskSet
Locust_A_2_spawned -down-> Locust_A_2_TaskSet
Locust_A_3_spawned -down-> Locust_A_3_TaskSet: TaskSet の setup()
Locust_B_1_spawned -down-> Locust_B_1_TaskSet
Locust_B_2_spawned -down-> Locust_B_2_TaskSet: TaskSet の setup()
Locust_C_1_spawned -down-> Locust_C_1_TaskSet: TaskSet の setup()

usecase on_start as on_start_Locust_A_1_TaskSet
usecase on_stop as on_stop_Locust_A_1_TaskSet
rectangle loop as task_A_1 {
   control tasks as task_A_1_control
}

usecase on_start as on_start_Locust_A_2_TaskSet
usecase on_stop as on_stop_Locust_A_2_TaskSet
rectangle loop as task_A_2 {
   control tasks as task_A_2_control
}

usecase on_start as on_start_Locust_A_3_TaskSet
usecase on_stop as on_stop_Locust_A_3_TaskSet
rectangle loop as task_A_3 {
   control tasks as task_A_3_control
}

usecase on_start as on_start_Locust_B_1_TaskSet
note right: 「さて、攻撃するぞ〜」(今回だと6並列の攻撃が展開されている)
usecase on_stop as on_stop_Locust_B_1_TaskSet
note right: 「疲れはてたよ...」
rectangle loop as task_B_1 {
   control tasks as task_B_1_control
}

usecase on_start as on_start_Locust_B_2_TaskSet
usecase on_stop as on_stop_Locust_B_2_TaskSet
rectangle loop as task_B_2 {
   control tasks as task_B_2_control
}

usecase on_start as on_start_Locust_C_1_TaskSet
usecase on_stop as on_stop_Locust_C_1_TaskSet
rectangle loop as task_C_1 {
   control tasks as task_C_1_control
}

Locust_A_1_TaskSet -down-> on_start_Locust_A_1_TaskSet
on_start_Locust_A_1_TaskSet -down-> task_A_1
task_A_1 -down-> on_stop_Locust_A_1_TaskSet

Locust_A_2_TaskSet -down-> on_start_Locust_A_2_TaskSet
on_start_Locust_A_2_TaskSet -down-> task_A_2
task_A_2 -down-> on_stop_Locust_A_2_TaskSet

Locust_A_3_TaskSet -down-> on_start_Locust_A_3_TaskSet
on_start_Locust_A_3_TaskSet -down-> task_A_3
task_A_3 -down-> on_stop_Locust_A_3_TaskSet

Locust_B_1_TaskSet -down-> on_start_Locust_B_1_TaskSet
on_start_Locust_B_1_TaskSet -down-> task_B_1
task_B_1 -down-> on_stop_Locust_B_1_TaskSet
note left of task_B_1
run-time 指定がなければ無限ループ。
Exception が起きても loop は継続する。
内部的な intterupt が来たら reschedule されて継続する。

request の結果を得たい時は locust の用意している hooks を使う。
request_success.fire() みたいに。
こうしないと task を実行しているスレッドを待機させてしまい、
次の task に移らないのでダメ。
end note

Locust_B_2_TaskSet -down-> on_start_Locust_B_2_TaskSet
on_start_Locust_B_2_TaskSet -down-> task_B_2
task_B_2 -down-> on_stop_Locust_B_2_TaskSet

Locust_C_1_TaskSet -down-> on_start_Locust_C_1_TaskSet
on_start_Locust_C_1_TaskSet -down-> task_C_1
task_C_1 -down-> on_stop_Locust_C_1_TaskSet

agent All_locusts_dead
on_stop_Locust_A_3_TaskSet ---------down-> All_locusts_dead: TaskSet, Locust の teardown()
on_stop_Locust_C_1_TaskSet --------down-> All_locusts_dead: TaskSet, Locust の teardown()
on_stop_Locust_B_2_TaskSet -------down-> All_locusts_dead: TaskSet, Locust の teardown()
on_stop_Locust_A_1_TaskSet ------down-> All_locusts_dead
on_stop_Locust_A_2_TaskSet -----down-> All_locusts_dead
on_stop_Locust_B_1_TaskSet ----down-> All_locusts_dead
@enduml

참고 : PlantUML Reference

좋은 웹페이지 즐겨찾기