Description
Prerequisites
- I am using the latest version of Locust
- I am reporting a bug, not asking a question
Description
I used to use Amazon Linux 2 as the base OS for my load tests. Because the python available on that OS is 3.7, the latest locust I could get was 2.17.0. With 5 c5n.xlarge EC2 instances (each has 4 vCPU) as workers, I could use spawn 1200 users. The wait_time for the test was set to constant_thoughtput(1) so that the total 1200 rps stress could be achieved.
Recently, I updated the base OS to Amazon Linux 2023. The python version became 3.11. I could use the latest version of locust - 2.26.0. However, the above setup (5 c5n.xlarge EC2 instances) could not provide the desired load. It could only spawn totally about 830 users. The total rsp was only around 330 even though the wait_time was still constant_thoughtput(1). I noticed that CPU usage of each worker process was close to 100% already.
The server being tested did not change. The same locustfile was used for tests. However, the performance between the above 2 locust setup was day and night difference. This seems like a regression.
Here is the output of the python 3.11 environment:
Package Version
blinker 1.7.0
Brotli 1.1.0
certifi 2024.2.2
charset-normalizer 3.3.2
click 8.1.7
ConfigArgParse 1.7
Flask 3.0.3
Flask-Cors 4.0.0
Flask-Login 0.6.3
gevent 24.2.1
geventhttpclient 2.2.1
greenlet 3.0.3
idna 3.7
itsdangerous 2.2.0
Jinja2 3.1.3
locust 2.26.0
MarkupSafe 2.1.5
msgpack 1.0.8
pip 22.3.1
psutil 5.9.8
pyzmq 26.0.2
requests 2.31.0
roundrobin 0.0.4
setuptools 65.5.1
urllib3 2.2.1
Werkzeug 3.0.2
zope.event 5.0
zope.interface 6.3
Command line
master side: locust -f /opt/locustfile.py --master worker side: locust -f - --worker --master-host <master_ip> --processes -1
Locustfile contents
class QuickstartUser(HttpUser):
def on_start(self):
self.pixel_ids = self.environment.parsed_options.pixel_ids.split(",")
self.client.verify = True if self.environment.parsed_options.verify_cert.lower() == "true" else False
@task
def cloudbridge(self):
pixel_id = random.choice(self.pixel_ids)
event_body = {
"fb.pixel_id": pixel_id,
"event_id": generate_event_id(),
"event_name": self.environment.parsed_options.event_name,
"conversion_value": {
"value": "9",
"currency": "USD",
},
}
self.client.post(self.environment.parsed_options.path, json=event_body, name="event")
self.client.close()
wait_time = constant_throughput(2)
Python version
3.11
Locust version
2.26.0
Operating system
Amazon Linux 2023