Cirron measures how many CPU instructions and system calls a piece of Python code executes.
Project description
Cirron
Cirron measures a piece of Python code and report back several performance counters: CPU instruction count, branch misses, page faults and time spent measuring. It uses the Linux perf events interface or @ibireme's KPC demo on OSX.
It can also trace and modify syscalls using strace
, Linux only!
Prerequisites
- Linux with perf events support / Apple ARM OSX
- C++
- Python 3.x
Installation
Python
pip install cirron
The wrapper automatically compiles the C++ library (cirronlib.cpp) on first use.
Usage
Performance Counters
$ sudo python
>>> from cirron import Collector
>>>
>>> # Start collecting performance metrics
>>> with Collector() as collector:
>>> # Your code here
>>> print("Hello")
>>>
>>> # Retrieve the metrics
>>> print(collector.counters)
Counter(time_enabled_ns=144185, instruction_count=19434, branch_misses=440, page_faults=0)
Tracing Syscalls
$ sudo python
>>> from cirron import Tracer, to_tef
>>> with Tracer() as tracer:
>>> # Your code here
>>> print("Hello")
>>>
>>> # Retrieve the trace
>>> print(tracer.trace)
>>> [Syscall(name='write', args='1, "Hello\\n", 6', retval='6', duration='0.000043', timestamp='1720333364.368337', pid='2270837')]
>>>
>>> # Save the trace for ingesting to Perfetto
>>> open("/tmp/trace", "w").write(to_tef(tracer.trace))
Tampering with Syscalls
Available tampering actions are:
error
: Inject a fault with the specified errno.
retval
: Inject a success with the specified return value.
signal
: Deliver the specified signal on syscall entry.
delay_enter
: Delay syscall entry by the specified time.
delay_exit
: Delay syscall exit by the specified time.
poke_enter
: Modify memory at argN on syscall entry.
poke_exit
: Modify memory at argN on syscall exit.
syscall
: Inject a different syscall instead.
The when
argument can be used to specify when to perform the tampering.
See the Tampering section of the strace manual page for more detailed explanaition of the arguments.
$ sudo python
>>> from cirron import Injector
>>> injector = Injector()
>>> injector.inject("openat", "error", "ENOSPC")
>>> injector.inject("openat", "delay_enter", "1s", when="2+2")
>>> with injector:
>>> # Open now fails with "No space left on device" and every
>>> # other call to `openat` will be delayed by 1s.
>>> f = open("test.txt", "w")
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file Cirron-0.4.tar.gz
.
File metadata
- Download URL: Cirron-0.4.tar.gz
- Upload date:
- Size: 15.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.0.0 CPython/3.11.7
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | ada79cdd34e596522f9a49e99e53c635b602662e51e7e0759f98f89d0c166b33 |
|
MD5 | c999f1aaccdc08e51ae4c2bc8368289b |
|
BLAKE2b-256 | b8945787f7de440911eb17a8ce0e035070ecf4ba48596747f8f44f684d5ec725 |
File details
Details for the file Cirron-0.4-py3-none-any.whl
.
File metadata
- Download URL: Cirron-0.4-py3-none-any.whl
- Upload date:
- Size: 16.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.0.0 CPython/3.11.7
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | cb6afbd1feccbb38c87708b24cc21134e6fe99d23238bff77fd0bb598abc994b |
|
MD5 | e95ba0f71010e86cd4aa5f59254681cc |
|
BLAKE2b-256 | 368d02d428a9e32f25eef62df3ed195201059300c74b85206e26d491fafddc9e |