resource — 리소스 사용 정보
resource — 리소스 사용 정보
이 모듈은 프로그램이 사용하는 시스템 리소스를 측정하고 제어하기 위한 기본적인 메커니즘을 제공합니다.
본문
availability: Unix, not WASI.
특정 시스템 리소스를 지정하고 현재 프로세스 또는 그 자식 프로세스에 대한 사용 정보를 요청하는 데 심볼릭 상수가 사용됩니다. 시스템 호출이 실패하면
OSError가 발생합니다.
resource.error
OSError의 폐기된 별칭입니다.
versionchanged: 3.3에서 PEP 3151에 따라 이 클래스는
OSError의 별칭이 되었습니다.
리소스 제한
리소스 사용은 아래 설명하는 setrlimit() 함수로 제한할 수 있습니다. 각 리소스는 소프트 한도(soft limit)와 하드 한도(hard limit)라는 한 쌍의 한도로 제어됩니다. 소프트 한도는 현재 한도이며 프로세스가 시간이 지남에 따라 낮추거나 올릴 수 있습니다. 소프트 한도는 절대 하드 한도를 초과할 수 없습니다. 하드 한도는 소프트 한도보다 큰 값으로 낮출 수 있지만 올릴 수는 없습니다. (슈퍼유저의 유효 UID를 가진 프로세스만 하드 한도를 올릴 수 있습니다.)
제한할 수 있는 특정 리소스는 시스템에 따라 다릅니다. 이것들은 getrlimit(2) 매뉴얼 페이지에 설명되어 있습니다. 아래 나열된 리소스는 기저 운영 체제가 지원할 때 지원됩니다. 운영 체제가 검사하거나 제어할 수 없는 리소스는 해당 플랫폼의 이 모듈에서 정의되지 않습니다.
- resource.RLIM_INFINITY — 무제한 리소스의 한도를 나타내는 데 사용되는 상수.
- resource.getrlimit(resource) —
resource의 현재 소프트 및 하드 한도가 있는 튜플(soft, hard)을 반환합니다. 잘못된 리소스가 지정되면ValueError를, 기저 시스템 호출이 예기치 않게 실패하면error를 발생시킵니다. - resource.setrlimit(resource, limits) —
resource의 소비에 대한 새 한도를 설정합니다.limits인자는 새 한도를 설명하는 두 정수의 튜플(soft, hard)이어야 합니다. 무제한 한도를 요청하는 데RLIM_INFINITY값을 사용할 수 있습니다.- 잘못된 리소스가 지정되거나, 새 소프트 한도가 하드 한도를 초과하거나, 프로세스가 하드 한도를 올리려고 하면
ValueError가 발생합니다. 해당 리소스의 하드 또는 시스템 한도가 무제한이 아닐 때RLIM_INFINITY한도를 지정하면ValueError가 발생합니다. 슈퍼유저의 유효 UID를 가진 프로세스는 무제한을 포함한 모든 유효 한도 값을 요청할 수 있지만, 요청된 한도가 시스템이 부과한 한도를 초과하면 여전히ValueError가 발생합니다. - 기저 시스템 호출이 실패하면
setrlimit도error를 발생시킬 수 있습니다. - VxWorks는
RLIMIT_NOFILE설정만 지원합니다. - 감사 이벤트
resource.setrlimit를 인자resource, limits로 발생시킵니다.
- 잘못된 리소스가 지정되거나, 새 소프트 한도가 하드 한도를 초과하거나, 프로세스가 하드 한도를 올리려고 하면
- resource.prlimit(pid, resource[, limits]) —
setrlimit()과getrlimit()을 하나의 함수로 결합하고 임의 프로세스의 리소스 한도를 얻고 설정할 수 있게 지원합니다.pid가 0이면 호출은 현재 프로세스에 적용됩니다.resource와limits는setrlimit()에서와 같은 의미를 가지지만limits는 선택 사항입니다.limits가 주어지지 않으면 함수는 프로세스pid의 리소스 한도를 반환합니다.limits가 주어지면 프로세스의 리소스 한도가 설정되고 이전 리소스 한도가 반환됩니다.pid를 찾을 수 없으면ProcessLookupError를, 사용자에게 프로세스에 대한CAP_SYS_RESOURCE권한이 없으면PermissionError를 발생시킵니다.- 감사 이벤트
resource.prlimit를 인자pid, resource, limits로 발생시킵니다. - Availability: Linux >= 2.6.36 (glibc >= 2.13).
-
versionadded: 3.4.
이 심볼들은 아래 설명하는 setrlimit()과 getrlimit() 함수로 소비를 제어할 수 있는 리소스를 정의합니다. 이 심볼들의 값은 C 프로그램이 사용하는 상수와 정확히 같습니다.
Unix 매뉴얼 페이지 getrlimit(2)는 사용 가능한 리소스를 나열합니다. 모든 시스템이 같은 리소스를 나타내는 데 같은 심볼이나 같은 값을 사용하지는 않는다는 점에 유의하세요. 이 모듈은 플랫폼 차이를 가리려 하지 않습니다 — 플랫폼에 대해 정의되지 않은 심볼은 그 플랫폼의 이 모듈에서 사용할 수 없습니다.
- resource.RLIMIT_CORE — 현재 프로세스가 만들 수 있는 코어 파일의 최대 크기(바이트). 전체 프로세스 이미지를 포함하려면 더 큰 코어가 필요하면 부분 코어 파일이 생성될 수 있습니다.
- resource.RLIMIT_CPU — 프로세스가 사용할 수 있는 최대 프로세서 시간(초). 이 한도를 초과하면 프로세스에
SIGXCPU신호가 전송됩니다. (이 신호를 잡아 유용한 일(예: 열린 파일을 디스크로 플러시)을 하는 방법에 대한 정보는signal모듈 문서를 참고하세요.) - resource.RLIMIT_FSIZE — 프로세스가 만들 수 있는 파일의 최대 크기.
- resource.RLIMIT_DATA — 프로세스 힙의 최대 크기(바이트).
- resource.RLIMIT_STACK — 현재 프로세스의 호출 스택 최대 크기(바이트). 다중 스레드 프로세스에서 메인 스레드의 스택에만 영향을 줍니다.
- resource.RLIMIT_RSS — 프로세스에 제공되어야 하는 최대 상주 집합 크기.
- resource.RLIMIT_NPROC — 현재 프로세스가 만들 수 있는 최대 프로세스 수.
- resource.RLIMIT_NOFILE — 현재 프로세스의 최대 열린 파일 디스크립터 수.
- resource.RLIMIT_OFILE —
RLIMIT_NOFILE의 BSD 이름. - resource.RLIMIT_MEMLOCK — 메모리에 잠글 수 있는 최대 주소 공간.
- resource.RLIMIT_VMEM — 프로세스가 차지할 수 있는 매핑된 메모리의 가장 큰 영역. 보통
RLIMIT_AS의 별칭입니다. Availability: Solaris, FreeBSD, NetBSD. - resource.RLIMIT_AS — 프로세스가 차지할 수 있는 최대 주소 공간(바이트).
- resource.RLIMIT_MSGQUEUE — POSIX 메시지 큐에 할당할 수 있는 바이트 수. Availability: Linux >= 2.6.8.
versionadded: 3.4.
- resource.RLIMIT_NICE — 프로세스의 nice 레벨 상한(20 - rlim_cur로 계산). Availability: Linux >= 2.6.12.
versionadded: 3.4.
- resource.RLIMIT_RTPRIO — 실시간 우선순위의 상한. Availability: Linux >= 2.6.12.
versionadded: 3.4.
- resource.RLIMIT_RTTIME — 프로세스가 차단 syscall 없이 실시간 스케줄링 하에 소비할 수 있는 CPU 시간 제한(마이크로초). Availability: Linux >= 2.6.25.
versionadded: 3.4.
- resource.RLIMIT_SIGPENDING — 프로세스가 큐에 넣을 수 있는 신호 수. Availability: Linux >= 2.6.8.
versionadded: 3.4.
- resource.RLIMIT_SBSIZE — 이 사용자의 소켓 버퍼 사용 최대 크기(바이트). 이것은 네트워크 메모리 양, 즉 이 사용자가 언제든지 보유할 수 있는 mbuf 양을 제한합니다. Availability: FreeBSD, NetBSD.
versionadded: 3.4.
- resource.RLIMIT_SWAP — 이 사용자 ID의 모든 프로세스가 예약하거나 사용할 수 있는 스왑 공간의 최대 크기(바이트). 이 한도는
vm.overcommitsysctl의 비트 1이 설정된 경우에만 강제됩니다. 이 sysctl에 대한 완전한 설명은 tuning(7)을 참고하세요. Availability: FreeBSD >= 8.versionadded: 3.4.
- resource.RLIMIT_NPTS — 이 사용자 ID가 만드는 최대 의사 터미널 수. Availability: FreeBSD >= 8.
versionadded: 3.4.
- resource.RLIMIT_KQUEUES — 이 사용자 ID가 만들 수 있는 최대 kqueue 수. Availability: FreeBSD >= 11.
versionadded: 3.10.
리소스 사용
이 함수들은 리소스 사용 정보를 검색하는 데 사용됩니다.
resource.getrusage(who)
who 매개변수가 지정하는 대로 현재 프로세스 또는 그 자식이 소비한 리소스를 설명하는 객체를 반환합니다. who 매개변수는 아래 설명하는 RUSAGE_* 상수 중 하나를 사용하여 지정해야 합니다.
간단한 예제:
from resource import *
import time
# a non CPU-bound task
time.sleep(3)
print(getrusage(RUSAGE_SELF))
# a CPU-bound task
for i in range(10**8):
_ = 1 + 1
print(getrusage(RUSAGE_SELF))
반환 값의 필드는 각각 특정 시스템 리소스가 어떻게 사용되었는지 설명합니다. 예를 들어 사용자 모드에서 실행에 소요된 시간 또는 프로세스가 주 메모리에서 스왑된 횟수입니다. 일부 값은 클록 틱 간격에 따라 달라집니다(예: 프로세스가 사용하는 메모리 양).
하위 호환성을 위해 반환 값은 16개 요소의 튜플로도 접근할 수 있습니다.
반환 값의 ru_utime과 ru_stime 필드는 각각 사용자 모드에서 실행에 소요된 시간과 시스템 모드에서 실행에 소요된 시간을 나타내는 부동소수점 값입니다. 나머지 값은 정수입니다. 이 값들에 대한 자세한 정보는 getrusage(2) 매뉴얼 페이지를 참고하세요. 간략한 요약:
| 인덱스 | 필드 | 리소스 |
|---|---|---|
| 0 | ru_utime | 사용자 모드 시간 (float 초) |
| 1 | ru_stime | 시스템 모드 시간 (float 초) |
| 2 | ru_maxrss | 최대 상주 집합 크기 |
| 3 | ru_ixrss | 공유 메모리 크기 |
| 4 | ru_idrss | 비공유 메모리 크기 |
| 5 | ru_isrss | 비공유 스택 크기 |
| 6 | ru_minflt | I/O 없는 페이지 폴트 |
| 7 | ru_majflt | I/O 있는 페이지 폴트 |
| 8 | ru_nswap | 스왑 아웃 횟수 |
| 9 | ru_inblock | 블록 입력 연산 |
| 10 | ru_oublock | 블록 출력 연산 |
| 11 | ru_msgsnd | 보낸 메시지 |
| 12 | ru_msgrcv | 받은 메시지 |
| 13 | ru_nsignals | 받은 신호 |
| 14 | ru_nvcsw | 자발적 컨텍스트 전환 |
| 15 | ru_nivcsw | 비자발적 컨텍스트 전환 |
잘못된 who 매개변수가 지정되면 ValueError를 발생시킵니다. 특이한 상황에서는 error 예외도 발생시킬 수 있습니다.
resource.getpagesize()
시스템 페이지의 바이트 수를 반환합니다. (하드웨어 페이지 크기와 같을 필요는 없습니다.)
다음 RUSAGE_* 심볼은 어떤 프로세스에 대한 정보를 제공할지 지정하기 위해 getrusage() 함수에 전달됩니다.
- resource.RUSAGE_SELF — 호출 프로세스가 소비한 리소스를 요청하기 위해
getrusage()에 전달합니다. 프로세스의 모든 스레드가 사용한 리소스의 합입니다. - resource.RUSAGE_CHILDREN — 호출 프로세스의 자식 프로세스가 소비했고 종료되어 기다린 리소스를 요청하기 위해
getrusage()에 전달합니다. - resource.RUSAGE_BOTH — 현재 프로세스와 자식 프로세스가 소비한 리소스를 요청하기 위해
getrusage()에 전달합니다. 모든 시스템에서 사용하지 못할 수 있습니다. - resource.RUSAGE_THREAD — 현재 스레드가 소비한 리소스를 요청하기 위해
getrusage()에 전달합니다. 모든 시스템에서 사용하지 못할 수 있습니다.versionadded: 3.2.