`resource` — 리소스 사용량 정보
resource — 리소스 사용량 정보
이 모듈은 프로그램이 사용하는 시스템 리소스를 측정하고 제어하는 기본 메커니즘을 제공해요.
가용성: Unix, WASI 아님. 상징적인 상수는 특정 시스템 리소스를 지정하고 현재 프로세스나 그 자식에 대한 사용량 정보를 요청하는 데 사용돼요. syscall 실패 시 OSError가 발생해요.
exception resource.error
폐기된 OSError 별칭이에요. 버전 3.3 변경: PEP 3151에 따라 이 클래스가 OSError의 별칭이 됨.
출처: Python 표준 라이브러리
본문
리소스 제한 (Resource Limits)
리소스 사용량은 아래 설명하는 setrlimit() 함수로 제한할 수 있어요. 각 리소스는 한 쌍의 제한(소프트 제한 soft limit과 하드 제한 hard limit)으로 제어돼요. 소프트 제한은 현재 제한이며, 프로세스가 시간이 지나면서 낮추거나 올릴 수 있어요. 소프트 제한은 하드 제한을 결코 초과할 수 없어요. 하드 제한은 소프트 제한보다 큰 어떤 값으로도 낮출 수 있지만, 올릴 수는 없어요. (오직 슈퍼유저의 유효 UID를 가진 프로세스만 하드 제한을 올릴 수 있어요.)
제한할 수 있는 특정 리소스는 시스템에 따라 달라요. getrlimit(2) man 페이지에 설명돼 있어요. 아래 나열된 리소스는 기본 운영체제가 지원할 때 지원돼요. 운영체제가 확인하거나 제어할 수 없는 리소스는 그 플랫폼에서 이 모듈에 정의되지 않아요.
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이면 호출은 현재 프로세스에 적용돼요. limits가 선택 사항이라는 점만 빼면 resource와 limits는 setrlimit()과 같은 의미예요.
limits를 주지 않으면 pid 프로세스의 resource 제한을 반환해요. limits를 주면 프로세스의 리소스 제한을 설정하고 이전 리소스 제한을 반환해요. pid를 찾을 수 없으면 ProcessLookupError를, 사용자가 그 프로세스에 대한 CAP_SYS_RESOURCE가 없으면 PermissionError를 발생시켜요. 감사 이벤트 resource.prlimit를 인자 pid, resource, limits로 발생시켜요. 가용성: glibc >= 2.13인 Linux >= 2.6.36. 버전 3.4에서 추가됨.
이 상징들은 setrlimit()과 getrlimit() 함수로 소비를 제어할 수 있는 리소스를 정의해요. 이 상징들의 값은 C 프로그램이 쓰는 상수와 정확히 같아요. getrlimit(2)의 Unix man 페이지가 사용 가능한 리소스를 나열해요. 모든 시스템이 같은 리소스를 나타내기 위해 같은 상징이나 값을 쓰는 건 아니라는 점에 주의하세요. 이 모듈은 플랫폼 차이를 감추려 하지 않아요. 플랫폼에 정의되지 않은 상징은 그 플랫폼에서 이 모듈로부터 쓸 수 없어요.
resource.RLIMIT_CORE
현재 프로세스가 만들 수 있는 코어 파일의 최대 크기(바이트)예요. 전체 프로세스 이미지를 담으려면 더 큰 코어가 필요하다면 부분 코어 파일이 만들어질 수 있어요.
resource.RLIMIT_CPU
프로세스가 쓸 수 있는 최대 프로세서 시간(초)이에요. 이 제한을 초과하면 프로세스에 SIGXCPU 신호가 보내져요. (이 신호를 잡아서 열린 파일을 디스크로 플러시 하는 등 유용한 일을 하는 방법은 signal 모듈 문서를 참고하세요.)
resource.RLIMIT_FSIZE
프로세스가 만들 수 있는 파일의 최대 크기예요.
resource.RLIMIT_DATA
프로세스 힙(heap)의 최대 크기(바이트)예요.
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의 별칭이에요. 가용성: Solaris, FreeBSD, NetBSD.
resource.RLIMIT_AS
프로세스가 가질 수 있는 주소 공간의 최대 영역(바이트)이에요.
resource.RLIMIT_MSGQUEUE
POSIX 메시지 큐에 할당할 수 있는 바이트 수예요. 가용성: Linux >= 2.6.8. 버전 3.4에서 추가.
resource.RLIMIT_NICE
프로세스 nice 수준의 상한(20 - rlim_cur로 계산)이에요. 가용성: Linux >= 2.6.12. 버전 3.4에서 추가.
resource.RLIMIT_RTPRIO
실시간 우선순위의 상한이에요. 가용성: Linux >= 2.6.12. 버전 3.4에서 추가.
resource.RLIMIT_RTTIME
블로킹 syscall 없이 실시간 스케줄링으로 프로세스가 보낼 수 있는 CPU 시간(마이크로초)의 시간 제한이에요. 가용성: Linux >= 2.6.25. 버전 3.4에서 추가.
resource.RLIMIT_SIGPENDING
프로세스가 큐에 넣을 수 있는 신호 수예요. 가용성: Linux >= 2.6.8. 버전 3.4에서 추가.
resource.RLIMIT_SBSIZE
이 사용자에 대한 소켓 버퍼 사용의 최대 크기(바이트)예요. 이는 네트워크 메모리, 따라서 이 사용자가 언제든 보유할 수 있는 mbuf의 양을 제한해요. 가용성: FreeBSD, NetBSD. 버전 3.4에서 추가.
resource.RLIMIT_SWAP
이 사용자 ID의 모든 프로세스가 예약하거나 사용할 수 있는 스왑 공간의 최대 크기(바이트)예요. 이 제한은 vm.overcommit sysctl의 1번 비트가 설정된 경우에만 적용돼요. 버전 3.4에서 추가.
resource.RLIMIT_NPTS
이 사용자 ID가 만드는 최대 의사 터미널 수예요. 가용성: FreeBSD >= 8. 버전 3.4에서 추가.
resource.RLIMIT_KQUEUES
이 사용자 ID가 만들 수 있는 최대 kqueue 수예요. 가용성: FreeBSD >= 11. 버전 3.10에서 추가.
리소스 사용량 (Resource Usage)
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) man 페이지를 참고하세요. 간단한 요약은 다음과 같아요.
| Index | Field | Resource |
|---|---|---|
| 0 | ru_utime | user mode 시간 (float seconds) |
| 1 | ru_stime | system mode 시간 (float seconds) |
| 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()에 넘겨요. 모든 시스템에서 사용 가능하지 않을 수 있어요. 버전 3.2에서 추가.