Metadata-Version: 2.1
Name: stress-injector
Version: 0.0.7
Summary: Python module, to inject memory and CPU stress.
Home-page: https://github.com/thevickypedia/stress_injector
Author: Vignesh Sivanandha Rao
Author-email: svignesh1793@gmail.com
License: UNKNOWN
Keywords: stress-test,numpy-arrays,cpu-stress,memory-stress,multiprocessing
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Telecommunications Industry
Classifier: Operating System :: MacOS :: MacOS X
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3.9
Classifier: Topic :: Communications :: Email :: Post-Office :: IMAP
Description-Content-Type: text/markdown; charset=UTF-8
License-File: LICENSE

[![Pypi-version](https://img.shields.io/pypi/v/stress-injector)](https://pypi.org/project/stress-injector)
[![Pypi-py-version](https://img.shields.io/pypi/pyversions/stress-injector)](https://pypi.org/project/stress-injector)

![docs](https://github.com/thevickypedia/stress_injector/actions/workflows/docs.yml/badge.svg)
![pypi](https://github.com/thevickypedia/stress_injector/actions/workflows/python-publish.yml/badge.svg)

[![Pypi-format](https://img.shields.io/pypi/format/stress-injector)](https://pypi.org/project/stress-injector/#files)
[![Pypi-status](https://img.shields.io/pypi/status/stress-injector)](https://pypi.org/project/stress-injector)

![Maintained](https://img.shields.io/maintenance/yes/2022)
[![GitHub Repo created](https://img.shields.io/date/1599432310)](https://api.github.com/repos/thevickypedia/stress_injector)
[![GitHub commit activity](https://img.shields.io/github/commit-activity/y/thevickypedia/stress_injector)](https://api.github.com/repos/thevickypedia/stress-injector)
[![GitHub last commit](https://img.shields.io/github/last-commit/thevickypedia/stress_injector)](https://api.github.com/repos/thevickypedia/stress-injector)

# Stress Injector
Python module, to inject memory and CPU stress

## Insights

**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 user.
* Mean-while the `cpu_percent` from `psutil` runs (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 `multiprocess` and `thread` that was initiated to monitor CPU usage are stopped.

**Memory Stress**
* In this script, I have used `numpy.random.bytes` which are sampled from uniform distribution.
* Generating these random bytes induces a stress on the machine's memory 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.

### Usage
`pip install stress-injector`

[CPU Stress](https://github.com/thevickypedia/stress_injector/blob/main/stressinjector/cpu.py)
```python
from stressinjector.cpu import CPUStress

CPUStress().run()  # will trigger a prompt asking for the number of seconds to be stressed.
# OR
CPUStress(seconds=60).run()  # will run stress on all available logical cores for 60 seconds without a prompt.
```

[Memory Stress](https://github.com/thevickypedia/stress_injector/blob/main/stressinjector/memory.py)
```python
from stressinjector.memory import MemoryStress

MemoryStress().run()  # will trigger a prompt asking for the number of gigabytes to be stressed.
# OR
MemoryStress(gigabytes=10).run()  # will run stress on the memory unit with 10 GigaBytes without a prompt.
```

### Coding Standards:
Docstring format: [`Google`](https://google.github.io/styleguide/pyguide.html#38-comments-and-docstrings) <br>
Styling conventions: [`PEP 8`](https://www.python.org/dev/peps/pep-0008/) <br>
Clean code with pre-commit hooks: [`flake8`](https://flake8.pycqa.org/en/latest/) and 
[`isort`](https://pycqa.github.io/isort/)

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

**Requirement**
<br>
`pip install --no-cache --upgrade sphinx pre-commit recommonmark`

**Usage**
<br>
`pre-commit run --all-files`

### Pypi Package
[![pypi-module](https://img.shields.io/badge/Software%20Repository-pypi-1f425f.svg)](https://packaging.python.org/tutorials/packaging-projects/)

[https://pypi.org/project/stress-injector/](https://pypi.org/project/stress-injector/)

### Runbook
[![made-with-sphinx-doc](https://img.shields.io/badge/Code%20Docs-Sphinx-1f425f.svg)](https://www.sphinx-doc.org/en/master/man/sphinx-autogen.html)

[https://thevickypedia.github.io/stress_injector/](https://thevickypedia.github.io/stress_injector/)

## License & copyright

&copy; Vignesh Sivanandha Rao

Licensed under the [MIT License](https://github.com/thevickypedia/stress_injector/blob/main/LICENSE)

[comment]: <> (brew install gh)
[comment]: <> (gh auth login)
[comment]: <> (`gh release create 0.0.7 --notes-file CHANGELOG --title 'Automate releases'`)


Change Log
==========

0.2.7 (01/10/2022)
------------------
- Upgrade packages in requirements.txt
- Update maintenance year to 2022
- Generate CHANGELOG in LIFO manner
- Update docs big time

0.2.6 (08/14/2021)
------------------
- Stop the thread that measures CPU usage during a manual interrupt
- Previously CPUStress measurement used to run until the current time reaches 3 seconds in addition to the user input.
- Since the measurement runs in a dedicated thread this, stopping stress never stopped the usage display.
- Now CPUStress measurement will stop when a manual interrupt is received using a stop_flag variable.
- Update docs and README.md internal link.

0.2.5 (08/11/2021)
------------------
- Bug fix
- Fix broken CPU stress because of global variable
- Wrap everything inside a class
- Add an option to pass the user input when the class is initialized
- Update dependencies, docs and readme
- Update variable names to right convention

0.2.4 (08/04/2021)
------------------
- Update README.md and docs

0.2.3 (08/04/2021)
------------------
- Mark methods as internal
- Update dependencies and readme

0.2.2 (08/04/2021)
------------------
- Roll back module name
- Update badges in README.md

0.2.1 (08/04/2021)
------------------
- Update docs
- Change module name
- Fix broken references
- Bump version

0.2.0 (08/04/2021)
------------------
- Onboard to pypi

0.1.9 (08/04/2021)
------------------
- auto upload to pypi when tagged a release version

0.1.8 (08/04/2021)
------------------
- auto gen docs

0.1.7 (07/18/2021)
------------------
- Add hyperlinks to docstrings

0.1.6 (07/18/2021)
------------------
- Onboard sphinx documentation generator
- Split `memory` and `CPU` stress into individual files
- Add LICENSE
- Update README.md

0.1.5 (07/18/2021)
------------------
- Onboard sphinx documentation generator
- Split `memory` and `CPU` stress into individual files
- Add LICENSE
- Update README.md

0.1.4 (07/17/2021)
------------------
- add LICENSE

0.1.3 (04/05/2021)
------------------
- show each core's max utilization and handle manual interrupts

0.1.2 (04/05/2021)
------------------
- update README.md

0.1.1 (02/20/2021)
------------------
- add CPU stress injector using multiprocessing and multithreading
- update README.md
- add requirements.txt
- update .gitignore

0.1.0 (10/19/2020)
------------------
- get user input for stress limit

0.0.9 (10/08/2020)
------------------
- add windows support for stress injector

0.0.8 (10/08/2020)
------------------
- use tqdm to add a progress bar

0.0.7 (10/07/2020)
------------------
- maintain coding standards

0.0.6 (10/07/2020)
------------------
- update README.md

0.0.5 (10/07/2020)
------------------
- convert to human readable format

0.0.4 (10/07/2020)
------------------
- get memory consumption in bytes

0.0.3 (10/07/2020)
------------------
- basic script to induce stress

0.0.2 (10/07/2020)
------------------
- initial commit

0.0.1 (10/07/2020)
------------------
- Initial commit


