
Profiling sem reiniciar o processo: o Tachyon do Python 3.15
O endpoint de relatório está com p95 acima de dois segundos, o painel de latência está vermelho desde cedo e no canal do time alguém já perguntou se rodaram o profiler. Em Profiling em Python: Encontrando Gargalos com cProfile e memory_profiler eu mostrei o caminho tradicional, e ele tem um detalhe que só incomoda de verdade em produção. Para usar o cProfile, você precisa subir o processo de novo, já com o profiler ligado. Isso significa derrubar o serviço que está exibindo o problema, perder o estado que o reproduz (cache aquecido, pool cheio, o padrão de carga daquela hora) e torcer para a lentidão voltar enquanto você observa. O Python 3.15 resolve esse problema na biblioteca padrão. A PEP 799 criou o pacote profiling, e dentro dele veio o profiling.sampling, apelidado de Tachyon. É um profiler de amostragem que se conecta a um processo Python que já está rodando, pelo PID, sem alterar uma linha de código e sem reiniciar nada. Eu montei um serviço com um gargalo realista para testar, e o profiler me ensinou mais de uma coisa no caminho, inclusive uma em que o resultado mais “rigoroso” era o errado. Todos os comandos e saídas abaixo foram rodados no Python 3.15.2. O serviço É uma API pequena, só com a biblioteca padrão, que monta um relatório de pedidos de um cliente consolidado por SKU. Os dados ficam num SQLite com 80 mil pedidos (8 mil por cliente, cerca de 2 mil SKUs distintos), e o servidor é um ThreadingHTTPServer, ou seja, cada requisição roda na sua própria thread. ...