Python의 psutil을 사용한 CPU 사용량 병렬 모니터링

16025 단어 python
Python에서 일부 프로세스를 실행하는 동안 CPU 사용률을 주기적으로 모니터링하는 스크립트를 작성했습니다.

멀티스레딩을 사용하면 기본 프로세스를 중지하지 않고 주기적으로 실행할 수 있습니다. 컴퓨터 부하가 높은 시계열 데이터를 보고할 때 유용할 수 있습니다. 전체 코드는 하단에 있습니다.

라이브러리 설치



라이브러리psutil를 사용하여 Python에서 CPU 사용률을 얻을 수 있습니다. pip를 통해 설치할 수 있습니다.

pip install psutil


기본 사용법은 다음과 같습니다.

# percpu=True returns a list of utilization (%) per core
>>> psutil.cpu_percent(interval=1, percpu=True)
[7.0, 1.0, 8.9, 0.0, 5.0, 1.0, 4.0, 0.0]

# percpu=False returns an average utilization (%)
>>> psutil.cpu_percent(interval=1, percpu=False)
8.9

# Smaller interval(sec) shortens the measurement time, but also increases the error.
>>> psutil.cpu_percent(interval=0.5, percpu=True) 
[6.0, 0.0, 7.8, 1.9, 4.0, 0.0, 5.8, 0.0]



병렬 처리



이번에는 네이티브 라이브러리threading를 사용하여 병렬 처리를 구현합니다.
다음과 같이 스레드 인스턴스를 생성하고 실행할 수 있습니다.

m = threading.Thread(target=monitor_cpu,args=((initial_time,)))
m.start()

threading.Thread()에 대한 인수로 target는 실행할 메서드이고 args는 메서드에 대한 인수입니다.
monitor_cpu는 모니터링 방법입니다.

모니터링 방법


threading.Event를 사용하여 모니터링 스레드를 관리합니다.threading.Event는 이벤트가 발생할 때까지 스레드를 기다리게 한 다음 다른 스레드에서 이벤트가 발생하면 대기 중인 스레드를 재개하는 데 사용됩니다.

우리는 2개의 이벤트를 사용합니다.
  • wait(timeout) : 이벤트가 발생하거나 timeout초가 경과할 때까지 현재 스레드를 대기시킵니다.
  • set() : 이벤트를 발생시킵니다.

  • def monitor_cpu(initial_time):
        print("START monitor_cpu")
        while not event.wait(1):  # Wait for 1 second, if no event occurs, execute inside the loop and wait again
            elapsed_time = time.time() - initial_time
            cpu_percent = psutil.cpu_percent(percpu=True)
            cpu_percent = '\t'.join(["{:10.4f}".format(v) for v in cpu_percent])
            print("time:", int(elapsed_time), cpu_percent)
        print("END monitor_cpu")  # When an event occurs, exit the loop and terminate execution
    
    
    if __name__=="__main__":
        event = threading.Event()
        initial_time = time.time()
        m = threading.Thread(target=monitor_cpu,args=((initial_time,)))
        m.start()
    
        # Main process
    
        event.set()  # Fires an event
    

    내부monitor_cpu에서 실행 간격이 1초인 무한 루프가 실행됩니다. 이벤트가 발생하면 루프를 중단하고 실행을 종료합니다.

    def monitor_cpu(initial_time):
        print("START monitor_cpu")
        while flag:
            time.sleep(1)
            elapsed_time = time.time() - initial_time
            cpu_percent = psutil.cpu_percent(percpu=True)
            cpu_percent = '\t'.join(["{:10.4f}".format(v) for v in cpu_percent])
            print("time:", int(elapsed_time), cpu_percent)
        print("END monitor_cpu")
    
    if __name__=="__main__":
        event = threading.Event()
        initial_time = time.time()
        flag = True
        m = threading.Thread(target=monitor_cpu,args=((initial_time,)))
        m.start()
        tmp = 0
        for i in range(100000000):
            tmp = i+i
        flag = False
    


    전체 코드




    import threading
    import time
    import psutil
    
    def monitor_cpu(initial_time):
        print("START monitor_cpu")
        while not event.wait(1):
            elapsed_time = time.time() - initial_time
            cpu_percent = psutil.cpu_percent(percpu=True)
            cpu_percent = '\t'.join(["{:10.4f}".format(v) for v in cpu_percent])
            print("time:", int(elapsed_time), cpu_percent)
        print("END monitor_cpu")
    
    if __name__=="__main__":
        event = threading.Event()
        initial_time = time.time()
        m = threading.Thread(target=monitor_cpu,args=((initial_time,)))
        m.start()
        tmp = 0
        for i in range(100000000):
            tmp = i+i
        event.set()
    
    


    결과



    왼쪽에서 오른쪽으로: 시간(초), CPU1 사용률(%), CPU2 사용률 ... CPU8 사용률.

    START monitor_cpu
    time: 1  52.0     1.0    29.7     1.0    28.7     2.0    30.4     0.0
    time: 2  45.0     3.0    36.3     3.0    32.4     1.0    29.4     1.0
    time: 3  43.6     2.0    31.0     1.0    33.7     0.0    27.7     2.0
    time: 4  45.5     2.0    25.2     1.0    22.8     0.0    19.8     0.0
    time: 5  41.6     1.0    26.0     1.0    26.7     1.0    20.8     1.0
    time: 6  46.1     5.0    34.7     3.0    38.0     3.0    31.7     4.0
    time: 7  63.0    10.0    52.5    10.0    55.4    10.9    55.0    10.0
    time: 8  51.5     6.9    36.0     4.9    41.2     5.0    39.6     4.9
    time: 9  55.0     0.0    20.6     1.0    26.0     0.0    14.9     0.0
    time: 10  49.5    2.9    22.8     1.0    25.2     1.0    23.5     1.0
    time: 11  43.6    1.0    32.7     0.0    28.3     0.0    23.8     1.0
    time: 12  47.5    2.9    22.8     1.0    20.6     2.0    25.0     2.0
    END monitor_cpu
    

    좋은 웹페이지 즐겨찾기