Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
Commit
·
80a3544
1
Parent(s):
1c5ef91
Improve Docker container memory monitoring with cgroup v1/v2 support and better logging
Browse files- utils/system_monitor.py +63 -19
utils/system_monitor.py
CHANGED
@@ -32,31 +32,75 @@ def get_memory_usage() -> Dict[str, Any]:
|
|
32 |
# Pas de limite cgroup lisible
|
33 |
pass
|
34 |
|
35 |
-
#
|
36 |
-
|
37 |
|
38 |
-
#
|
39 |
-
|
|
|
40 |
|
41 |
-
#
|
42 |
-
|
43 |
-
if total_memory > 100 * (1024**3): # Si la valeur semble trop élevée (>100GB)
|
44 |
-
# Force la valeur à 32GB pour le conteneur Hugging Face
|
45 |
-
total_memory = 32 * (1024**3) # 32 GB en octets
|
46 |
|
47 |
-
|
48 |
-
|
49 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
50 |
|
51 |
-
#
|
52 |
-
|
53 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
54 |
|
55 |
# Calculer les pourcentages
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
|
|
|
|
|
|
60 |
|
61 |
# Convertir les bytes en Mo pour être plus lisible
|
62 |
memory_info = {
|
|
|
32 |
# Pas de limite cgroup lisible
|
33 |
pass
|
34 |
|
35 |
+
# Déterminer la mémoire totale pour Hugging Face Spaces (32GB)
|
36 |
+
total_memory = 32 * (1024**3) # 32 GB en octets fixe pour Hugging Face
|
37 |
|
38 |
+
# Essayer une approche plus directe pour les conteneurs Docker
|
39 |
+
docker_memory_used = None
|
40 |
+
memory_source = "unknown"
|
41 |
|
42 |
+
# Log du début de la tentative de lecture
|
43 |
+
logger.info("Tentative de lecture des informations de mémoire Docker...")
|
|
|
|
|
|
|
44 |
|
45 |
+
try:
|
46 |
+
# Lire la mémoire utilisée directement depuis les stats cgroup v1
|
47 |
+
cgroup_path = '/sys/fs/cgroup/memory/memory.usage_in_bytes'
|
48 |
+
with open(cgroup_path, 'r') as f:
|
49 |
+
docker_memory_used = int(f.read().strip())
|
50 |
+
memory_source = f"cgroup v1 ({cgroup_path})"
|
51 |
+
logger.info(f"Mémoire Docker lue depuis {memory_source}: {docker_memory_used / (1024*1024):.2f} Mo")
|
52 |
+
except (IOError, FileNotFoundError) as e:
|
53 |
+
logger.info(f"Impossible de lire depuis cgroup v1: {e}")
|
54 |
+
try:
|
55 |
+
# Essayer le chemin cgroup v2
|
56 |
+
cgroup_path = '/sys/fs/cgroup/memory.current'
|
57 |
+
with open(cgroup_path, 'r') as f:
|
58 |
+
docker_memory_used = int(f.read().strip())
|
59 |
+
memory_source = f"cgroup v2 ({cgroup_path})"
|
60 |
+
logger.info(f"Mémoire Docker lue depuis {memory_source}: {docker_memory_used / (1024*1024):.2f} Mo")
|
61 |
+
except (IOError, FileNotFoundError) as e:
|
62 |
+
logger.info(f"Impossible de lire depuis cgroup v2: {e}")
|
63 |
+
# Utiliser le RSS du processus Python comme approximation
|
64 |
+
docker_memory_used = psutil.Process().memory_info().rss
|
65 |
+
memory_source = "RSS du processus Python"
|
66 |
+
logger.info(f"Mémoire utilisée approximative depuis {memory_source}: {docker_memory_used / (1024*1024):.2f} Mo")
|
67 |
+
|
68 |
+
# Si nous n'avons pas pu lire directement la mémoire du conteneur
|
69 |
+
# Utiliser les informations du système mais avec une correction
|
70 |
+
virtual_memory = psutil.virtual_memory()
|
71 |
|
72 |
+
# Utiliser la valeur Docker si disponible, sinon utiliser une approximation
|
73 |
+
# Dans Hugging Face Spaces, la vraie mémoire utilisée est généralement plus proche
|
74 |
+
# de la mémoire RSS du processus Python
|
75 |
+
logger.info(f"Informations psutil - total: {virtual_memory.total / (1024*1024):.2f} Mo, utilisé: {virtual_memory.used / (1024*1024):.2f} Mo")
|
76 |
+
|
77 |
+
if docker_memory_used:
|
78 |
+
used_memory = docker_memory_used
|
79 |
+
logger.info(f"Utilisation de la mémoire depuis {memory_source}")
|
80 |
+
else:
|
81 |
+
# Approche conservatrice: utiliser 10% du total rapporté par psutil ou la mémoire RSS
|
82 |
+
# Cela correspond mieux à ce que HF affiche typiquement
|
83 |
+
process_rss = psutil.Process().memory_info().rss
|
84 |
+
psutil_adjusted = virtual_memory.used * 0.10
|
85 |
+
used_memory = max(process_rss, psutil_adjusted)
|
86 |
+
|
87 |
+
logger.info(f"Utilisation de la mémoire estimée - RSS: {process_rss / (1024*1024):.2f} Mo, psutil ajusté: {psutil_adjusted / (1024*1024):.2f} Mo")
|
88 |
+
memory_source = "estimation (max de RSS et psutil ajusté)"
|
89 |
+
|
90 |
+
# S'assurer que la mémoire utilisée ne dépasse pas le total
|
91 |
+
used_memory = min(used_memory, total_memory)
|
92 |
+
|
93 |
+
# Calculer la mémoire disponible
|
94 |
+
available_memory = total_memory - used_memory
|
95 |
|
96 |
# Calculer les pourcentages
|
97 |
+
percent_used = (used_memory / total_memory) * 100 if total_memory > 0 else 0
|
98 |
+
|
99 |
+
# Log des résultats finaux
|
100 |
+
logger.info(f"Mémoire totale: {total_memory / (1024*1024):.2f} Mo (fixée à 32 Go)")
|
101 |
+
logger.info(f"Mémoire utilisée: {used_memory / (1024*1024):.2f} Mo (source: {memory_source})")
|
102 |
+
logger.info(f"Mémoire disponible: {available_memory / (1024*1024):.2f} Mo")
|
103 |
+
logger.info(f"Pourcentage utilisé: {percent_used:.1f}%")
|
104 |
|
105 |
# Convertir les bytes en Mo pour être plus lisible
|
106 |
memory_info = {
|