파이썬에서 CPU와 메모리 사용량을 추적하는 방법
- 서버의 최적화와 스케일업/아웃을 위해서는 기본적으로 사용되는 서비스의 자원이 얼마나 요구되는지를 알아야 한다.
- 새로운 쓰레드나 프로세스를 생성하는 경우, 이를 모니터링할 수 있는 방법을 정리한다.
- 해당 정보는 GPT/뤼튼을 통해 얻은 정보를 기반으로 정리한 것으로 실재 사용은 테스트 및 공식 문서의 참고가 요구된다. 하지만 대부분의 개발언어들이 제공하는 기능이기에 방법들의 이해로 받아들이면 좋을것이다.
- 하나의 프로세스를 기준으로 측정을 하고, 이후 증가 단위를 두고 측정하여 평균을 산정하면 될것이다.
- pool을 사용한다면, idle한 경우와 half, full의 경우를 모두 산정하면 될것이다.
1. psutil 라이브러리 사용하기
- psutil은 시스템 모니터링, 분석 및 리소스 사용 정보를 얻기 위한 크로스 플랫폼 라이브러리이다. 이를 사용하여 특정 프로세스 또는 쓰레드의 CPU 및 메모리 사용량을 모니터링할 수 있다.
- 라이브러리 설치: pip install psutil
import psutil
import threading
import time
def target_function():
# 예제 함수: 10초간 대기
time.sleep(10)
# 쓰레드 시작
thread = threading.Thread(target=target_function)
thread.start()
# psutil을 사용하여 현재 프로세스(즉, 파이썬 인터프리터)의 정보를 가져옵니다.
p = psutil.Process()
# 쓰레드가 실행 중인 동안 CPU와 메모리 사용량을 추적
while thread.is_alive():
cpu_usage = p.cpu_percent()
memory_usage = p.memory_info().rss # RSS(Resident Set Size)는 프로세스가 사용하는 물리 메모리의 양입니다.
print(f"CPU Usage: {cpu_usage}%, Memory Usage: {memory_usage} bytes")
time.sleep(1)
thread.join()
2. resource 모듈 사용하기 (Unix/Linux 전용)
- Unix 기반 시스템에서는 resource 모듈을 사용하여 현재 프로세스의 리소스 사용량을 얻을 수 있다. 이 방법은 쓰레드별 분석보다는 전체 프로세스의 리소스 사용량을 제공한다.
import resource
import threading
import time
def target_function():
# 예제 함수: 10초간 대기
time.sleep(10)
# 쓰레드 시작
thread = threading.Thread(target=target_function)
thread.start()
# 쓰레드가 실행 중인 동안 메모리 사용량을 추적
while thread.is_alive():
memory_usage = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss # 현재 프로세스의 최대 resident set size
print(f"Memory Usage: {memory_usage} bytes")
time.sleep(1)
thread.join()
3. 프로파일링 도구 사용하기
- 성능 분석 및 리소스 모니터링을 위한 전문 프로파일링 도구(예: Py-Spy, Memory Profiler, Yappi)를 사용할 수도 있다. 이 도구들은 더 상세한 정보를 제공하며, 복잡한 애플리케이션의 성능 문제를 진단하는 데 유용하다.
- Py-Spy : 파이썬 프로그램을 중단시키지 않고 CPU 프로파일링을 수행할 수 있는 도구이다.
- Memory Profiler : 파이썬 코드의 메모리 사용량을 라인별로 추적할 수 있게 해주는 도구이다.
- Yappi : 멀티 쓰레드/코루틴 지원을 포함한 파이썬 코드의 성능 분석을 위한 도구이다.