How to Load Test a Website With Locust

How to load test a website using the Locust python tool. I wanted to find out what a google cloud instance running LEMP could handle.

How to Load Test a Website With Locust

I wanted to load test my GCP instances so went looking for a new tool and found Locust. I've used siege and some other web-based paid services before but I just wanted something fun to test the smallest GCP instances with.

Best installed on a dev machine with decent specs if you want to hammer something I guess. I opened my Debian WSL2 and installed python3.

sudo apt install python3

Then I had to install pip

sudo apt install python3-venv python3-pip

Then finally I can install Locust

pip3 install locust

However the install kept failing with

💡
Command "/usr/bin/python3 -m pip install --ignore-installed --no-user --prefix /tmp/pip-build-env-l8gris2q --no-warn-script-location --no-binary :none: --only-binary :none: -i https://pypi.org/simple -- "setuptools >= 40.8.0" wheel "Cython >= 3.0a9" "cffi >= 1.12.3 ; platform_python_implementation == 'CPython'" "greenlet >= 0.4.17, < 2.0 ; platform_python_implementation == 'CPython'"" failed with error code 1 in None

I tried installing as sudo, updating pip with sudo pip install --upgrade setuptools and the updates in this StackOverflow.

Then I saw a bit further up in the error I was missing a file

💡
c/_cffi_backend.c:15:10: fatal error: ffi.h: No such file or directory

I installed libffi-dev to fix the issue then ran the locust install again with success.

apt install libffi-dev

The I realised that I was going to have to mess about opening ports from the Debian WSL2 instance to browse to it from the Windows host, got bored with this tangent as really I was meant to be load testing the GCP instance so installed Python on Windows, ran the pip3 install command with no issues and cracked on setting up a Locust test. The whole windows install took minutes :-)

(edit: actually no messing with ports, when installing Hugo on WSL2 Windows took care of port forwarding localhost:1313 and it just worked when I browsed to localhost from the host machine)

This was my test to check a couple of bookstack pages:

from locust import HttpUser, task

class HelloWorldUser(HttpUser):
    @task
    def hello_world(self):
        self.client.get("/docs")
        self.client.get("/docs/books/technical/page/locust")

Then I ran locust and browsed to http://localhost:8089/

Then I went and actually tried to use the site for real, hard-refreshing pages and just getting a feel for how fast these instances were with no optimisation and some load. Happily the second size up GCP instance is easily enough to run a small web server.