Profiling sem reiniciar o processo: o Tachyon do Python 3.15

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. ...

14 de novembro de 2026 · 16 min · 3231 words · Riverfount
asyncio.TaskGroup: quando gather não é suficiente

asyncio.TaskGroup: quando gather não é suficiente

Um endpoint de checkout dispara três operações concorrentes com asyncio.gather: cobra o cartão, reserva o estoque, envia a notificação de confirmação do pedido. O serviço de pagamento cai no meio da chamada e lança uma exceção. gather propaga esse erro imediatamente para quem está aguardando. O handler captura a exceção, devolve um 500 para o cliente, registra a falha no log. Para quem está de plantão, o sistema reagiu do jeito certo. ...

12 de agosto de 2026 · 7 min · 1351 words · Riverfount
Por que a aplicação travava mesmo com queries rápidas

Por que a aplicação travava mesmo com queries rápidas

O profiling não encontrou nada. As queries estão com índice, rodam em menos de 5ms, e o cache eliminou as buscas repetidas. Mas sob carga — dez, vinte requisições simultâneas — a aplicação trava. Requisições acumulam na fila, o tempo de resposta explode, e o log mostra um erro que parece absurdo: TimeoutError: QueuePool limit of size 5 overflow 10 reached. O banco de dados não está sobrecarregado. As queries são rápidas. O problema está entre a aplicação e o banco — no pool de conexões que ninguém configurou. ...

5 de maio de 2026 · 9 min · 1717 words · Riverfount