:mod:`resource` --- Resource usage information
==============================================

.. module:: resource
   :platform: Unix
   :synopsis: An interface to provide resource usage information on the current process.

.. moduleauthor:: Jeremy Hylton <jeremy@alum.mit.edu>
.. sectionauthor:: Jeremy Hylton <jeremy@alum.mit.edu>

--------------

This module provides basic mechanisms for measuring and controlling system
resources utilized by a program.

Symbolic constants are used to specify particular system resources and to
request usage information about either the current process or its children.

An :exc:`OSError` is raised on syscall failure.


.. exception:: error

   A deprecated alias of :exc:`OSError`.

   .. versionchanged:: 3.3
      Following :pep:`3151`, this class was made an alias of :exc:`OSError`.


Resource Limits
---------------

Resources usage can be limited using the :func:`setrlimit` function described
below. Each resource is controlled by a pair of limits: a soft limit and a hard
limit. The soft limit is the current limit, and may be lowered or raised by a
process over time. The soft limit can never exceed the hard limit. The hard
limit can be lowered to any value greater than the soft limit, but not raised.
(Only processes with the effective UID of the super-user can raise a hard
limit.)

The specific resources that can be limited are system dependent. They are
described in the :manpage:`getrlimit(2)` man page.  The resources listed below
are supported when the underlying operating system supports them; resources
which cannot be checked or controlled by the operating system are not defined in
this module for those platforms.


.. data:: RLIM_INFINITY

   Constant used to represent the limit for an unlimited resource.


.. function:: getrlimit(resource)

   Returns a tuple ``(soft, hard)`` with the current soft and hard limits of
   *resource*. Raises :exc:`ValueError` if an invalid resource is specified, or
   :exc:`error` if the underlying system call fails unexpectedly.


.. function:: setrlimit(resource, limits)

   Sets new limits of consumption of *resource*. The *limits* argument must be a
   tuple ``(soft, hard)`` of two integers describing the new limits. A value of
   :data:`~resource.RLIM_INFINITY` can be used to request a limit that is
   unlimited.

   Raises :exc:`ValueError` if an invalid resource is specified, if the new soft
   limit exceeds the hard limit, or if a process tries to raise its hard limit.
   Specifying a limit of :data:`~resource.RLIM_INFINITY` when the hard or
   system limit for that resource is not unlimited will result in a
   :exc:`ValueError`.  A process with the effective UID of super-user can
   request any valid limit value, including unlimited, but :exc:`ValueError`
   will still be raised if the requested limit exceeds the system imposed
   limit.

   ``setrlimit`` may also raise :exc:`error` if the underlying system call
   fails.

.. function:: prlimit(pid, resource[, limits])

   Combines :func:`setrlimit` and :func:`getrlimit` in one function and
   supports to get and set the resources limits of an arbitrary process. If
   *pid* is 0, then the call applies to the current process. *resource* and
   *limits* have the same meaning as in :func:`setrlimit`, except that
   *limits* is optional.

   When *limits* is not given the function returns the *resource* limit of the
   process *pid*. When *limits* is given the *resource* limit of the process is
   set and the former resource limit is returned.

   Raises :exc:`ProcessLookupError` when *pid* can't be found and
   :exc:`PermissionError` when the user doesn't have ``CAP_SYS_RESOURCE`` for
   the process.

   Availability: Linux 2.6.36 or later with glibc 2.13 or later

   .. versionadded:: 3.4


These symbols define resources whose consumption can be controlled using the
:func:`setrlimit` and :func:`getrlimit` functions described below. The values of
these symbols are exactly the constants used by C programs.

The Unix man page for :manpage:`getrlimit(2)` lists the available resources.
Note that not all systems use the same symbol or same value to denote the same
resource.  This module does not attempt to mask platform differences --- symbols
not defined for a platform will not be available from this module on that
platform.


.. data:: RLIMIT_CORE

   The maximum size (in bytes) of a core file that the current process can create.
   This may result in the creation of a partial core file if a larger core would be
   required to contain the entire process image.


.. data:: RLIMIT_CPU

   The maximum amount of processor time (in seconds) that a process can use. If
   this limit is exceeded, a :const:`SIGXCPU` signal is sent to the process. (See
   the :mod:`signal` module documentation for information about how to catch this
   signal and do something useful, e.g. flush open files to disk.)


.. data:: RLIMIT_FSIZE

   The maximum size of a file which the process may create.


.. data:: RLIMIT_DATA

   The maximum size (in bytes) of the process's heap.


.. data:: RLIMIT_STACK

   The maximum size (in bytes) of the call stack for the current process.  This only
   affects the stack of the main thread in a multi-threaded process.


.. data:: RLIMIT_RSS

   The maximum resident set size that should be made available to the process.


.. data:: RLIMIT_NPROC

   The maximum number of processes the current process may create.


.. data:: RLIMIT_NOFILE

   The maximum number of open file descriptors for the current process.


.. data:: RLIMIT_OFILE

   The BSD name for :const:`RLIMIT_NOFILE`.


.. data:: RLIMIT_MEMLOCK

   The maximum address space which may be locked in memory.


.. data:: RLIMIT_VMEM

   The largest area of mapped memory which the process may occupy.


.. data:: RLIMIT_AS

   The maximum area (in bytes) of address space which may be taken by the process.


.. data:: RLIMIT_MSGQUEUE

   The number of bytes that can be allocated for POSIX message queues.

   Availability: Linux 2.6.8 or later.

   .. versionadded:: 3.4


.. data:: RLIMIT_NICE

   The ceiling for the process's nice level (calculated as 20 - rlim_cur).

   Availability: Linux 2.6.12 or later.

   .. versionadded:: 3.4


.. data:: RLIMIT_RTPRIO

   The ceiling of the real-time priority.

   Availability: Linux 2.6.12 or later.

   .. versionadded:: 3.4


.. data:: RLIMIT_RTTIME

   The time limit (in microseconds) on CPU time that a process can spend
   under real-time scheduling without making a blocking syscall.

   Availability: Linux 2.6.25 or later.

   .. versionadded:: 3.4


.. data:: RLIMIT_SIGPENDING

   The number of signals which the process may queue.

   Availability: Linux 2.6.8 or later.

   .. versionadded:: 3.4

.. data:: RLIMIT_SBSIZE

   The maximum size (in bytes) of socket buffer usage for this user.
   This limits the amount of network memory, and hence the amount of mbufs,
   that this user may hold at any time.

   Availability: FreeBSD 9 or later.

   .. versionadded:: 3.4

.. data:: RLIMIT_SWAP

   The maximum size (in bytes) of the swap space that may be reserved or
   used by all of this user id's processes.
   This limit is enforced only if bit 1 of the vm.overcommit sysctl is set.
   Please see :manpage:`tuning(7)` for a complete description of this sysctl.

   Availability: FreeBSD 9 or later.

   .. versionadded:: 3.4

.. data:: RLIMIT_NPTS

   The maximum number of pseudo-terminals created by this user id.

   Availability: FreeBSD 9 or later.

   .. versionadded:: 3.4

Resource Usage
--------------

These functions are used to retrieve resource usage information:


.. function:: getrusage(who)

   This function returns an object that describes the resources consumed by either
   the current process or its children, as specified by the *who* parameter.  The
   *who* parameter should be specified using one of the :const:`RUSAGE_\*`
   constants described below.

   The fields of the return value each describe how a particular system resource
   has been used, e.g. amount of time spent running is user mode or number of times
   the process was swapped out of main memory. Some values are dependent on the
   clock tick internal, e.g. the amount of memory the process is using.

   For backward compatibility, the return value is also accessible as a tuple of 16
   elements.

   The fields :attr:`ru_utime` and :attr:`ru_stime` of the return value are
   floating point values representing the amount of time spent executing in user
   mode and the amount of time spent executing in system mode, respectively. The
   remaining values are integers. Consult the :manpage:`getrusage(2)` man page for
   detailed information about these values. A brief summary is presented here:

   +--------+---------------------+-------------------------------+
   | Index  | Field               | Resource                      |
   +========+=====================+===============================+
   | ``0``  | :attr:`ru_utime`    | time in user mode (float)     |
   +--------+---------------------+-------------------------------+
   | ``1``  | :attr:`ru_stime`    | time in system mode (float)   |
   +--------+---------------------+-------------------------------+
   | ``2``  | :attr:`ru_maxrss`   | maximum resident set size     |
   +--------+---------------------+-------------------------------+
   | ``3``  | :attr:`ru_ixrss`    | shared memory size            |
   +--------+---------------------+-------------------------------+
   | ``4``  | :attr:`ru_idrss`    | unshared memory size          |
   +--------+---------------------+-------------------------------+
   | ``5``  | :attr:`ru_isrss`    | unshared stack size           |
   +--------+---------------------+-------------------------------+
   | ``6``  | :attr:`ru_minflt`   | page faults not requiring I/O |
   +--------+---------------------+-------------------------------+
   | ``7``  | :attr:`ru_majflt`   | page faults requiring I/O     |
   +--------+---------------------+-------------------------------+
   | ``8``  | :attr:`ru_nswap`    | number of swap outs           |
   +--------+---------------------+-------------------------------+
   | ``9``  | :attr:`ru_inblock`  | block input operations        |
   +--------+---------------------+-------------------------------+
   | ``10`` | :attr:`ru_oublock`  | block output operations       |
   +--------+---------------------+-------------------------------+
   | ``11`` | :attr:`ru_msgsnd`   | messages sent                 |
   +--------+---------------------+-------------------------------+
   | ``12`` | :attr:`ru_msgrcv`   | messages received             |
   +--------+---------------------+-------------------------------+
   | ``13`` | :attr:`ru_nsignals` | signals received              |
   +--------+---------------------+-------------------------------+
   | ``14`` | :attr:`ru_nvcsw`    | voluntary context switches    |
   +--------+---------------------+-------------------------------+
   | ``15`` | :attr:`ru_nivcsw`   | involuntary context switches  |
   +--------+---------------------+-------------------------------+

   This function will raise a :exc:`ValueError` if an invalid *who* parameter is
   specified. It may also raise :exc:`error` exception in unusual circumstances.


.. function:: getpagesize()

   Returns the number of bytes in a system page. (This need not be the same as the
   hardware page size.)

The following :const:`RUSAGE_\*` symbols are passed to the :func:`getrusage`
function to specify which processes information should be provided for.


.. data:: RUSAGE_SELF

   Pass to :func:`getrusage` to request resources consumed by the calling
   process, which is the sum of resources used by all threads in the process.


.. data:: RUSAGE_CHILDREN

   Pass to :func:`getrusage` to request resources consumed by child processes
   of the calling process which have been terminated and waited for.


.. data:: RUSAGE_BOTH

   Pass to :func:`getrusage` to request resources consumed by both the current
   process and child processes.  May not be available on all systems.


.. data:: RUSAGE_THREAD

   Pass to :func:`getrusage` to request resources consumed by the current
   thread.  May not be available on all systems.

   .. versionadded:: 3.2
