thevickypedia / stress-injector

Python script, to inject memory, CPU and URL stress

Home Page:https://thevickypedia.github.io/stress_injector/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Pypi-version Pypi-py-version

pages-build-deployment pypi-publish

Pypi-format Pypi-status

Maintained GitHub Repo created GitHub commit activity GitHub last commit

Stress Injector

Python module, to inject memory, CPU and URL stress.

Insights about CPU Stress
  • To achieve CPU stress, I have used multiprocess, looped for the number of logical cores, triggering an infinite loop on each core.
  • The infinite loop will run for a given number of seconds (provided by the user)
  • Mean-while the cpu_percent from psutil runs (in a dedicated thread) in an infinite loop calculating the current CPU utilization on each CPU core.
  • The dedicated thread runs for 3 seconds in addition to the number of seconds provided by the user.
  • Once the given number of seconds have passed, the processes and threads initiated to monitor CPU usage are stopped.

Insights about Memory Stress
  • In this script, I have used numpy.random.bytes which are sampled from uniform distribution.
  • These random bytes are collected from the machine's physical memory increasing the program's usage.
  • I have then used getrusage (get resource usage) for SELF to get the memory consumed only by the current script.
  • The size_converter converts the bytes from resource usage to a human understandable format.

Insights about URL Stress
  • In this script, I have used threadpools to make concurrent requests.
  • The script uses requests module to make calls.
  • Takes arguments
    • rate: Number of calls to make. Defaults to 100K
    • timeout: Timeout for each request. Defaults to 0.5
    • retry_limit: Retry limit if the system is unable to spinup more threads. Defaults to 5
    • circuit_break: Wait time in seconds between retries. Defaults to 5
    • request_type: Function from requests module.

Usage

pip install stress-injector

CPU Stress

import stressinjector as injector


if __name__ == '__main__':
    injector.CPUStress(seconds=300)

Memory Stress

import stressinjector as injector


if __name__ == '__main__':
    injector.MemoryStress(gigabytes=2_000)

URL Stress

import os
import stressinjector as injector


if __name__ == '__main__':
    injector.URLStress(url='http://0.0.0.0:5002/')  # Stress test GET calls

    # Stress test POST calls, also supports PUT, and DELETE
    sample_data = {'headers': {'Authorization': 'Bearer %s' % os.environ.get('TOKEN')}}
    injector.URLStress(
      url='http://0.0.0.0:5002/',
      request_type=injector.RequestType.post,
      **sample_data
    )

This module can only induce stress on a given URL by making N number of calls. Suitable for APIs running on localhost.

To perform a real-time load test, refer locust.io

Coding Standards

Docstring format: Google
Styling conventions: PEP 8
Clean code with pre-commit hooks: flake8 and isort

Requirement

python -m pip install gitverse

Usage

gitverse-release reverse -f release_notes.rst -t 'Release Notes'

Linting

PreCommit will ensure linting, and the doc creation are run on every commit.

Requirement

pip install --no-cache sphinx==5.1.1 pre-commit recommonmark

Usage

pre-commit run --all-files

Pypi Package

pypi-module

https://pypi.org/project/stress-injector/

Runbook

made-with-sphinx-doc

https://thevickypedia.github.io/stress-injector/

License & copyright

© Vignesh Sivanandha Rao

Licensed under the MIT License

About

Python script, to inject memory, CPU and URL stress

https://thevickypedia.github.io/stress_injector/

License:MIT License


Languages

Language:Python 91.2%Language:Batchfile 3.6%Language:Makefile 2.9%Language:Shell 2.4%