PyLiveUpdate
is a Python runtime monitoring, profiling, debugging and bugfixing tool.
PyLiveUpdate allows developers to profile, troubleshoot and fix production issues for Python applications without restarting the programs.
- Profile specific Python functions' (by function names or module names) call time.
- Add / remove profilings without restart programs.
- Show profiling results with call summary and flamegraphs.
- Supports Python 3.5+ on Linux.
pip install pyliveupdate
or
git clone https://github.com/devopspp/pyliveupdate.git
pip install -e pyliveupdate
We currently implemented function profiling and are implementing more. Please feel free to let us know if you find other features useful: devopspp#2.
- Start pyliveupdate server
pylu-controller -l
- In your program (like examples/program1.py) main module add
from pyliveupdate import UpdateStub
from pyliveupdatescripts import FP
UpdateStub().start()
- Run your program (make sure in the correct directory)
cd examples
python program1.py
- Start profile a set of functions
FP.profile(['__main__.**', 'module1.**'])
or any functions
FP.profile('**')
- List applied profiling
FP.ls()
- Stop a profiling by its id without stopping your program
FP.revert(1)
- Process the logs to generate a summary and a flamegraph
pylu-processlogs -i /tmp/pyliveupdate.log
- View the generated call summary and flamegraph
The following summary gives in process 4510
thread 5
, views.results
was called 10
times and each time takes 139 ms
, views.results
called manager.all
for 20
times.
4510-Thread-5
function hit time/hit (ms)
views.results 10 138.562
-manager.all 20 14.212
-__init__.__hash__ 10 0.035
-manager.get_queryset 20 0.922
-query.__init__ 20 0.616
-query.__init__ 20 0.071
- One specific function:
module1.class1.func1
- All functions in a class:
module1.class1.*
- All functions in a module:
module1.**
*
means one-level nesting, **
means any level of nesting.
Welcome to register your company name here: devopspp#1