2013-09-02 18:35:54 -04:00
|
|
|
PEP: 454
|
|
|
|
Title: Add a new tracemalloc module to trace Python memory allocations
|
|
|
|
Version: $Revision$
|
|
|
|
Last-Modified: $Date$
|
|
|
|
Author: Victor Stinner <victor.stinner@gmail.com>
|
|
|
|
Status: Draft
|
|
|
|
Type: Standards Track
|
|
|
|
Content-Type: text/x-rst
|
|
|
|
Created: 3-September-2013
|
|
|
|
Python-Version: 3.4
|
|
|
|
|
|
|
|
|
|
|
|
Abstract
|
|
|
|
========
|
|
|
|
|
2013-09-16 19:38:43 -04:00
|
|
|
Add a new ``tracemalloc`` module to trace memory blocks allocated by Python.
|
2013-09-02 18:35:54 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Rationale
|
|
|
|
=========
|
|
|
|
|
2013-09-03 19:19:30 -04:00
|
|
|
Common debug tools tracing memory allocations read the C filename and
|
|
|
|
number. Using such tool to analyze Python memory allocations does not
|
2013-09-03 20:02:50 -04:00
|
|
|
help because most memory block are allocated in the same C function,
|
|
|
|
in ``PyMem_Malloc()`` for example.
|
2013-09-03 19:19:30 -04:00
|
|
|
|
2013-09-03 20:02:50 -04:00
|
|
|
There are debug tools dedicated to the Python language like ``Heapy``
|
2013-09-03 19:19:30 -04:00
|
|
|
and ``PySizer``. These projects analyze objects type and/or content.
|
2013-09-03 20:02:50 -04:00
|
|
|
These tools are useful when most memory leaks are instances of the
|
|
|
|
same type and this type is only instancied in a few functions. The
|
2013-09-03 19:19:30 -04:00
|
|
|
problem is when the object type is very common like ``str`` or
|
2013-09-03 20:02:50 -04:00
|
|
|
``tuple``, and it is hard to identify where these objects are
|
|
|
|
instancied.
|
2013-09-03 19:19:30 -04:00
|
|
|
|
2013-09-03 20:02:50 -04:00
|
|
|
Finding reference cycles is also a difficult problem. There are
|
|
|
|
different tools to draw a diagram of all references. These tools cannot
|
|
|
|
be used on large applications with thousands of objects because the
|
|
|
|
diagram is too huge to be analyzed manually.
|
2013-09-03 19:19:30 -04:00
|
|
|
|
|
|
|
|
|
|
|
Proposal
|
|
|
|
========
|
|
|
|
|
|
|
|
Using the PEP 445, it becomes easy to setup an hook on Python memory
|
|
|
|
allocators. The hook can inspect the current Python frame to get the
|
|
|
|
Python filename and line number.
|
|
|
|
|
|
|
|
This PEP proposes to add a new ``tracemalloc`` module. It is a debug
|
|
|
|
tool to trace memory allocations made by Python. The module provides the
|
|
|
|
following information:
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-09-16 19:38:43 -04:00
|
|
|
* Compute the differences between two snapshots to detect memory leaks
|
|
|
|
* Statistics on allocated memory blocks per filename and per line number:
|
|
|
|
total size, number and average size of allocated memory blocks
|
|
|
|
* For each allocated memory block: its size and the traceback where the block
|
|
|
|
was allocated
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-09-05 17:29:40 -04:00
|
|
|
The API of the tracemalloc module is similar to the API of the
|
|
|
|
faulthandler module: ``enable()``, ``disable()`` and ``is_enabled()``
|
|
|
|
functions, an environment variable (``PYTHONFAULTHANDLER`` and
|
|
|
|
``PYTHONTRACEMALLOC``), a ``-X`` command line option (``-X
|
|
|
|
faulthandler`` and ``-X tracemalloc``). See the
|
|
|
|
`documentation of the faulthandler module
|
|
|
|
<http://docs.python.org/dev/library/faulthandler.html>`_.
|
2013-09-05 17:23:35 -04:00
|
|
|
|
2013-09-05 17:26:55 -04:00
|
|
|
The tracemalloc module has been written for CPython. Other
|
|
|
|
implementations of Python may not provide it.
|
|
|
|
|
2013-09-03 19:19:30 -04:00
|
|
|
|
2013-09-02 18:53:13 -04:00
|
|
|
API
|
|
|
|
===
|
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
To trace most memory blocks allocated by Python, the module should be enabled
|
|
|
|
as early as possible by setting the ``PYTHONTRACEMALLOC`` environment
|
|
|
|
variable to ``1``, or by using ``-X tracemalloc`` command line
|
|
|
|
option. The ``tracemalloc.enable`` function can also be called to start
|
|
|
|
tracing Python memory allocations.
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
By default, a trace of an allocated memory block only stores one frame. Use the
|
|
|
|
``set_traceback_limit`` function to store more frames.
|
2013-09-05 17:15:45 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Python memory blocks allocated in the ``tracemalloc`` module are ignored by
|
|
|
|
default using a filter. Use the ``clear_filters`` function to see trace
|
|
|
|
also these memory allocations.
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
At fork, the module is automatically disabled in the child process.
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-09-08 09:58:01 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Main Functions
|
|
|
|
--------------
|
2013-09-08 09:58:01 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``cancel_tasks()`` function:
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Cancel all scheduled tasks.
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
See also the ``get_tasks`` function.
|
2013-09-16 19:38:43 -04:00
|
|
|
|
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``clear_traces()`` function:
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Clear all traces and statistics on Python memory allocations, and reset the
|
|
|
|
``get_arena_size`` and ``get_traced_memory`` counters.
|
2013-09-16 19:38:43 -04:00
|
|
|
|
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``disable()`` function:
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Stop tracing Python memory allocations and cancel scheduled tasks.
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
See also ``enable`` and ``is_enabled`` functions.
|
2013-09-08 09:58:01 -04:00
|
|
|
|
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``enable()`` function:
|
2013-09-08 09:15:26 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Start tracing Python memory allocations.
|
2013-09-08 09:15:26 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
At fork, the module is automatically disabled in the child process.
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
See also ``disable`` and ``is_enabled`` functions.
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``get_stats()`` function:
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Get statistics on traced Python memory blocks as a dictionary ``{filename
|
|
|
|
(str): {line_number (int): stats}}`` where *stats* in a
|
|
|
|
``(size: int, count: int)`` tuple, *filename* and *line_number* can
|
|
|
|
be ``None``.
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Return an empty dictionary if the ``tracemalloc`` module is disabled.
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
See also the ``get_traces`` function.
|
2013-09-16 19:38:43 -04:00
|
|
|
|
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``get_tasks()`` function:
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Get the list of scheduled tasks, list of ``Task`` instances.
|
2013-09-05 17:15:45 -04:00
|
|
|
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``is_enabled()`` function:
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``True`` if the ``tracemalloc`` module is tracing Python memory
|
|
|
|
allocations, ``False`` otherwise.
|
|
|
|
|
|
|
|
See also ``enable`` and ``disable`` functions.
|
2013-09-08 09:15:26 -04:00
|
|
|
|
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Trace Functions
|
|
|
|
---------------
|
2013-09-08 09:15:26 -04:00
|
|
|
|
2013-09-16 19:38:43 -04:00
|
|
|
``get_traceback_limit()`` function:
|
2013-09-08 09:58:01 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Get the maximum number of frames stored in the traceback of a trace of a
|
|
|
|
memory block.
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Use the ``set_traceback_limit`` function to change the limit.
|
2013-09-05 17:15:45 -04:00
|
|
|
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-09-03 19:19:30 -04:00
|
|
|
``get_object_address(obj)`` function:
|
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Get the address of the memory block of the specified Python object.
|
|
|
|
|
|
|
|
A Python object can be composed by multiple memory blocks, the function only
|
|
|
|
returns the address of the main memory block.
|
|
|
|
|
|
|
|
See also ``get_object_trace`` and ``gc.get_referrers`` functions.
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-09-03 19:19:30 -04:00
|
|
|
``get_object_trace(obj)`` function:
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Get the trace of a Python object *obj* as a ``(size: int, traceback)`` tuple
|
|
|
|
where *traceback* is a tuple of ``(filename: str, lineno: int)`` tuples,
|
|
|
|
*filename* and *lineno* can be ``None``.
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
The function only returns the trace of the main memory block of the object.
|
|
|
|
The *size* of the trace is smaller than the total size of the object if the
|
|
|
|
object is composed by more than one memory block.
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Return ``None`` if the ``tracemalloc`` module did not trace the
|
|
|
|
allocation of the object.
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
See also ``get_object_address``, ``get_trace``, ``get_traces``,
|
|
|
|
``gc.get_referrers`` and ``sys.getsizeof`` functions.
|
2013-09-02 18:35:54 -04:00
|
|
|
|
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``get_trace(address)`` function:
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Get the trace of a memory block as a ``(size: int, traceback)`` tuple where
|
|
|
|
*traceback* is a tuple of ``(filename: str, lineno: int)`` tuples,
|
|
|
|
*filename* and *lineno* can be ``None``.
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Return ``None`` if the ``tracemalloc`` module did not trace the
|
|
|
|
allocation of the memory block.
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
See also ``get_object_trace``, ``get_stats`` and ``get_traces``
|
|
|
|
functions.
|
2013-09-02 18:35:54 -04:00
|
|
|
|
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``get_traces()`` function:
|
2013-09-03 19:19:30 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Get all traces of Python memory allocations as a dictionary ``{address
|
|
|
|
(int): trace}`` where *trace* is a
|
|
|
|
``(size: int, traceback)`` and *traceback* is a list of
|
|
|
|
``(filename: str, lineno: int)``.
|
|
|
|
*traceback* can be empty, *filename* and *lineno* can be None.
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Return an empty dictionary if the ``tracemalloc`` module is disabled.
|
2013-09-03 19:19:30 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
See also ``get_object_trace``, ``get_stats`` and ``get_trace``
|
|
|
|
functions.
|
2013-09-03 19:19:30 -04:00
|
|
|
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``set_traceback_limit(nframe: int)`` function:
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Set the maximum number of frames stored in the traceback of a trace of a
|
|
|
|
memory block.
|
2013-09-03 19:19:30 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Storing the traceback of each memory allocation has an important overhead on
|
|
|
|
the memory usage. Use the ``get_tracemalloc_memory`` function to measure
|
|
|
|
the overhead and the ``add_filter`` function to select which memory
|
|
|
|
allocations are traced.
|
2013-09-08 09:58:01 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Use the ``get_traceback_limit`` function to get the current limit.
|
2013-09-08 09:58:01 -04:00
|
|
|
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Filter Functions
|
|
|
|
----------------
|
2013-09-03 19:19:30 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``add_filter(filter)`` function:
|
2013-09-05 17:15:45 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Add a new filter on Python memory allocations, *filter* is a ``Filter``
|
|
|
|
instance.
|
2013-09-05 17:15:45 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
All inclusive filters are applied at once, a memory allocation is only
|
|
|
|
ignored if no inclusive filter match its trace. A memory allocation is
|
|
|
|
ignored if at least one exclusive filter matchs its trace.
|
2013-09-05 17:15:45 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
The new filter is not applied on already collected traces. Use the
|
|
|
|
``clear_traces`` function to ensure that all traces match the new
|
|
|
|
filter.
|
2013-09-05 17:15:45 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``add_include_filter(filename: str, lineno: int=None, traceback: bool=False)`` function:
|
2013-09-03 19:19:30 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Add an inclusive filter: helper for the ``add_filter`` method creating a
|
|
|
|
``Filter`` instance with the ``Filter.include`` attribute set to
|
|
|
|
``True``.
|
2013-09-03 19:19:30 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Example: ``tracemalloc.add_include_filter(tracemalloc.__file__)`` only
|
|
|
|
includes memory blocks allocated by the ``tracemalloc`` module.
|
2013-09-03 19:19:30 -04:00
|
|
|
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``add_exclude_filter(filename: str, lineno: int=None, traceback: bool=False)`` function:
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Add an exclusive filter: helper for the ``add_filter`` method creating a
|
|
|
|
``Filter`` instance with the ``Filter.include`` attribute set to
|
|
|
|
``False``.
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Example: ``tracemalloc.add_exclude_filter(tracemalloc.__file__)`` ignores
|
|
|
|
memory blocks allocated by the ``tracemalloc`` module.
|
2013-09-02 18:35:54 -04:00
|
|
|
|
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``clear_filters()`` function:
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Reset the filter list.
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
See also the ``get_filters`` function.
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-09-04 07:19:17 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``get_filters()`` function:
|
2013-09-04 07:19:17 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Get the filters on Python memory allocations as list of ``Filter``
|
|
|
|
instances.
|
2013-09-04 07:19:17 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
See also the ``clear_filters`` function.
|
2013-09-04 07:19:17 -04:00
|
|
|
|
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Metric Functions
|
2013-09-16 19:38:43 -04:00
|
|
|
----------------
|
2013-09-04 07:19:17 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
The following functions can be used to add metrics to a snapshot, see
|
|
|
|
the ``Snapshot.add_metric`` method.
|
|
|
|
|
|
|
|
``get_allocated_blocks()`` function:
|
|
|
|
|
|
|
|
Get the current number of allocated memory blocks.
|
|
|
|
|
|
|
|
|
|
|
|
``get_arena_size()`` function:
|
|
|
|
|
|
|
|
Get the size in bytes of traced arenas.
|
|
|
|
|
|
|
|
See also the ``get_pymalloc_stats`` function.
|
|
|
|
|
|
|
|
|
|
|
|
``get_process_memory()`` function:
|
|
|
|
|
|
|
|
Get the memory usage of the current process as a ``(rss: int, vms: int)``
|
|
|
|
tuple, *rss* is the "Resident Set Size" in bytes and *vms* is the size of
|
|
|
|
the virtual memory in bytes
|
|
|
|
|
|
|
|
Return ``None`` if the platform is not supported.
|
|
|
|
|
|
|
|
|
|
|
|
``get_pymalloc_stats()`` function:
|
|
|
|
|
|
|
|
Get statistics on the ``pymalloc`` allocator as a dictionary.
|
|
|
|
|
|
|
|
+---------------------+-------------------------------------------------------+
|
|
|
|
| Key | Description |
|
|
|
|
+=====================+=======================================================+
|
|
|
|
| ``alignment`` | Alignment of addresses returned to the user. |
|
|
|
|
+---------------------+-------------------------------------------------------+
|
|
|
|
| ``threshold`` | Small block threshold in bytes: pymalloc uses |
|
|
|
|
| | PyMem_RawMalloc() for allocation greater than |
|
|
|
|
| | threshold. |
|
|
|
|
+---------------------+-------------------------------------------------------+
|
|
|
|
| ``nalloc`` | Number of times object malloc called |
|
|
|
|
+---------------------+-------------------------------------------------------+
|
|
|
|
| ``arena_size`` | Arena size in bytes |
|
|
|
|
+---------------------+-------------------------------------------------------+
|
|
|
|
| ``total_arenas`` | Number of calls to new_arena(): total number of |
|
|
|
|
| | allocated arenas, including released arenas |
|
|
|
|
+---------------------+-------------------------------------------------------+
|
|
|
|
| ``max_arenas`` | Maximum number of arenas |
|
|
|
|
+---------------------+-------------------------------------------------------+
|
|
|
|
| ``arenas`` | Number of arenas currently allocated |
|
|
|
|
+---------------------+-------------------------------------------------------+
|
|
|
|
| ``allocated_bytes`` | Number of bytes in allocated blocks |
|
|
|
|
+---------------------+-------------------------------------------------------+
|
|
|
|
| ``available_bytes`` | Number of bytes in available blocks in used pools |
|
|
|
|
+---------------------+-------------------------------------------------------+
|
|
|
|
| ``pool_size`` | Pool size in bytes |
|
|
|
|
+---------------------+-------------------------------------------------------+
|
|
|
|
| ``free_pools`` | Number of unused pools |
|
|
|
|
+---------------------+-------------------------------------------------------+
|
|
|
|
| ``pool_headers`` | Number of bytes wasted in pool headers |
|
|
|
|
+---------------------+-------------------------------------------------------+
|
|
|
|
| ``quantization`` | Number of bytes in used and full pools wasted due to |
|
|
|
|
| | quantization, i.e. the necessarily leftover space at |
|
|
|
|
| | the ends of used and full pools. |
|
|
|
|
+---------------------+-------------------------------------------------------+
|
|
|
|
| ``arena_alignment`` | Number of bytes for arena alignment padding |
|
|
|
|
+---------------------+-------------------------------------------------------+
|
|
|
|
|
|
|
|
The function is not available if Python is compiled without ``pymalloc``.
|
|
|
|
|
|
|
|
See also ``get_arena_size`` and ``sys._debugmallocstats`` functions.
|
|
|
|
|
|
|
|
|
|
|
|
``get_traced_memory()`` function:
|
|
|
|
|
|
|
|
Get the current size and maximum size of memory blocks traced by the
|
|
|
|
``tracemalloc`` module as a tuple: ``(size: int, max_size: int)``.
|
|
|
|
|
|
|
|
|
|
|
|
``get_tracemalloc_memory()`` function:
|
|
|
|
|
|
|
|
Get the memory usage in bytes of the ``tracemalloc`` module as a
|
|
|
|
tuple: ``(size: int, free: int)``.
|
|
|
|
|
|
|
|
* *size*: total size of bytes allocated by the module,
|
|
|
|
including *free* bytes
|
|
|
|
* *free*: number of free bytes available to store data
|
|
|
|
|
|
|
|
|
|
|
|
``get_unicode_interned()`` function:
|
|
|
|
|
|
|
|
Get the size in bytes and the length of the dictionary of Unicode interned
|
|
|
|
strings as a ``(size: int, length: int)`` tuple.
|
|
|
|
|
|
|
|
|
|
|
|
DisplayTop
|
|
|
|
----------
|
|
|
|
|
2013-09-16 19:38:43 -04:00
|
|
|
``DisplayTop()`` class:
|
2013-09-04 07:19:17 -04:00
|
|
|
|
2013-09-16 19:38:43 -04:00
|
|
|
Display the top of allocated memory blocks.
|
2013-09-04 07:19:17 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``display(count=10, group_by="line", cumulative=False, file=None, callback=None)`` method:
|
|
|
|
|
|
|
|
Take a snapshot and display the top *count* biggest allocated memory
|
|
|
|
blocks grouped by *group_by*.
|
|
|
|
|
|
|
|
*callback* is an optional callable object which can be used to add
|
|
|
|
metrics to a snapshot. It is called with only one parameter: the newly
|
|
|
|
created snapshot instance. Use the ``Snapshot.add_metric`` method to
|
|
|
|
add new metric.
|
|
|
|
|
|
|
|
Return the snapshot, a ``Snapshot`` instance.
|
2013-09-03 19:19:30 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``display_snapshot(snapshot, count=10, group_by="line", cumulative=False, file=None)`` method:
|
|
|
|
|
|
|
|
Display a snapshot of memory blocks allocated by Python, *snapshot* is a
|
|
|
|
``Snapshot`` instance.
|
2013-09-03 19:19:30 -04:00
|
|
|
|
2013-09-16 19:38:43 -04:00
|
|
|
``display_top_diff(top_diff, count=10, file=None)`` method:
|
2013-09-03 19:19:30 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Display differences between two ``GroupedStats`` instances,
|
|
|
|
*top_diff* is a ``StatsDiff`` instance.
|
2013-09-03 19:19:30 -04:00
|
|
|
|
2013-09-16 19:38:43 -04:00
|
|
|
``display_top_stats(top_stats, count=10, file=None)`` method:
|
2013-09-03 19:19:30 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Display the top of allocated memory blocks grouped by the
|
|
|
|
``GroupedStats.group_by`` attribute of *top_stats*, *top_stats* is a
|
|
|
|
``GroupedStats`` instance.
|
|
|
|
|
|
|
|
``average`` attribute:
|
|
|
|
|
|
|
|
If ``True`` (default value), display the average size of memory blocks.
|
2013-09-03 19:19:30 -04:00
|
|
|
|
2013-09-16 19:38:43 -04:00
|
|
|
``color`` attribute:
|
2013-09-03 19:19:30 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
If ``True``, always use colors. If ``False``, never use colors. The
|
|
|
|
default value is ``None``: use colors if the *file* parameter is a TTY
|
|
|
|
device.
|
2013-09-03 19:19:30 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``compare_to_previous`` attribute:
|
|
|
|
|
|
|
|
If ``True`` (default value), compare to the previous snapshot. If
|
|
|
|
``False``, compare to the first snapshot.
|
|
|
|
|
|
|
|
``count`` attribute:
|
2013-09-03 19:19:30 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
If ``True`` (default value), display the number of allocated memory
|
|
|
|
blocks.
|
2013-09-03 19:19:30 -04:00
|
|
|
|
2013-09-16 19:38:43 -04:00
|
|
|
``filename_parts`` attribute:
|
2013-09-03 19:19:30 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Number of displayed filename parts (int, default: ``3``). Extra parts
|
|
|
|
are replaced with ``'...'``.
|
2013-09-03 19:19:30 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``metrics`` attribute:
|
2013-09-03 19:19:30 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
If ``True`` (default value), display metrics: see
|
|
|
|
``Snapshot.metrics``.
|
2013-09-03 19:19:30 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``previous_top_stats`` attribute:
|
2013-09-03 19:19:30 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Previous ``GroupedStats`` instance, or first ``GroupedStats``
|
|
|
|
instance if ``compare_to_previous`` is ``False``, used to display the
|
|
|
|
differences between two snapshots.
|
2013-09-03 19:19:30 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``size`` attribute:
|
2013-09-03 19:19:30 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
If ``True`` (default value), display the size of memory blocks.
|
2013-09-03 19:19:30 -04:00
|
|
|
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
DisplayTopTask
|
|
|
|
--------------
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``DisplayTopTask(count=10, group_by="line", cumulative=False, file=sys.stdout, callback=None)`` class:
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Task taking temporary snapshots and displaying the top *count* memory
|
|
|
|
allocations grouped by *group_by*.
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``DisplayTopTask`` is based on the ``Task`` class and so inherit
|
|
|
|
all attributes and methods, especially:
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
* ``Task.cancel``
|
|
|
|
* ``Task.schedule``
|
|
|
|
* ``Task.set_delay``
|
|
|
|
* ``Task.set_memory_threshold``
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Modify the ``display_top`` attribute to customize the display.
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``display()`` method:
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Take a snapshot and display the top ``count`` biggest allocated
|
|
|
|
memory blocks grouped by ``group_by`` using the ``display_top``
|
|
|
|
attribute.
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Return the snapshot, a ``Snapshot`` instance.
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``callback`` attribute:
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
*callback* is an optional callable object which can be used to add
|
|
|
|
metrics to a snapshot. It is called with only one parameter: the newly
|
|
|
|
created snapshot instance. Use the ``Snapshot.add_metric`` method to
|
|
|
|
add new metric.
|
2013-09-16 19:38:43 -04:00
|
|
|
|
|
|
|
``count`` attribute:
|
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Maximum number of displayed memory blocks.
|
2013-09-16 19:38:43 -04:00
|
|
|
|
|
|
|
``cumulative`` attribute:
|
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
If ``True``, cumulate size and count of memory blocks of all frames of
|
|
|
|
each trace, not only the most recent frame. The default value is
|
|
|
|
``False``.
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
The option is ignored if the traceback limit is less than ``2``, see
|
|
|
|
the ``get_traceback_limit`` function.
|
2013-09-16 19:38:43 -04:00
|
|
|
|
|
|
|
``display_top`` attribute:
|
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Instance of ``DisplayTop``.
|
2013-09-16 19:38:43 -04:00
|
|
|
|
|
|
|
``file`` attribute:
|
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
The top is written into *file*.
|
2013-09-16 19:38:43 -04:00
|
|
|
|
|
|
|
``group_by`` attribute:
|
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Determine how memory allocations are grouped: see ``Snapshot.top_by``
|
|
|
|
for the available values.
|
2013-09-02 18:35:54 -04:00
|
|
|
|
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Filter
|
|
|
|
------
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-09-16 19:38:43 -04:00
|
|
|
``Filter(include: bool, pattern: str, lineno: int=None, traceback: bool=False)`` class:
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Filter to select which memory allocations are traced. Filters can be used to
|
|
|
|
reduce the memory usage of the ``tracemalloc`` module, which can be read
|
|
|
|
using the ``get_tracemalloc_memory`` function.
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-09-16 19:38:43 -04:00
|
|
|
``match(filename: str, lineno: int)`` method:
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Return ``True`` if the filter matchs the filename and line number,
|
|
|
|
``False`` otherwise.
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-09-16 19:38:43 -04:00
|
|
|
``match_filename(filename: str)`` method:
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Return ``True`` if the filter matchs the filename, ``False`` otherwise.
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-09-16 19:38:43 -04:00
|
|
|
``match_lineno(lineno: int)`` method:
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Return ``True`` if the filter matchs the line number, ``False``
|
|
|
|
otherwise.
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``match_traceback(traceback)`` method:
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Return ``True`` if the filter matchs the *traceback*, ``False``
|
|
|
|
otherwise.
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
*traceback* is a tuple of ``(filename: str, lineno: int)`` tuples.
|
|
|
|
|
|
|
|
``include`` attribute:
|
|
|
|
|
|
|
|
If *include* is ``True``, only trace memory blocks allocated in a file
|
|
|
|
with a name matching filename ``pattern`` at line number
|
|
|
|
``lineno``.
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
If *include* is ``False``, ignore memory blocks allocated in a file with
|
|
|
|
a name matching filename :attr`pattern` at line number ``lineno``.
|
2013-09-16 19:38:43 -04:00
|
|
|
|
|
|
|
``lineno`` attribute:
|
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Line number (``int``). If is is ``None`` or less than ``1``, it matches
|
|
|
|
any line number.
|
|
|
|
|
|
|
|
``pattern`` attribute:
|
|
|
|
|
|
|
|
The filename *pattern* can contain one or many ``*`` joker characters
|
|
|
|
which match any substring, including an empty string. The ``.pyc`` and
|
|
|
|
``.pyo`` file extensions are replaced with ``.py``. On Windows, the
|
|
|
|
comparison is case insensitive and the alternative separator ``/`` is
|
|
|
|
replaced with the standard separator ``\``.
|
2013-09-16 19:38:43 -04:00
|
|
|
|
|
|
|
``traceback`` attribute:
|
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
If *traceback* is ``True``, all frames of the traceback are checked. If
|
|
|
|
*traceback* is ``False``, only the most recent frame is checked.
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
This attribute is ignored if the traceback limit is less than ``2``.
|
|
|
|
See the ``get_traceback_limit`` function.
|
2013-09-16 19:38:43 -04:00
|
|
|
|
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
GroupedStats
|
|
|
|
------------
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``GroupedStats(timestamp: datetime.datetime, stats: dict, group_by: str, cumulative=False, metrics: dict=None)`` class:
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Top of allocated memory blocks grouped by *group_by* as a dictionary.
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
The ``Snapshot.top_by`` method creates a ``GroupedStats`` instance.
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``compare_to(old_stats: GroupedStats=None)`` method:
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Compare to an older ``GroupedStats`` instance.
|
|
|
|
Return a ``StatsDiff`` instance.
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
The ``StatsDiff.differences`` list is not sorted: call
|
|
|
|
the ``StatsDiff.sort`` method to sort the list.
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``None`` values are replaced with an empty string for filenames or zero
|
|
|
|
for line numbers, because ``str`` and ``int`` cannot be
|
|
|
|
compared to ``None``.
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``cumulative`` attribute:
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
If ``True``, cumulate size and count of memory blocks of all frames of
|
|
|
|
the traceback of a trace, not only the most recent frame.
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``metrics`` attribute:
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Dictionary storing metrics read when the snapshot was created:
|
|
|
|
``{name (str): metric}`` where *metric* type is ``Metric``.
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``group_by`` attribute:
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Determine how memory allocations were grouped: see
|
|
|
|
``Snapshot.top_by`` for the available values.
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``stats`` attribute:
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Dictionary ``{key: stats}`` where the *key* type depends on the
|
|
|
|
``group_by`` attribute and *stats* is a ``(size: int, count: int)``
|
|
|
|
tuple.
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
See the ``Snapshot.top_by`` method.
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``timestamp`` attribute:
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Creation date and time of the snapshot, ``datetime.datetime``
|
|
|
|
instance.
|
2013-09-16 19:38:43 -04:00
|
|
|
|
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Metric
|
|
|
|
------
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``Metric(name: str, value: int, format: str)`` class:
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Value of a metric when a snapshot is created.
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``name`` attribute:
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Name of the metric.
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``value`` attribute:
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Value of the metric.
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``format`` attribute:
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Format of the metric:
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
* ``int``: a number
|
|
|
|
* ``percent``: percentage (1.0 means 100%)
|
|
|
|
* ``size``: a size in bytes
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-09-02 18:53:13 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Snapshot
|
|
|
|
--------
|
|
|
|
|
|
|
|
``Snapshot(timestamp: datetime.datetime, pid: int, traces: dict=None, stats: dict=None, metrics: dict=None)`` class:
|
|
|
|
|
|
|
|
Snapshot of traces and statistics on memory blocks allocated by Python.
|
|
|
|
|
|
|
|
Use ``TakeSnapshotTask`` to take regulary snapshots.
|
|
|
|
|
|
|
|
``add_gc_metrics()`` method:
|
|
|
|
|
|
|
|
Add a metric on garbage collector:
|
|
|
|
|
|
|
|
* ``gc.objects``: total number of Python objects
|
|
|
|
|
|
|
|
See the ``gc`` module.
|
|
|
|
|
|
|
|
|
|
|
|
``add_metric(name: str, value: int, format: str)`` method:
|
|
|
|
|
|
|
|
Helper to add a ``Metric`` instance to ``Snapshot.metrics``.
|
|
|
|
Return the newly created ``Metric`` instance.
|
|
|
|
|
|
|
|
Raise an exception if the name is already present in
|
|
|
|
``Snapshot.metrics``.
|
|
|
|
|
|
|
|
|
|
|
|
``add_process_memory_metrics()`` method:
|
|
|
|
|
|
|
|
Add metrics on the process memory:
|
|
|
|
|
|
|
|
* ``process_memory.rss``: Resident Set Size
|
|
|
|
* ``process_memory.vms``: Virtual Memory Size
|
|
|
|
|
|
|
|
These metrics are only available if the ``get_process_memory``
|
|
|
|
function is available on the platform.
|
|
|
|
|
|
|
|
|
|
|
|
``add_pymalloc_metrics()`` method:
|
|
|
|
|
|
|
|
Add metrics on the Python memory allocator (``pymalloc``):
|
|
|
|
|
|
|
|
* ``pymalloc.blocks``: number of allocated memory blocks
|
|
|
|
* ``pymalloc.size``: size of ``pymalloc`` arenas
|
|
|
|
* ``pymalloc.max_size``: maximum size of ``pymalloc`` arenas
|
|
|
|
* ``pymalloc.allocated``: number of allocated bytes
|
|
|
|
* ``pymalloc.free``: number of free bytes
|
|
|
|
* ``pymalloc.fragmentation``: fragmentation percentage of the arenas
|
|
|
|
|
|
|
|
These metrics are only available if Python is compiled in debug mode,
|
|
|
|
except ``pymalloc.blocks`` which is always available.
|
|
|
|
|
|
|
|
|
|
|
|
``add_tracemalloc_metrics()`` method:
|
|
|
|
|
|
|
|
Add metrics on the ``tracemalloc`` module:
|
|
|
|
|
|
|
|
* ``tracemalloc.traced.size``: size of memory blocks traced by the
|
|
|
|
``tracemalloc`` module
|
|
|
|
* ``tracemalloc.traced.max_size``: maximum size of memory blocks traced
|
|
|
|
by the ``tracemalloc`` module
|
|
|
|
* ``tracemalloc.traces``: number of traces of Python memory blocks
|
|
|
|
* ``tracemalloc.module.size``: total size of bytes allocated by the
|
|
|
|
``tracemalloc`` module, including free bytes
|
|
|
|
* ``tracemalloc.module.free``: number of free bytes available for
|
|
|
|
the ``tracemalloc`` module
|
|
|
|
* ``tracemalloc.module.fragmentation``: percentage of fragmentation of
|
|
|
|
the memory allocated by the ``tracemalloc`` module
|
|
|
|
* ``tracemalloc.arena_size``: size of traced arenas
|
|
|
|
|
|
|
|
``tracemalloc.traces`` metric is only present if the snapshot was created
|
|
|
|
with traces.
|
|
|
|
|
|
|
|
|
|
|
|
``add_unicode_metrics()`` method:
|
|
|
|
|
|
|
|
Add metrics on the Unicode interned strings:
|
|
|
|
|
|
|
|
* ``unicode_interned.size``: size of the dictionary, excluding size
|
|
|
|
of strings
|
|
|
|
* ``unicode_interned.len``: length of the dictionary
|
2013-09-03 07:18:48 -04:00
|
|
|
|
2013-09-02 18:53:13 -04:00
|
|
|
|
2013-09-16 19:38:43 -04:00
|
|
|
``apply_filters(filters)`` method:
|
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Apply filters on the ``traces`` and ``stats`` dictionaries,
|
|
|
|
*filters* is a list of ``Filter`` instances.
|
|
|
|
|
|
|
|
|
|
|
|
``create(traces=False, metrics=True)`` classmethod:
|
|
|
|
|
|
|
|
Take a snapshot of traces and/or statistics of allocated memory blocks.
|
|
|
|
|
|
|
|
If *traces* is ``True``, ``get_traces`` is called and its result
|
|
|
|
is stored in the ``Snapshot.traces`` attribute. This attribute
|
|
|
|
contains more information than ``Snapshot.stats`` and uses more
|
|
|
|
memory and more disk space. If *traces* is ``False``,
|
|
|
|
``Snapshot.traces`` is set to ``None``.
|
|
|
|
|
|
|
|
If *metrics* is ``True``, fill ``Snapshot.metrics`` with metrics
|
|
|
|
using the following methods:
|
|
|
|
|
|
|
|
* ``add_gc_metrics``
|
|
|
|
* ``add_process_memory_metrics``
|
|
|
|
* ``add_pymalloc_metrics``
|
|
|
|
* ``add_tracemalloc_metrics``
|
|
|
|
* ``add_unicode_metrics``
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
If *metrics* is ``False``, ``Snapshot.metrics`` is set to an empty
|
|
|
|
dictionary.
|
2013-09-16 19:38:43 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Tracebacks of traces are limited to ``traceback_limit`` frames. Call
|
|
|
|
``set_traceback_limit`` before calling ``Snapshot.create`` to
|
|
|
|
store more frames.
|
2013-09-02 18:53:13 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
The ``tracemalloc`` module must be enabled to take a snapshot. See the
|
|
|
|
the ``enable`` function.
|
2013-09-02 18:53:13 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``get_metric(name, default=None)`` method:
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Get the value of the metric called *name*. Return *default* if the metric
|
|
|
|
does not exist.
|
2013-09-03 07:18:48 -04:00
|
|
|
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``load(filename, traces=True)`` classmethod:
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Load a snapshot from a file.
|
|
|
|
|
|
|
|
If *traces* is ``False``, don't load traces.
|
2013-09-02 18:35:54 -04:00
|
|
|
|
|
|
|
|
2013-09-16 19:38:43 -04:00
|
|
|
``top_by(group_by: str, cumulative: bool=False)`` method:
|
2013-09-02 18:41:20 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Compute top statistics grouped by *group_by* as a ``GroupedStats``
|
|
|
|
instance:
|
2013-09-02 18:41:20 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
===================== ======================== ==============
|
|
|
|
group_by description key type
|
|
|
|
===================== ======================== ==============
|
|
|
|
``'filename'`` filename ``str``
|
|
|
|
``'line'`` filename and line number ``(str, int)``
|
|
|
|
``'address'`` memory block address ``int``
|
|
|
|
===================== ======================== ==============
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
If *cumulative* is ``True``, cumulate size and count of memory blocks of
|
|
|
|
all frames of the traceback of a trace, not only the most recent frame.
|
|
|
|
The *cumulative* parameter is ignored if *group_by* is ``'address'`` or
|
|
|
|
if the traceback limit is less than ``2``.
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-09-03 19:19:30 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``write(filename)`` method:
|
2013-09-03 19:19:30 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Write the snapshot into a file.
|
2013-09-02 18:35:54 -04:00
|
|
|
|
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``metrics`` attribute:
|
2013-09-08 09:58:01 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Dictionary storing metrics read when the snapshot was created:
|
|
|
|
``{name (str): metric}`` where *metric* type is ``Metric``.
|
2013-09-08 09:58:01 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``pid`` attribute:
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Identifier of the process which created the snapshot, result of
|
|
|
|
``os.getpid``.
|
2013-09-03 19:19:30 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``stats`` attribute:
|
2013-09-03 19:19:30 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Statistics on traced Python memory, result of the ``get_stats``
|
|
|
|
function.
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-09-16 19:38:43 -04:00
|
|
|
``traceback_limit`` attribute:
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Maximum number of frames stored in a trace of a memory block allocated by
|
|
|
|
Python.
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-09-16 19:38:43 -04:00
|
|
|
``traces`` attribute:
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Traces of Python memory allocations, result of the ``get_traces``
|
|
|
|
function, can be ``None``.
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-09-16 19:38:43 -04:00
|
|
|
``timestamp`` attribute:
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Creation date and time of the snapshot, ``datetime.datetime``
|
|
|
|
instance.
|
2013-09-02 18:35:54 -04:00
|
|
|
|
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
StatsDiff
|
|
|
|
---------
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-09-16 19:38:43 -04:00
|
|
|
``StatsDiff(differences, old_stats, new_stats)`` class:
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Differences between two ``GroupedStats`` instances.
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
The ``GroupedStats.compare_to`` method creates a ``StatsDiff``
|
|
|
|
instance.
|
2013-09-04 07:19:17 -04:00
|
|
|
|
2013-09-16 19:38:43 -04:00
|
|
|
``sort()`` method:
|
2013-09-04 07:19:17 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Sort the ``differences`` list from the biggest difference to the
|
|
|
|
smallest difference. Sort by ``abs(size_diff)``, *size*,
|
|
|
|
``abs(count_diff)``, *count* and then by *key*.
|
2013-09-04 07:19:17 -04:00
|
|
|
|
2013-09-16 19:38:43 -04:00
|
|
|
``differences`` attribute:
|
2013-09-04 07:19:17 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Differences between ``old_stats`` and ``new_stats`` as a list of
|
|
|
|
``(size_diff, size, count_diff, count, key)`` tuples. *size_diff*,
|
|
|
|
*size*, *count_diff* and *count* are ``int``. The key type depends on the
|
|
|
|
``GroupedStats.group_by`` attribute of ``new_stats``: see the
|
|
|
|
``Snapshot.top_by`` method.
|
2013-09-04 07:19:17 -04:00
|
|
|
|
2013-09-16 19:38:43 -04:00
|
|
|
``old_stats`` attribute:
|
2013-09-04 07:19:17 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Old ``GroupedStats`` instance, can be ``None``.
|
2013-09-04 07:19:17 -04:00
|
|
|
|
2013-09-16 19:38:43 -04:00
|
|
|
``new_stats`` attribute:
|
2013-09-04 07:19:17 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
New ``GroupedStats`` instance.
|
2013-09-04 07:19:17 -04:00
|
|
|
|
2013-09-03 07:18:48 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Task
|
|
|
|
----
|
2013-09-02 18:35:54 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``Task(func, \*args, \*\*kw)`` class:
|
2013-09-04 07:19:17 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Task calling ``func(*args, **kw)``. When scheduled, the task is called when
|
|
|
|
the traced memory is increased or decreased by more than *threshold* bytes,
|
|
|
|
or after *delay* seconds.
|
2013-09-04 07:19:17 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``call()`` method:
|
2013-09-04 07:19:17 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Call ``func(*args, **kw)`` and return the result.
|
2013-09-04 07:19:17 -04:00
|
|
|
|
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``cancel()`` method:
|
|
|
|
|
|
|
|
Cancel the task.
|
|
|
|
|
|
|
|
Do nothing if the task is not scheduled.
|
|
|
|
|
|
|
|
|
|
|
|
``get_delay()`` method:
|
|
|
|
|
|
|
|
Get the delay in seconds. If the delay is ``None``, the timer is
|
|
|
|
disabled.
|
|
|
|
|
|
|
|
|
|
|
|
``get_memory_threshold()`` method:
|
|
|
|
|
|
|
|
Get the threshold of the traced memory. When scheduled, the task is
|
|
|
|
called when the traced memory is increased or decreased by more than
|
|
|
|
*threshold* bytes. The memory threshold is disabled if *threshold* is
|
|
|
|
``None``.
|
|
|
|
|
|
|
|
See also the ``set_memory_threshold`` method and the
|
|
|
|
``get_traced_memory`` function.
|
|
|
|
|
|
|
|
|
|
|
|
``schedule(repeat: int=None)`` method:
|
|
|
|
|
|
|
|
Schedule the task *repeat* times. If *repeat* is ``None``, the task is
|
|
|
|
rescheduled after each call until it is cancelled.
|
|
|
|
|
|
|
|
If the method is called twice, the task is rescheduled with the new
|
|
|
|
*repeat* parameter.
|
|
|
|
|
|
|
|
The task must have a memory threshold or a delay: see ``set_delay``
|
|
|
|
and ``set_memory_threshold`` methods. The ``tracemalloc`` must be
|
|
|
|
enabled to schedule a task: see the ``enable`` function.
|
|
|
|
|
|
|
|
The task is cancelled if the ``call`` method raises an exception.
|
|
|
|
The task can be cancelled using the ``cancel`` method or the
|
|
|
|
``cancel_tasks`` function.
|
|
|
|
|
|
|
|
|
|
|
|
``set_delay(seconds: int)`` method:
|
|
|
|
|
|
|
|
Set the delay in seconds before the task will be called. Set the delay to
|
|
|
|
``None`` to disable the timer.
|
|
|
|
|
|
|
|
The timer is based on the Python memory allocator, it is not real time.
|
|
|
|
The task is called after at least *delay* seconds, it is not called
|
|
|
|
exactly after *delay* seconds if no Python memory allocation occurred.
|
|
|
|
The timer has a resolution of 1 second.
|
|
|
|
|
|
|
|
The task is rescheduled if it was scheduled.
|
2013-09-04 07:19:17 -04:00
|
|
|
|
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``set_memory_threshold(size: int)`` method:
|
2013-09-04 07:19:17 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Set the threshold of the traced memory. When scheduled, the task is
|
|
|
|
called when the traced memory is increased or decreased by more than
|
|
|
|
*threshold* bytes. Set the threshold to ``None`` to disable it.
|
2013-09-04 07:19:17 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
The task is rescheduled if it was scheduled.
|
|
|
|
|
|
|
|
See also the ``get_memory_threshold`` method and the
|
|
|
|
``get_traced_memory`` function.
|
|
|
|
|
|
|
|
|
|
|
|
``func`` attribute:
|
|
|
|
|
|
|
|
Function, callable object.
|
|
|
|
|
|
|
|
``func_args`` attribute:
|
|
|
|
|
|
|
|
Function arguments, ``tuple``.
|
|
|
|
|
|
|
|
``func_kwargs`` attribute:
|
|
|
|
|
|
|
|
Function keyword arguments, ``dict``. It can be ``None``.
|
|
|
|
|
|
|
|
|
|
|
|
TakeSnapshotTask
|
2013-09-16 19:38:43 -04:00
|
|
|
----------------
|
2013-09-04 07:19:17 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``TakeSnapshotTask(filename_template: str="tracemalloc-$counter.pickle", traces: bool=False, metrics: bool=True, callback: callable=None)`` class:
|
2013-09-04 07:19:17 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Task taking snapshots of Python memory allocations and writing them into
|
|
|
|
files.
|
2013-09-04 07:19:17 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``TakeSnapshotTask`` is based on the ``Task`` class and so inherit
|
|
|
|
all attributes and methods, especially:
|
2013-09-04 07:19:17 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
* ``Task.cancel``
|
|
|
|
* ``Task.schedule``
|
|
|
|
* ``Task.set_delay``
|
|
|
|
* ``Task.set_memory_threshold``
|
2013-09-04 07:19:17 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
``take_snapshot()`` method:
|
|
|
|
|
|
|
|
Take a snapshot and write it into a file.
|
|
|
|
Return ``(snapshot, filename)`` where *snapshot* is a ``Snapshot``
|
|
|
|
instance and filename type is ``str``.
|
|
|
|
|
|
|
|
``callback`` attribute:
|
|
|
|
|
|
|
|
*callback* is an optional callable object which can be used to add
|
|
|
|
metrics to a snapshot. It is called with only one parameter: the newly
|
|
|
|
created snapshot instance. Use the ``Snapshot.add_metric`` method to
|
|
|
|
add new metric.
|
|
|
|
|
|
|
|
``filename_template`` attribute:
|
|
|
|
|
|
|
|
Template to create a filename. The template supports the following
|
|
|
|
variables:
|
|
|
|
|
|
|
|
* ``$pid``: identifier of the current process
|
|
|
|
* ``$timestamp``: current date and time
|
|
|
|
* ``$counter``: counter starting at 1 and incremented at each snapshot,
|
|
|
|
formatted as 4 decimal digits
|
|
|
|
|
|
|
|
The default template is ``tracemalloc-$counter.pickle``.
|
|
|
|
|
|
|
|
``metrics`` attribute:
|
|
|
|
|
|
|
|
Parameter passed to the ``Snapshot.create`` function.
|
|
|
|
|
|
|
|
``traces`` attribute:
|
2013-09-04 07:19:17 -04:00
|
|
|
|
2013-10-03 10:00:07 -04:00
|
|
|
Parameter passed to the ``Snapshot.create`` function.
|
2013-09-02 18:35:54 -04:00
|
|
|
|
|
|
|
|
|
|
|
Links
|
|
|
|
=====
|
|
|
|
|
2013-09-04 08:01:56 -04:00
|
|
|
tracemalloc:
|
2013-09-02 18:41:20 -04:00
|
|
|
|
|
|
|
* `#18874: Add a new tracemalloc module to trace Python
|
2013-09-02 18:35:54 -04:00
|
|
|
memory allocations <http://bugs.python.org/issue18874>`_
|
2013-09-04 08:01:56 -04:00
|
|
|
* `pytracemalloc on PyPI
|
|
|
|
<https://pypi.python.org/pypi/pytracemalloc>`_
|
2013-09-02 18:35:54 -04:00
|
|
|
|
|
|
|
Similar projects:
|
|
|
|
|
|
|
|
* `Meliae: Python Memory Usage Analyzer
|
|
|
|
<https://pypi.python.org/pypi/meliae>`_
|
|
|
|
* `Guppy-PE: umbrella package combining Heapy and GSL
|
|
|
|
<http://guppy-pe.sourceforge.net/>`_
|
|
|
|
* `PySizer <http://pysizer.8325.org/>`_: developed for Python 2.4
|
|
|
|
* `memory_profiler <https://pypi.python.org/pypi/memory_profiler>`_
|
|
|
|
* `pympler <http://code.google.com/p/pympler/>`_
|
|
|
|
* `Dozer <https://pypi.python.org/pypi/Dozer>`_: WSGI Middleware version of
|
|
|
|
the CherryPy memory leak debugger
|
|
|
|
* `objgraph <http://mg.pov.lt/objgraph/>`_
|
|
|
|
* `caulk <https://github.com/smartfile/caulk/>`_
|
|
|
|
|
|
|
|
Copyright
|
|
|
|
=========
|
|
|
|
|
|
|
|
This document has been placed into the public domain.
|
|
|
|
|