|  | :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 |