Fix too many open files issue#1443
Conversation
What This PR DoesThis PR implements graceful degradation for the profiling system to prevent monitoring failures from causing application outages. Specifically, it addresses an incident where Key behavior change: From "fail closed" (profiling errors crash the request) to "fail open" (profiling errors are silently handled, memory metrics marked unavailable). Business Impact
Core ChangesThe PR introduces four new helper functions that safely wrap memory metric collection: def _get_memory_usage_mb(process=None):
"""Returns RSS in MB or None if psutil fails"""
try:
if process is None:
process = psutil.Process()
return process.memory_info().rss / 1024 / 1024
except (OSError, psutil.Error) as exc:
profiling_logger.debug("Skipping profiling memory sample: %s", exc)
return None
def _get_memory_delta_mb(process, start_memory):
"""Safely calculates memory delta, returns None if either value unavailable"""
if start_memory is None:
return None
end_memory = _get_memory_usage_mb(process)
if end_memory is None:
return None
return end_memory - start_memory
def _format_memory_delta(memory_used):
"""Formats memory delta or returns 'unavailable' string"""
if memory_used is None:
return "unavailable"
return f"+{memory_used:.1f}MB"
def _is_high_memory(memory_used):
"""Safely checks if memory exceeded threshold"""
return memory_used is not None and memory_used > PROFILING_LOG_HIGH_MEMORYWhy this matters:
Other ChangesAll profiling decorators and middleware are updated to use these helpers:
Consistency: All 7 locations that read memory metrics now follow the same safe pattern. Merge Readiness and Risk Assessment✅ Strengths
|
O que esse PR faz?
Este PR corrige um problema em que falhas na coleta de métricas de memória pelo sistema de profiling resultavam em erro HTTP 500 para o usuário final.
A leitura de memória realizada por meio da biblioteca psutil foi centralizada em funções auxiliares seguras em core/utils/profiling_tools.py. Quando ocorre uma exceção como:
OSError: [Errno 24] Too many open files: '/proc/16/statm'
ERROR 2026-06-15 22:35:00,539 log 16 139626005938016 Internal Server Error: /api/v2/pid/pid_provider/
Traceback (most recent call last):
File "/usr/local/lib/python3.11/site-packages/django/core/handlers/exception.py", line 55, in inner
response = get_response(request)
^^^^^^^^^^^^^^^^^^^^^
File "/app/core/utils/profiling_tools.py", line 589, in call
File "/usr/local/lib/python3.11/site-packages/psutil/_common.py", line 461, in wrapper
File "/usr/local/lib/python3.11/site-packages/psutil/_common.py", line 459, in wrapper
File "/usr/local/lib/python3.11/site-packages/psutil/init.py", line 1139, in memory_info
File "/usr/local/lib/python3.11/site-packages/psutil/_pslinux.py", line 1638, in wrapper
File "/usr/local/lib/python3.11/site-packages/psutil/_pslinux.py", line 1921, in memory_info
File "/usr/local/lib/python3.11/site-packages/psutil/_common.py", line 764, in open_binary
OSError: [Errno 24] Too many open files: '/proc/16/statm'
durante a leitura de informações do processo (/proc//statm), o sistema passa a tratar a métrica de memória como indisponível (unavailable) e permite que a requisição continue normalmente.
Além disso:
O objetivo é evitar que uma falha de observabilidade/profiling impacte a disponibilidade da aplicação.
Onde a revisão poderia começar?
Recomenda-se iniciar a revisão pelo arquivo:
core/utils/profiling_tools.py
Principais alterações:
Como este poderia ser testado manualmente?
Cenário normal
Cenário de falha na coleta de memória
Algum cenário de contexto que queira dar?
Foi identificado um incidente em produção onde a aplicação retornava HTTP 500 devido a uma exceção originada no mecanismo de profiling:
OSError: [Errno 24] Too many open files: '/proc/16/statm'
ERROR 2026-06-15 22:35:00,539 log 16 139626005938016 Internal Server Error: /api/v2/pid/pid_provider/
Traceback (most recent call last):
File "/usr/local/lib/python3.11/site-packages/django/core/handlers/exception.py", line 55, in inner
response = get_response(request)
^^^^^^^^^^^^^^^^^^^^^
File "/app/core/utils/profiling_tools.py", line 589, in call
File "/usr/local/lib/python3.11/site-packages/psutil/_common.py", line 461, in wrapper
File "/usr/local/lib/python3.11/site-packages/psutil/_common.py", line 459, in wrapper
File "/usr/local/lib/python3.11/site-packages/psutil/init.py", line 1139, in memory_info
File "/usr/local/lib/python3.11/site-packages/psutil/_pslinux.py", line 1638, in wrapper
File "/usr/local/lib/python3.11/site-packages/psutil/_pslinux.py", line 1921, in memory_info
File "/usr/local/lib/python3.11/site-packages/psutil/_common.py", line 764, in open_binary
OSError: [Errno 24] Too many open files: '/proc/16/statm'
A exceção ocorria durante a leitura de métricas de memória via psutil, fazendo com que um componente de observabilidade interrompesse o processamento normal da requisição.
Este PR atua apenas como mecanismo de proteção (graceful degradation), impedindo que falhas de monitoramento provoquem indisponibilidade da aplicação.
Importante destacar que a causa raiz do erro (Too many open files) não é tratada neste PR e deve continuar sendo investigada. Possíveis causas incluem:
Screenshots
Não se aplica.
Quais são tickets relevantes?
Não há ticket associado no momento.
Referências
Obs.: o comportamento mudou de “fail closed” para “fail open”: se o profiling falhar, a aplicação continua atendendo a requisição. Isso deixa explícita a decisão arquitetural tomada e facilita a aprovação pelos revisores.