Spaces:
Sleeping
Sleeping
Create performance.py
Browse files- utils/performance.py +117 -0
utils/performance.py
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
์ฑ๋ฅ ์ธก์ ๋ฐ ๋ชจ๋ํฐ๋ง ์ ํธ๋ฆฌํฐ ๋ชจ๋
|
| 3 |
+
"""
|
| 4 |
+
import time
|
| 5 |
+
import logging
|
| 6 |
+
import functools
|
| 7 |
+
import traceback
|
| 8 |
+
import psutil
|
| 9 |
+
import os
|
| 10 |
+
import platform
|
| 11 |
+
import gc
|
| 12 |
+
from typing import Callable, Any
|
| 13 |
+
|
| 14 |
+
# ๋ก๊น
์ค์
|
| 15 |
+
logger = logging.getLogger(__name__)
|
| 16 |
+
|
| 17 |
+
def performance_logger(func):
|
| 18 |
+
"""
|
| 19 |
+
ํจ์ ์คํ ์๊ฐ ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๋ก๊น
ํ๋ ๋ฐ์ฝ๋ ์ดํฐ
|
| 20 |
+
|
| 21 |
+
Args:
|
| 22 |
+
func (callable): ์ธก์ ํ ํจ์
|
| 23 |
+
|
| 24 |
+
Returns:
|
| 25 |
+
callable: ๋ํ๋ ํจ์
|
| 26 |
+
"""
|
| 27 |
+
@functools.wraps(func)
|
| 28 |
+
async def wrapper(*args, **kwargs):
|
| 29 |
+
# ์์ ์๊ฐ ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์ธก์
|
| 30 |
+
start_time = time.time()
|
| 31 |
+
start_memory = 0
|
| 32 |
+
|
| 33 |
+
try:
|
| 34 |
+
# ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์ธก์ (๊ฐ๋ฅํ ๊ฒฝ์ฐ)
|
| 35 |
+
if psutil:
|
| 36 |
+
process = psutil.Process(os.getpid())
|
| 37 |
+
start_memory = process.memory_info().rss / 1024 / 1024 # MB ๋จ์
|
| 38 |
+
except Exception:
|
| 39 |
+
pass
|
| 40 |
+
|
| 41 |
+
# ํจ์ ํธ์ถ
|
| 42 |
+
try:
|
| 43 |
+
result = await func(*args, **kwargs)
|
| 44 |
+
except Exception as e:
|
| 45 |
+
logger.error(f"ํจ์ {func.__name__} ์คํ ์ค ์ค๋ฅ ๋ฐ์: {str(e)}")
|
| 46 |
+
logger.error(traceback.format_exc())
|
| 47 |
+
raise
|
| 48 |
+
|
| 49 |
+
# ์ข
๋ฃ ์๊ฐ ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์ธก์
|
| 50 |
+
end_time = time.time()
|
| 51 |
+
end_memory = 0
|
| 52 |
+
|
| 53 |
+
try:
|
| 54 |
+
if psutil:
|
| 55 |
+
process = psutil.Process(os.getpid())
|
| 56 |
+
end_memory = process.memory_info().rss / 1024 / 1024 # MB ๋จ์
|
| 57 |
+
except Exception:
|
| 58 |
+
pass
|
| 59 |
+
|
| 60 |
+
# ์คํ ์ ๋ณด ๋ก๊น
|
| 61 |
+
execution_time = end_time - start_time
|
| 62 |
+
memory_usage = end_memory - start_memory if end_memory > 0 else 0
|
| 63 |
+
|
| 64 |
+
logger.info(f"ํจ์ {func.__name__} ์คํ ์๊ฐ: {execution_time:.4f}์ด")
|
| 65 |
+
|
| 66 |
+
if end_memory > 0:
|
| 67 |
+
logger.info(f"ํจ์ {func.__name__} ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๋ณํ: {memory_usage:.2f} MB (์์: {start_memory:.2f} MB, ์ข
๋ฃ: {end_memory:.2f} MB)")
|
| 68 |
+
|
| 69 |
+
return result
|
| 70 |
+
|
| 71 |
+
return wrapper
|
| 72 |
+
|
| 73 |
+
def log_system_info():
|
| 74 |
+
"""์์คํ
์ ๋ณด ๋ก๊น
"""
|
| 75 |
+
try:
|
| 76 |
+
logger.info("===== ์์คํ
์ ๋ณด =====")
|
| 77 |
+
logger.info(f"OS: {platform.system()} {platform.release()}")
|
| 78 |
+
logger.info(f"Python ๋ฒ์ : {platform.python_version()}")
|
| 79 |
+
|
| 80 |
+
if psutil:
|
| 81 |
+
# CPU ์ ๋ณด
|
| 82 |
+
cpu_count = psutil.cpu_count(logical=False)
|
| 83 |
+
cpu_count_logical = psutil.cpu_count(logical=True)
|
| 84 |
+
logger.info(f"CPU: {cpu_count} ์ฝ์ด ({cpu_count_logical} ๋
ผ๋ฆฌ ํ๋ก์ธ์)")
|
| 85 |
+
|
| 86 |
+
# ๋ฉ๋ชจ๋ฆฌ ์ ๋ณด
|
| 87 |
+
mem = psutil.virtual_memory()
|
| 88 |
+
total_mem = mem.total / (1024 * 1024 * 1024) # GB ๋จ์
|
| 89 |
+
available_mem = mem.available / (1024 * 1024 * 1024) # GB ๋จ์
|
| 90 |
+
logger.info(f"๋ฉ๋ชจ๋ฆฌ: ์ด {total_mem:.2f} GB (์ฌ์ฉ ๊ฐ๋ฅ: {available_mem:.2f} GB)")
|
| 91 |
+
|
| 92 |
+
# ๋์คํฌ ์ ๋ณด
|
| 93 |
+
disk = psutil.disk_usage('/')
|
| 94 |
+
total_disk = disk.total / (1024 * 1024 * 1024) # GB ๋จ์
|
| 95 |
+
free_disk = disk.free / (1024 * 1024 * 1024) # GB ๋จ์
|
| 96 |
+
logger.info(f"๋์คํฌ: ์ด {total_disk:.2f} GB (์ฌ์ ๊ณต๊ฐ: {free_disk:.2f} GB)")
|
| 97 |
+
|
| 98 |
+
logger.info("=======================")
|
| 99 |
+
except Exception as e:
|
| 100 |
+
logger.error(f"์์คํ
์ ๋ณด ๋ก๊น
์ค ์ค๋ฅ ๋ฐ์: {str(e)}")
|
| 101 |
+
|
| 102 |
+
def cleanup_memory():
|
| 103 |
+
"""
|
| 104 |
+
๋ฉ๋ชจ๋ฆฌ ์ ๋ฆฌ ํจ์ - ๊ธด ์์
ํ ๋ฉ๋ชจ๋ฆฌ ์ ๋ฆฌ์ ์ฌ์ฉ
|
| 105 |
+
"""
|
| 106 |
+
try:
|
| 107 |
+
# ๊ฐ๋น์ง ์ปฌ๋ ์
๊ฐ์ ์คํ
|
| 108 |
+
collected = gc.collect()
|
| 109 |
+
logger.debug(f"๊ฐ๋น์ง ์ปฌ๋ ์
์คํ: {collected}๊ฐ ๊ฐ์ฒด ์์ง")
|
| 110 |
+
|
| 111 |
+
# ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๋ก๊น
(๊ฐ๋ฅํ ๊ฒฝ์ฐ)
|
| 112 |
+
if psutil:
|
| 113 |
+
process = psutil.Process(os.getpid())
|
| 114 |
+
memory_usage = process.memory_info().rss / 1024 / 1024 # MB ๋จ์
|
| 115 |
+
logger.debug(f"ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋: {memory_usage:.2f} MB")
|
| 116 |
+
except Exception as e:
|
| 117 |
+
logger.error(f"๋ฉ๋ชจ๋ฆฌ ์ ๋ฆฌ ์ค ์ค๋ฅ ๋ฐ์: {str(e)}")
|