resource — 리소스 사용 정보

resource — 리소스 사용 정보

이 모듈은 프로그램이 사용하는 시스템 리소스를 측정하고 제어하기 위한 기본적인 메커니즘을 제공합니다.

출처: Python documentation

본문

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가 발생합니다.
    • 기저 시스템 호출이 실패하면 setrlimiterror를 발생시킬 수 있습니다.
    • VxWorks는 RLIMIT_NOFILE 설정만 지원합니다.
    • 감사 이벤트 resource.setrlimit를 인자 resource, limits로 발생시킵니다.
  • resource.prlimit(pid, resource[, limits])setrlimit()getrlimit()을 하나의 함수로 결합하고 임의 프로세스의 리소스 한도를 얻고 설정할 수 있게 지원합니다. pid가 0이면 호출은 현재 프로세스에 적용됩니다. resourcelimitssetrlimit()에서와 같은 의미를 가지지만 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_OFILERLIMIT_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.overcommit sysctl의 비트 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_utimeru_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.

더 알아보기 (Learn more)