Otimização guiada

Otimizações guiadas por perfil aumentam desempenho no Ubuntu em até 7%

Wallpaper com logo do Ubuntu centralizado com fundo laranja

Nos últimos anos, a Canonical intensificou esforços para otimizar o desempenho do Ubuntu Linux. Além da adoção do nível de otimização -O3 no compilador, a Canonical explora o uso de Otimizações Guiadas por Perfil (PGO), técnica que promete ganhos significativos de desempenho em tarefas específicas. Um estudo recente mostra como o uso de PGO em pacotes RISC-V emulados no QEMU trouxe melhorias de até 7% no tempo de compilação e uso de CPU.

Para mais detalhes, acesse o estudo completo no blog da Canonical.

O que é PGO e como funciona?

A PGO utiliza dados de execução de programas para otimizar seu desempenho. O processo envolve:

  1. Compilação inicial com instrumentação: O binário gera um perfil de uso quando executado.
  2. Uso do perfil pelo compilador: O perfil orienta o compilador em uma nova construção, otimizando o código com base em cenários reais de execução.

Embora eficaz, a PGO enfrenta desafios, como a dificuldade em criar perfis que representem cenários reais e a sobrecarga de instrumentação inicial. Ferramentas como o perf, no entanto, permitem observar binários de maneira não invasiva, tornando a técnica mais viável para produção.

Como isso beneficia o usuário comum?

Se você usa Ubuntu, pode estar se perguntando: “O que eu ganho com isso?” Aqui estão os principais benefícios, explicados de forma simples:

  1. Menor consumo de recursos: Com PGO, os programas usam menos CPU para realizar tarefas, o que pode reduzir o aquecimento do computador e prolongar a vida útil dos componentes.
  2. Execução mais rápida: Tarefas como abrir um aplicativo, compilar um programa ou processar dados podem ser concluídas mais rapidamente.
  3. Eficiência energética: Menos uso de CPU significa menor consumo de energia, algo importante tanto para quem usa laptops quanto para servidores.

Embora os ganhos sejam mais visíveis em tarefas específicas, como a compilação de pacotes, essa abordagem ajuda a tornar o sistema mais eficiente em geral.

Estudo de caso: otimização de QEMU para RISC-V

O estudo focou no uso do QEMU para emular ambientes RISC-V na infraestrutura de compilação da Canonical. Esses ambientes, baseados em máquinas AMD64, são usados diariamente para construir pacotes da arquitetura RISC-V no Ubuntu. O objetivo foi otimizar o QEMU usando PGO e medir os impactos no desempenho.

Explicando o processo passo a passo:

  1. Coleta de dados com perf: O QEMU foi monitorado para entender como ele usa os recursos do computador durante a compilação.
  2. Análise de pacotes representativos: Foram escolhidos pacotes populares e variados (como Python e OpenSSL) para testar os ganhos.
  3. Aplicação das otimizações: Os dados coletados ajudaram a criar uma versão mais eficiente do QEMU.
  4. Comparação de resultados: Foram medidos o tempo de execução e o uso de CPU antes e depois das otimizações.

Metodologia

A coleta de dados foi realizada com o perf, e os arquivos gerados foram convertidos para o formato gcov utilizando o autofdo. A equipe escolheu pacotes representativos para construir e gerar dados, incluindo:

  • OpenSSL (C)
  • GDB (C++)
  • Emacs (C e Elisp)
  • Python 3.12 (C e Python)

Os testes mediram o tempo de compilação e a utilização média de CPU em cinco construções de cada pacote, comparando os resultados com e sem PGO.

Resultados

Os resultados mostram melhorias consistentes no tempo de compilação e no uso de CPU:

  1. OpenSSL:
Gráfico comparativo de análise de construção do OpenSSL. Evidencia uma melhoria de 5.26% na utilização de CPU e 5.47% no tempo de construção com PGO, em contraste com non-PGO.
  • Tempo de compilação: -5.47%
  • Utilização de CPU: -5.26%
  1. GDB:
Gráfico comparativo de análise de construção do GDB. Apresenta uma redução de 5.50% na utilização de CPU e 5.66% no tempo de construção ao aplicar PGO em relação ao non-PGO.
  • Tempo de compilação: -5.66%
  • Utilização de CPU: -5.50%
  1. Emacs:
Gráfico comparativo de análise de construção do Emacs. Demonstra uma melhoria de 5.71% na utilização de CPU e 6.72% no tempo de construção com PGO, em comparação com non-PGO.
  • Tempo de compilação: -6.72%
  • Utilização de CPU: -5.71%
  1. Python 3.12:
Gráfico comparativo de análise de construção do OpenSSL. Evidencia uma melhoria de 5.26% na utilização de CPU e 5.47% no tempo de construção com PGO, em contraste com non-PGO.
  • Tempo de compilação: -6.30%
  • Utilização de CPU: -5.23%

Esses ganhos, mesmo modestos, representam economia significativa em escala. Por exemplo, reduzir 5 minutos em um processo de 1 hora pode significar 2 horas economizadas por dia em compilações contínuas.

PGO: benefícios e limitações

Embora promissora, a PGO não é uma solução universal. O sucesso depende de:

  • Perfis representativos: Perfis inadequados podem até prejudicar o desempenho em cenários não otimizados.
  • Carga de trabalho específica: A PGO é mais eficaz em aplicações com padrões de uso previsíveis, como a construção de pacotes em ambientes controlados.

Por outro lado, a técnica pode ajudar desenvolvedores a identificar e corrigir gargalos em softwares complexos, onde ferramentas como perf top são úteis, mas insuficientes.

Para quem não usa QEMU e RISC-V: como isso pode ajudar no dia a dia?

Mesmo que você não use o QEMU ou o RISC-V diretamente, as melhorias mostram o potencial da PGO em softwares mais comuns. Aqui estão exemplos práticos:

  • Se você é programador e usa o Ubuntu, o tempo para compilar seus projetos pode ser reduzido.
  • Se você é um usuário doméstico, a otimização pode deixar aplicativos como navegadores e editores de texto mais ágeis no futuro.

Além disso, as técnicas usadas no estudo podem ser aplicadas a outros programas, ajudando a construir um ecossistema Linux mais eficiente.

Como aplicar pgo no seu projeto

Para explorar a PGO:

  1. Coleta de dados: Use ferramentas como perf para monitorar a execução do software.
  2. Conversão de perfis: Utilize utilitários como autofdo para adaptar os dados ao compilador.
  3. Análise de impacto: Avalie o impacto das otimizações em diferentes cenários.

A Canonical oferece documentação detalhada para ajudar na implementação.

A PGO trouxe melhorias de até 7% no desempenho do Ubuntu em tarefas específicas. Embora não seja aplicável a todos os cenários, é uma técnica poderosa para ambientes com padrões bem definidos. Explore essa abordagem para otimizar seus projetos e melhorar a eficiência operacional.

Gostou do artigo? Leia mais no blog oficial da Canonical.