ssfinder-matching / utils /performance.py
asefasdfcv's picture
Create performance.py
02d9941 verified
raw
history blame
4.11 kB
"""
์„ฑ๋Šฅ ์ธก์ • ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ชจ๋“ˆ
"""
import time
import logging
import functools
import traceback
import psutil
import os
import platform
import gc
from typing import Callable, Any
# ๋กœ๊น… ์„ค์ •
logger = logging.getLogger(__name__)
def performance_logger(func):
"""
ํ•จ์ˆ˜ ์‹คํ–‰ ์‹œ๊ฐ„ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ๋กœ๊น…ํ•˜๋Š” ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ
Args:
func (callable): ์ธก์ •ํ•  ํ•จ์ˆ˜
Returns:
callable: ๋ž˜ํ•‘๋œ ํ•จ์ˆ˜
"""
@functools.wraps(func)
async def wrapper(*args, **kwargs):
# ์‹œ์ž‘ ์‹œ๊ฐ„ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ธก์ •
start_time = time.time()
start_memory = 0
try:
# ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ธก์ • (๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ)
if psutil:
process = psutil.Process(os.getpid())
start_memory = process.memory_info().rss / 1024 / 1024 # MB ๋‹จ์œ„
except Exception:
pass
# ํ•จ์ˆ˜ ํ˜ธ์ถœ
try:
result = await func(*args, **kwargs)
except Exception as e:
logger.error(f"ํ•จ์ˆ˜ {func.__name__} ์‹คํ–‰ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}")
logger.error(traceback.format_exc())
raise
# ์ข…๋ฃŒ ์‹œ๊ฐ„ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ธก์ •
end_time = time.time()
end_memory = 0
try:
if psutil:
process = psutil.Process(os.getpid())
end_memory = process.memory_info().rss / 1024 / 1024 # MB ๋‹จ์œ„
except Exception:
pass
# ์‹คํ–‰ ์ •๋ณด ๋กœ๊น…
execution_time = end_time - start_time
memory_usage = end_memory - start_memory if end_memory > 0 else 0
logger.info(f"ํ•จ์ˆ˜ {func.__name__} ์‹คํ–‰ ์‹œ๊ฐ„: {execution_time:.4f}์ดˆ")
if end_memory > 0:
logger.info(f"ํ•จ์ˆ˜ {func.__name__} ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ๋ณ€ํ™”: {memory_usage:.2f} MB (์‹œ์ž‘: {start_memory:.2f} MB, ์ข…๋ฃŒ: {end_memory:.2f} MB)")
return result
return wrapper
def log_system_info():
"""์‹œ์Šคํ…œ ์ •๋ณด ๋กœ๊น…"""
try:
logger.info("===== ์‹œ์Šคํ…œ ์ •๋ณด =====")
logger.info(f"OS: {platform.system()} {platform.release()}")
logger.info(f"Python ๋ฒ„์ „: {platform.python_version()}")
if psutil:
# CPU ์ •๋ณด
cpu_count = psutil.cpu_count(logical=False)
cpu_count_logical = psutil.cpu_count(logical=True)
logger.info(f"CPU: {cpu_count} ์ฝ”์–ด ({cpu_count_logical} ๋…ผ๋ฆฌ ํ”„๋กœ์„ธ์„œ)")
# ๋ฉ”๋ชจ๋ฆฌ ์ •๋ณด
mem = psutil.virtual_memory()
total_mem = mem.total / (1024 * 1024 * 1024) # GB ๋‹จ์œ„
available_mem = mem.available / (1024 * 1024 * 1024) # GB ๋‹จ์œ„
logger.info(f"๋ฉ”๋ชจ๋ฆฌ: ์ด {total_mem:.2f} GB (์‚ฌ์šฉ ๊ฐ€๋Šฅ: {available_mem:.2f} GB)")
# ๋””์Šคํฌ ์ •๋ณด
disk = psutil.disk_usage('/')
total_disk = disk.total / (1024 * 1024 * 1024) # GB ๋‹จ์œ„
free_disk = disk.free / (1024 * 1024 * 1024) # GB ๋‹จ์œ„
logger.info(f"๋””์Šคํฌ: ์ด {total_disk:.2f} GB (์—ฌ์œ  ๊ณต๊ฐ„: {free_disk:.2f} GB)")
logger.info("=======================")
except Exception as e:
logger.error(f"์‹œ์Šคํ…œ ์ •๋ณด ๋กœ๊น… ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}")
def cleanup_memory():
"""
๋ฉ”๋ชจ๋ฆฌ ์ •๋ฆฌ ํ•จ์ˆ˜ - ๊ธด ์ž‘์—… ํ›„ ๋ฉ”๋ชจ๋ฆฌ ์ •๋ฆฌ์— ์‚ฌ์šฉ
"""
try:
# ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๊ฐ•์ œ ์‹คํ–‰
collected = gc.collect()
logger.debug(f"๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ์‹คํ–‰: {collected}๊ฐœ ๊ฐ์ฒด ์ˆ˜์ง‘")
# ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ๋กœ๊น… (๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ)
if psutil:
process = psutil.Process(os.getpid())
memory_usage = process.memory_info().rss / 1024 / 1024 # MB ๋‹จ์œ„
logger.debug(f"ํ˜„์žฌ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰: {memory_usage:.2f} MB")
except Exception as e:
logger.error(f"๋ฉ”๋ชจ๋ฆฌ ์ •๋ฆฌ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}")