• “statprof” – Amostragem de tracebacks: • Estatísticas por linha – Informação mais relevante que “cProfile” • “line_profiler” • Mas ainda não “contam a estória”
– Chave: thread id (int) • Mesmo que thread.get_ident() em cada thread – Valor: Top Stack Frame • Executando agora nessa thread • Topo da pilha de thread
Frame? • Imprimir todo o stack de uma thread >>> import traceback >>> traceback.print_stack(frame) File "[...]/bin/ipython", line 9, in <module> load_entry_point('ipython==0.13.2', 'console_scripts', 'ipython')() File "[...]/terminal/ipapp.py", line 389, in launch_new_instance app.start() [...] File "[...]/core/interactiveshell.py", line 2745, in run_code return outflag File "<ipython-input-5-f0e996c7314a>", line 1, in <module> frame = sys._current_frames()[thread_id]
e monitora cada requisição • Logfile: – Request X, thread Y, running for T seconds • Request Info • Stack trace – Request X, thread Y, running for T+2 seconds • Request Info • Stack trace – [...]
“T-Shirt Custom Printing company” • ERP5: ERP da Nexedi, em Zope • MRP, CRM, Contabilidade, ... • Picos de performance muito ruim • Nunca na mesma URL duas vezes • Sempre na “hora do rush”
Grande portal governamental • LongRequestLogger: – Lentidão em horários específicos – Culpado: gargalo no acesso ao banco – Na hora do backup • Sobrecarga na interface de rede
entre o frio e o quente • Stack Trace em Tx – A • B(...) – B • C(...) – C • D(...) – D • E(...) – E • F(...) • Stack Trace em Tx + 2 – A • B(...) – B • C(...) – C • G(...) – G • H(...) – H • I(...)