programing

Python 프로세스에서 사용된 총 메모리 수?

nicescript 2022. 10. 10. 18:41
반응형

Python 프로세스에서 사용된 총 메모리 수?

Python 프로그램이 현재 얼마나 많은 메모리를 사용하고 있는지 알 수 있는 방법이 있습니까?단일 객체의 메모리 사용량에 대해 논의한 적이 있지만 캐시된 데이터를 언제 폐기해야 하는지 판단하기 위해 프로세스의 총 메모리 사용량이 필요합니다.

Linux, Windows 등 다양한 운영 체제에서 사용할 수 있는 유용한 솔루션을 소개합니다.

import os, psutil
process = psutil.Process(os.getpid())
print(process.memory_info().rss)  # in bytes 

주의:

  • 하다pip install psutil아직 설치되지 않은 경우

  • 프로세스에 걸리는 MB의 수를 빠르게 알고 싶다면 편리한 원라이너:

    import os, psutil; print(psutil.Process(os.getpid()).memory_info().rss / 1024 ** 2)
    
  • Python 2.7과 psutil 5.6.3을 사용하면 다음과 같은 이점이 있습니다.process.memory_info()[0](나중에 API가 변경되었습니다)

Unix 기반 시스템(Linux, Mac OS X, Solaris)의 경우getrusage()표준 라이브러리 모듈에서 작동합니다.결과 개체에는 속성이 있습니다.ru_maxrss는, 콜 프로세스의 최대 메모리 사용율을 나타내고 있습니다.

>>> resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
2656  # peak memory usage (kilobytes on Linux, bytes on OS X)

Python 문서에서는 유닛에 대해 기록하지 않습니다.장치의 값을 확인하려면 해당 시스템의 페이지를 참조하십시오.Ubuntu 18.04에서는 단위는 킬로바이트로 표시됩니다.Mac OS X에서는 바이트입니다.

getrusage()기능도 부여할 수 있습니다.resource.RUSAGE_CHILDREN(일부 시스템에서는) 하위 프로세스에 대한 사용법을 가져옵니다.resource.RUSAGE_BOTH전체(본인과 자녀) 프로세스 사용률에 대해 설명합니다.

Linux에만 관심이 있는 경우 다음 문서를 읽을 수 있습니다./proc/self/status또는/proc/self/statm이 질문에 대한 다른 답변과 이 질문에 대한 답변에 설명된 대로 파일을 제출하십시오.

Windows 에서는, WMI( 페이지, 치즈샵)를 사용할 수 있습니다.

def memory():
    import os
    from wmi import WMI
    w = WMI('.')
    result = w.query("SELECT WorkingSet FROM Win32_PerfRawData_PerfProc_Process WHERE IDProcess=%d" % os.getpid())
    return int(result[0].WorkingSet)

Linux의 경우(python cookbook http://code.activestate.com/recipes/286222/에서 확인):

import os
_proc_status = '/proc/%d/status' % os.getpid()

_scale = {'kB': 1024.0, 'mB': 1024.0*1024.0, 'KB': 1024.0, 'MB': 1024.0*1024.0}

def _VmB(VmKey):
    '''Private.'''
    global _proc_status, _scale
     # get pseudo file  /proc/<pid>/status
    try:
        t = open(_proc_status)
        v = t.read()
        t.close()
    except:
        return 0.0  # non-Linux?
     # get VmKey line e.g. 'VmRSS:  9999  kB\n ...'
    i = v.index(VmKey)
    v = v[i:].split(None, 3)  # whitespace
    if len(v) < 3:
        return 0.0  # invalid format?
     # convert Vm value to bytes
    return float(v[1]) * _scale[v[2]]

def memory(since=0.0):
    '''Return memory usage in bytes.'''
    return _VmB('VmSize:') - since

def resident(since=0.0):
    '''Return resident memory usage in bytes.'''
    return _VmB('VmRSS:') - since

def stacksize(since=0.0):
    '''Return stack size in bytes.'''
    return _VmB('VmStk:') - since

unix 에서는,ps감시 도구:

$ ps u -p 1347 | awk '{sum=sum+$6}; END {print sum/1024}'

여기서 1347은 프로세스 ID입니다.또한 결과는 MB 단위입니다.

Import 없이 Python 2, Python 3 및 pypy에서 현재 프로세스의 메모리 사용량:

def getCurrentMemoryUsage():
    ''' Memory usage in kB '''

    with open('/proc/self/status') as f:
        memusage = f.read().split('VmRSS:')[1].split('\n')[0][:-3]

    return int(memusage.strip())

현재 프로세스의 상태 파일을 읽고 모든 것을 다음에 가져옵니다.VmRSS:그런 다음 첫 번째 줄 앞에 모든 것을 가져와서(VmRSS 값을 분리), 마지막으로 공간과 단위(kB)인 마지막 3바이트를 잘라냅니다.
반환하려면 공백이 모두 제거되고 숫자로 반환됩니다.

Linux 4.4 및 4.9에서 테스트 완료. 단, Linux의 초기 버전도 동작합니다.man proc./proc/$PID/status파일에는 일부 필드(예: "VmPTE"용 Linux 2.6.10)의 최소 버전이 기재되어 있지만, "VmRSS" 필드(여기서 사용하는 것)에는 기재되어 있지 않습니다.그래서 나는 그것이 초기 버전부터 거기에 있었다고 생각한다.

아래는 함수 호출 전에 이 프로세스가 소비한 메모리 양, 함수 호출 후 사용하는 메모리 양 및 함수 실행 시간을 추적할 수 있는 함수 데코레이터입니다.

import time
import os
import psutil


def elapsed_since(start):
    return time.strftime("%H:%M:%S", time.gmtime(time.time() - start))


def get_process_memory():
    process = psutil.Process(os.getpid())
    return process.memory_info().rss


def track(func):
    def wrapper(*args, **kwargs):
        mem_before = get_process_memory()
        start = time.time()
        result = func(*args, **kwargs)
        elapsed_time = elapsed_since(start)
        mem_after = get_process_memory()
        print("{}: memory before: {:,}, after: {:,}, consumed: {:,}; exec time: {}".format(
            func.__name__,
            mem_before, mem_after, mem_after - mem_before,
            elapsed_time))
        return result
    return wrapper

그래서 어떤 기능을 가지고 있을 때

from utils import track

@track
def list_create(n):
    print("inside list create")
    return [1] * n

다음의 출력이 표시됩니다.

inside list create
list_create: memory before: 45,928,448, after: 46,211,072, consumed: 282,624; exec time: 00:00:00

3.6 및 5. Python 3.6 psutil 5.4.5를 사용하는 이 더 .memory_percent()를 참조해 주세요.

import os
import psutil
process = psutil.Process(os.getpid())
print(process.memory_percent())

마음에 들어요, @bayer 감사합니다.특정 프로세스 카운트 툴을 입수했습니다.

# Megabyte.
$ ps aux | grep python | awk '{sum=sum+$6}; END {print sum/1024 " MB"}'
87.9492 MB

# Byte.
$ ps aux | grep python | awk '{sum=sum+$6}; END {print sum " KB"}'
90064 KB

프로세스 목록을 첨부합니다.

$ ps aux  | grep python
root       943  0.0  0.1  53252  9524 ?        Ss   Aug19  52:01 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
root       950  0.6  0.4 299680 34220 ?        Sl   Aug19 568:52 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
root      3803  0.2  0.4 315692 36576 ?        S    12:43   0:54 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
jonny    23325  0.0  0.1  47460  9076 pts/0    S+   17:40   0:00 python
jonny    24651  0.0  0.0  13076   924 pts/4    S+   18:06   0:00 grep python

언급

/proc/self/status/proc/self/statm공백으로 구분된 몇 가지 통계 목록입니다.두 파일이 항상 있는지 알 수가 없었어요.

/syslog/[pid]/statm

메모리 사용량에 대한 정보를 페이지 단위로 제공합니다.열은 다음과 같습니다.

  • 크기 (1) 총 프로그램 크기(/proc/[pid]/status의 VmSize와 동일)
  • 상주 (2) 상주 세트 크기(/proc/[pid]/status의 VmRSS와 동일)
  • 공유(3) 상주 공유 페이지 수(즉, 파일로 백업) (/proc/[pid]/status의 RssFile+RssShm과 동일)
  • 텍스트(4) 텍스트(코드)
  • lib(5) 라이브러리(Linux 2.6 이후 사용되지 않음, 항상 0)
  • 데이터(6) + 스택
  • dt(7) 더티 페이지(Linux 2.6 이후 사용되지 않음, 항상 0)

다음은 간단한 예입니다.

from pathlib import Path
from resource import getpagesize

PAGESIZE = getpagesize()
PATH = Path('/proc/self/statm')


def get_resident_set_size() -> int:
    """Return the current resident set size in bytes."""
    # statm columns are: size resident shared text lib data dt
    statm = PATH.read_text()
    fields = statm.split()
    return int(fields[1]) * PAGESIZE


data = []
start_memory = get_resident_set_size()
for _ in range(10):
    data.append('X' * 100000)
    print(get_resident_set_size() - start_memory)

그러면 다음과 같은 목록이 생성됩니다.

0
0
368640
368640
368640
638976
638976
909312
909312
909312

100,000 바이트를 대략 3회 할당한 후 약 300,000 바이트가 급증하는 것을 알 수 있습니다.

import os, win32api, win32con, win32process
han = win32api.OpenProcess(win32con.PROCESS_QUERY_INFORMATION|win32con.PROCESS_VM_READ, 0, os.getpid())
process_memory = int(win32process.GetProcessMemoryInfo(han)['WorkingSetSize'])

Unix systems " " "time하면 이 합니다. (/usr/bin/time)을 참조하십시오.를 참조해 주세요.Maximum resident set size아래는 프로그램 실행 중에 사용된 실제(가상이 아닌) 메모리의 최대값입니다.

$ /usr/bin/time -v ls /

    Command being timed: "ls /"
    User time (seconds): 0.00
    System time (seconds): 0.01
    Percent of CPU this job got: 250%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.00
    Average shared text size (kbytes): 0
    Average unshared data size (kbytes): 0
    Average stack size (kbytes): 0
    Average total size (kbytes): 0
    Maximum resident set size (kbytes): 0
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 315
    Voluntary context switches: 2
    Involuntary context switches: 0
    Swaps: 0
    File system inputs: 0
    File system outputs: 0
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0

Python Bayer의 답변을 얻기 위해 sh와 os를 사용합니다.

float(sh.awk(sh.ps('u','-p',os.getpid()),'{sum=sum+$6}; END {print sum/1024}'))

답은 MB 단위입니다.

언급URL : https://stackoverflow.com/questions/938733/total-memory-used-by-python-process

반응형