alexfremont commited on
Commit
80a3544
·
1 Parent(s): 1c5ef91

Improve Docker container memory monitoring with cgroup v1/v2 support and better logging

Browse files
Files changed (1) hide show
  1. 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
- # Récupérer les informations de mémoire virtuelle
36
- virtual_memory = psutil.virtual_memory()
37
 
38
- # Déterminer la mémoire totale - utiliser la limite du conteneur si disponible
39
- total_memory = container_limit if container_limit else virtual_memory.total
 
40
 
41
- # Ajuster la valeur totale pour les environnements Hugging Face si toujours anormalement haute
42
- # Cette instance Hugging Face a 32 Go de RAM
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
- # Calculer les valeurs avec la mémoire totale ajustée
48
- used_memory = virtual_memory.used
49
- available_memory = min(virtual_memory.available, total_memory - used_memory)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
50
 
51
- # Vérifier pour plus de logique
52
- if available_memory < 0:
53
- available_memory = 0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
54
 
55
  # Calculer les pourcentages
56
- try:
57
- percent_used = (used_memory / total_memory) * 100 if total_memory > 0 else 0
58
- except ZeroDivisionError:
59
- percent_used = 0
 
 
 
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 = {