Eu encontrei uma regressão de desempenho ao executar o interpretador python ao atualizar do Ubuntu 18 para o Ubuntu 24. O que você acha que causa isso? Existe uma correção ou solução alternativa?
Tenho algumas evidências que sugerem que mudanças no kernel do Linux — e não em nada no ambiente do usuário — provavelmente são as responsáveis pelo problema.
Posso reproduzir a discrepância de desempenho com um teste muito simples:
python3 -c "import timeit; print(timeit.Timer('for _ in range(0,1000): pass').timeit())"
Estou executando este teste inicializando o servidor live do Ubuntu 18 e o servidor live do Ubuntu 24 ISOs no mesmo sistema de rack Cisco UCS C220 M5SX. Você pode encontrar os ISOs do servidor live no site da Canonical e reproduzir o experimento.
Tenho um conjunto de binários python 3.11 construídos a partir do código-fonte em um sistema squeeze debian que rodará em uma grande variedade de distros linux. Isso me dá a oportunidade de testar os mesmos binários python em 18 e 24. Chamaremos esses binários python de python_pegged. Chamaremos o python3 buscado por 'apt-get' python_sys.
Também tentei executar o contêiner docker ubuntu:18.04 de dentro do Ubuntu 24. Ele tem as características de desempenho ruim do Ubuntu 24 e não se comporta como o Ubuntu 18, o que me leva a acreditar que o userland não é responsável.
Resultados experimentais:
Ubuntu 18.04.6 bare metal python_sys 13 seconds
Ubuntu 18.04.6 bare metal python_pegged 13 seconds
Ubuntu 18.04.6 bare metal sysbench --test=cpu run 1288 events/s
Ubuntu 24.04 bare metal python_sys 83 seconds
Ubuntu 24.04 bare metal python_pegged 112 seconds
Ubuntu 24.04 bare metal sysbench --test=cpu run 925 events/s
ubuntu:18.04 docker container hosted by Ubuntu 24.04 python_sys 82 seconds
ubuntu:18.04 docker container hosted by Ubuntu 24.04 python_pegged 112 seconds
No Ubuntu 24, tomar as seguintes ações não teve efeito algum:
- defina scaling_governor para performance
- perfil tuned-adm throughput-performance
- perfil tuned-adm host virtual
- perfil tuned-adm balanceado
O sistema tem 40 núcleos físicos e 80 hyperthreaded. Tentei executar vários números de instâncias simultâneas.
concurrent instances seconds
40 82..83
80 53..53
120 87..115
Estou surpreso que 80 instâncias sejam mais rápidas do que 40. Eu executei o experimento algumas vezes e os resultados nunca mudaram. Eu tentei diferentes perfis ajustados sem efeito. 53 segundos ainda está muito longe dos 13 do ubuntu18.
python está tropeçando em algo caro com ubuntu24 que sysbench não está--ou pelo menos não no mesmo grau. Posso começar a usar um profiler em um futuro próximo para cavar mais fundo.
Testes de várias versões intermediárias indicam que a regressão ocorreu na atualização 21 -> 22.
perf stat -a resulta no comando python3:
Estado | Ubuntu 20 | Ubuntu 22 |
---|---|---|
relógio da cpu | 80% | 80% |
trocas de contexto | 0,003 K/seg (3829) | 6,656 / seg (45238) |
migrações de CPU | 0 K / seg (3) | 0,039 / seg (268) |
falhas de página | 0,001 K/seg (620) | 0,151 / seg (1029) |
ciclos | 0,047 GHz | 0,034 GHz |
instruções | 3,34 insn / ciclo | 0,88 insn / ciclo |
galhos | 30,703 M/seg | 5,329 M/seg |
erros de ramificação | 0,03% | 13,18% |
Algumas grandes diferenças aí. Não estou convencido de que 6 trocas de contexto por segundo realmente movam a agulha. Instruções por ciclo são presumivelmente o ponto de dados mais relevante aqui.