| \section{\module{resource} --- | 
 |          Resource usage information} | 
 |  | 
 | \declaremodule{builtin}{resource} | 
 |   \platform{Unix} | 
 | \modulesynopsis{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. | 
 |  | 
 | A single exception is defined for errors: | 
 |  | 
 |  | 
 | \begin{excdesc}{error} | 
 |   The functions described below may raise this error if the underlying | 
 |   system call failures unexpectedly. | 
 | \end{excdesc} | 
 |  | 
 | \subsection{Resource Limits} | 
 |  | 
 | Resources usage can be limited using the \function{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. | 
 |  | 
 | \begin{funcdesc}{getrlimit}{resource} | 
 |   Returns a tuple \code{(\var{soft}, \var{hard})} with the current | 
 |   soft and hard limits of \var{resource}. Raises \exception{ValueError} if | 
 |   an invalid resource is specified, or \exception{error} if the | 
 |   underyling system call fails unexpectedly. | 
 | \end{funcdesc} | 
 |  | 
 | \begin{funcdesc}{setrlimit}{resource, limits} | 
 |   Sets new limits of consumption of \var{resource}. The \var{limits} | 
 |   argument must be a tuple \code{(\var{soft}, \var{hard})} of two | 
 |   integers describing the new limits. A value of \code{-1} can be used to | 
 |   specify the maximum possible upper limit. | 
 |  | 
 |   Raises \exception{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 (unless the process has an effective UID of | 
 |   super-user).  Can also raise \exception{error} if the underyling | 
 |   system call fails. | 
 | \end{funcdesc} | 
 |  | 
 | These symbols define resources whose consumption can be controlled | 
 | using the \function{setrlimit()} and \function{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. | 
 |  | 
 | \begin{datadesc}{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. | 
 | \end{datadesc} | 
 |  | 
 | \begin{datadesc}{RLIMIT_CPU} | 
 |   The maximum amount of processor time (in seconds) that a process can | 
 |   use. If this limit is exceeded, a \constant{SIGXCPU} signal is sent to | 
 |   the process. (See the \refmodule{signal} module documentation for | 
 |   information about how to catch this signal and do something useful, | 
 |   e.g. flush open files to disk.) | 
 | \end{datadesc} | 
 |  | 
 | \begin{datadesc}{RLIMIT_FSIZE} | 
 |   The maximum size of a file which the process may create.  This only | 
 |   affects the stack of the main thread in a multi-threaded process. | 
 | \end{datadesc} | 
 |  | 
 | \begin{datadesc}{RLIMIT_DATA} | 
 |   The maximum size (in bytes) of the process's heap. | 
 | \end{datadesc} | 
 |  | 
 | \begin{datadesc}{RLIMIT_STACK} | 
 |   The maximum size (in bytes) of the call stack for the current | 
 |   process. | 
 | \end{datadesc} | 
 |  | 
 | \begin{datadesc}{RLIMIT_RSS} | 
 |   The maximum resident set size that should be made available to the | 
 |   process. | 
 | \end{datadesc} | 
 |  | 
 | \begin{datadesc}{RLIMIT_NPROC} | 
 |   The maximum number of processes the current process may create. | 
 | \end{datadesc} | 
 |  | 
 | \begin{datadesc}{RLIMIT_NOFILE} | 
 |   The maximum number of open file descriptors for the current | 
 |   process. | 
 | \end{datadesc} | 
 |  | 
 | \begin{datadesc}{RLIMIT_OFILE} | 
 |   The BSD name for \constant{RLIMIT_NOFILE}. | 
 | \end{datadesc} | 
 |  | 
 | \begin{datadesc}{RLIMIT_MEMLOC} | 
 |   The maximm address space which may be locked in memory. | 
 | \end{datadesc} | 
 |  | 
 | \begin{datadesc}{RLIMIT_VMEM} | 
 |   The largest area of mapped memory which the process may occupy. | 
 | \end{datadesc} | 
 |  | 
 | \begin{datadesc}{RLIMIT_AS} | 
 |   The maximum area (in bytes) of address space which may be taken by | 
 |   the process. | 
 | \end{datadesc} | 
 |  | 
 | \subsection{Resource Usage} | 
 |  | 
 | These functions are used to retrieve resource usage information: | 
 |  | 
 | \begin{funcdesc}{getrusage}{who} | 
 |   This function returns an object that describes the resources | 
 |   consumed by either the current process or its children, as specified | 
 |   by the \var{who} parameter.  The \var{who} parameter should be | 
 |   specified using one of the \constant{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 \member{ru_utime} and \member{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: | 
 |  | 
 | \begin{tableiii}{r|l|l}{code}{Index}{Field}{Resource} | 
 |   \lineiii{0}{\member{ru_utime}}{time in user mode (float)} | 
 |   \lineiii{1}{\member{ru_stime}}{time in system mode (float)} | 
 |   \lineiii{2}{\member{ru_maxrss}}{maximum resident set size} | 
 |   \lineiii{3}{\member{ru_ixrss}}{shared memory size} | 
 |   \lineiii{4}{\member{ru_idrss}}{unshared memory size} | 
 |   \lineiii{5}{\member{ru_isrss}}{unshared stack size} | 
 |   \lineiii{6}{\member{ru_minflt}}{page faults not requiring I/O} | 
 |   \lineiii{7}{\member{ru_majflt}}{page faults requiring I/O} | 
 |   \lineiii{8}{\member{ru_nswap}}{number of swap outs} | 
 |   \lineiii{9}{\member{ru_inblock}}{block input operations} | 
 |   \lineiii{10}{\member{ru_oublock}}{block output operations} | 
 |   \lineiii{11}{\member{ru_msgsnd}}{messages sent} | 
 |   \lineiii{12}{\member{ru_msgrcv}}{messages received} | 
 |   \lineiii{13}{\member{ru_nsignals}}{signals received} | 
 |   \lineiii{14}{\member{ru_nvcsw}}{voluntary context switches} | 
 |   \lineiii{15}{\member{ru_nivcsw}}{involuntary context switches} | 
 | \end{tableiii} | 
 |  | 
 |   This function will raise a \exception{ValueError} if an invalid | 
 |   \var{who} parameter is specified. It may also raise | 
 |   \exception{error} exception in unusual circumstances. | 
 |  | 
 |   \versionchanged[Added access to values as attributes of the | 
 |   returned object]{2.3} | 
 | \end{funcdesc} | 
 |  | 
 | \begin{funcdesc}{getpagesize}{} | 
 |   Returns the number of bytes in a system page. (This need not be the | 
 |   same as the hardware page size.) This function is useful for | 
 |   determining the number of bytes of memory a process is using. The | 
 |   third element of the tuple returned by \function{getrusage()} describes | 
 |   memory usage in pages; multiplying by page size produces number of | 
 |   bytes.  | 
 | \end{funcdesc} | 
 |  | 
 | The following \constant{RUSAGE_*} symbols are passed to the | 
 | \function{getrusage()} function to specify which processes information | 
 | should be provided for. | 
 |  | 
 | \begin{datadesc}{RUSAGE_SELF} | 
 |   \constant{RUSAGE_SELF} should be used to | 
 |   request information pertaining only to the process itself. | 
 | \end{datadesc} | 
 |  | 
 | \begin{datadesc}{RUSAGE_CHILDREN} | 
 |   Pass to \function{getrusage()} to request resource information for | 
 |   child processes of the calling process. | 
 | \end{datadesc} | 
 |  | 
 | \begin{datadesc}{RUSAGE_BOTH} | 
 |   Pass to \function{getrusage()} to request resources consumed by both | 
 |   the current process and child processes.  May not be available on all | 
 |   systems. | 
 | \end{datadesc} |