Um pouco sobre otimização

Este artigo é uma introdução sobre otimização para usuários que pretendem usar distribuições GNU/Linux de compilação, com foco em Funtoo e Gentoo.

[ Hits: 4.706 ]

Por: Xerxes Lins em 15/09/2014 | Blog: https://voidlinux.org/


Introdução



Parte distintiva de distribuições de compilação (source- based) é seu grande nível de flexibilidade e configuração. Mesmo assim, qual seria o sentido em usar uma distribuição de compilação, se não configurarmos a mesma para otimizar o uso do nosso hardware? Este artigo é uma introdução sobre otimização para usuários que pretendem usar esse tipo de distribuição. O foco são as distribuições Funtoo e Gentoo.

AVISO: se você acha inútil, por qualquer motivo que seja, usar distribuição de compilação, por favor se exima de deixar um comentário do tipo "pra que fazer isso?", pois este artigo, evidentemente, não é voltado para você. Distribuições de compilação, pelo menos para mim, são divertidas, e isso é motivo suficiente para eu querer usá-las. Admiro o Linux pelo que de fato ele é, um kernel, e não como distribuição, pois distribuições envolvem tão somente gosto pessoal, e não entro mais nesse tipo de discussão. Obrigado pela atenção. Pode ser que amanhã eu desista de usar Funtoo, e use Debian, Slackware, ou Ubuntu. Mas hoje estou curtindo a experiência de usar Funtoo e o artigo é para quem também curte.

Reconhecendo o hardware

Três comandos básicos para reconhecermos o nosso hardware:

Comando 1: lspci

Como o nome do comando deixa claro "list all PCI devices", ou seja, "lista todos os dispositivos PCI".

Não vou me aprofundar no tema, mas para quem não sabe, PCI é um tipo de barramento onde se conectam os periféricos à placa-mãe. Sim, executar o comando "lspci" significa que você está pedindo uma listagem de tudo o que está conectado à placa-mãe pelo barramento PCI.

Exemplo de saída:

0:00.0 Host bridge: Intel Corporation Core Processor 
DRAM Controller (rev 02)
00:02.0 VGA compatible controller: Intel Corporation Core 
Processor Integrated Graphics 
Controller (rev 02)
00:16.0 Communication controller: Intel Corporation 5 
Series/3400 Series Chipset HECI 
Controller (rev 06)
00:1a.0 USB controller: Intel Corporation 5 Series/3400 
Series Chipset USB2 Enhanced Host 
Controller (rev 05)
00:1b.0 Audio device: Intel Corporation 5 Series/3400 
Series Chipset High Definition Audio (rev 
05)
00:1c.0 PCI bridge: Intel Corporation 5 Series/3400 Series 
Chipset PCI Express Root Port 1 (rev 
05)
00:1c.1 PCI bridge: Intel Corporation 5 Series/3400 Series 
Chipset PCI Express Root Port 2 (rev 
05)
00:1c.2 PCI bridge: Intel Corporation 5 Series/3400 Series 
Chipset PCI Express Root Port 3 (rev 
05)
00:1c.4 PCI bridge: Intel Corporation 5 Series/3400 Series 
Chipset PCI Express Root Port 5 (rev 
05)
00:1d.0 USB controller: Intel Corporation 5 Series/3400 
Series Chipset USB2 Enhanced Host 
Controller (rev 05)
00:1e.0 PCI bridge: Intel Corporation 82801 Mobile PCI 
Bridge (rev a5)
00:1f.0 ISA bridge: Intel Corporation Mobile 5 Series 
Chipset LPC Interface Controller (rev 05)
00:1f.2 SATA controller: Intel Corporation 5 Series/3400 
Series Chipset 6 port SATA AHCI 
Controller (rev 05)
00:1f.3 SMBus: Intel Corporation 5 Series/3400 Series 
Chipset SMBus Controller (rev 05)
00:1f.6 Signal processing controller: Intel Corporation 5 
Series/3400 Series Chipset Thermal 
Subsystem (rev 05)
12:00.0 Network controller: Broadcom Corporation 
BCM4313 802.11bgn Wireless Network 
Adapter (rev 01)
13:00.0 Ethernet controller: Qualcomm Atheros AR8152 
v2.0 Fast Ethernet (rev c1)
ff:00.0 Host bridge: Intel Corporation Core Processor 
QuickPath Architecture Generic Non-core 
Registers (rev 02)
ff:00.1 Host bridge: Intel Corporation Core Processor 
QuickPath Architecture System Address 
Decoder (rev 02)
ff:02.0 Host bridge: Intel Corporation Core Processor QPI 
Link 0 (rev 02)
ff:02.1 Host bridge: Intel Corporation Core Processor QPI 
Physical 0 (rev 02)
ff:02.2 Host bridge: Intel Corporation Core Processor 
Reserved (rev 02)
ff:02.3 Host bridge: Intel Corporation Core Processor 
Reserved (rev 02)


Comando 2: cat /proc/cpuinfo

Mostra informações sobre o processador.

Comando 3: cat /proc/meminfo

Mostra informações sobre a memória.

Com isso dá para termos uma boa ideia da "matéria- prima" necessária para realizar a compilação adequada de um kernel. Os parâmetros "-v" ou "-vv" do comando "lspci", mostram informações mais detalhadas ainda.

Supondo que você esteja compilando o kernel, qual driver de rede deve habilitar? Qual tipo de processador? Qual driver de vídeo? É por isso que esses comandos tem sua importância.

Porém, eu não sou perfeccionista e nem tenho conhecimento para saber o que cada uma das CENTENAS de opções do kernel significam na prática. No entanto, a escolha da família do processador é de suma importância. Outra opção importante é o SMP (Symmetric multi- processing), que deve ser habilitado para permitir o uso dos vários processadores pelo kernel. Como diz a descrição do mesmo:

"This enables support for systems with more than one CPU. If you have a system with only one CPU, say N. If you have a system with more than one CPU, say Y."

Esta primeira parte sobre o kernel teve o objetivo apenas de ilustrar um ponto que é importante no quesito otimização, mas que não exige, necessariamente, muito trabalho. Pelo menos na distribuição Funtoo, criada para ser simples, há uma série de opções de kerneis disponíveis para download. O manual oficial de instalação, inclusive, recomenda o uso do kernel Debian universal, que embora leve um pouco de tempo para ser instalado, deixa a máquina pronta para uso. Depois disso, o usuário pode enxugar o kernel aos poucos, refiná-lo, desabilitando o que não precisa para o seu hardware. Não é por nada que eu chamo Funtoo de "distro bonsai", que exige tempo, dedicação e paciência enquanto o usuário lentamente vai dando uma aparada aqui, outra ali e arredondando o sistema aos poucos.

Há uma dica de como instalar o kernel Debian no Funtoo:

CFLAGS e CXXFLAGS

O arquivo make.conf, do gerenciador Portage, exige a definição dessas duas opções (CFLAGS e CXXFLAGS). São variáveis usadas pelo "GNU Compiler Collection" (GCC). O GCC É um compilador, ou um sistema de compilação, criado pela tão desprezada fundação GNU.

As pessoas esquecem que Linux é um sistema operacional, cujo papel é fazer o seu hardware funcionar, mas sem ferramentas e outros programas, como o GCC, os aplicativos não funcionam! Por isso muitos usuários insistem em usar o termo GNU/Linux, ao invés de apenas Linux. Já que o sistema e suas ferramentas andam juntas. Mas isso é outro assunto.

Tá, mas o que é um compilador? Bem rápido e impreciso, mas suficiente por agora: é um sistema que lê o código de um programa, escrito em linguagem de programação, e traduz o código para linguagem de máquina, para que o computador possa entendê-lo.

CFLAGS diz respeito à linguagem C, e CXXFLAGS diz respeito à linguagem C++.

O principal objetivo de configurar essas duas variáveis é fazer o GCC trabalhar de forma mais eficiente.

Quer saber a lista completa de opções para essas variáveis? Então veja:
Agora que você viu a lista, me responda se existe algum "guru" no universo GNU/Linux capaz de usar essas opções SEM consultar um manual. Eu duvido. É por isso que distribuições de compilação como Gentoo são bem documentadas. Se não, ninguém usa! Vamos ver o que o manual do Gentoo diz sobre isso:
Se você viu, então ficou claro que a opção mais simples é usar:

CFLAGS="-march=native -O2 -pipe"
CXXFLAGS="${CFLAGS}"

Pois assim, o tipo de processador será detectado automaticamente ("-march=native"). A opção "-O2" otimiza ainda mais (se quiser detalhes, veja aqui), e "-pipe" acelera o processo de compilação usando arquivos temporários.

O uso de variáveis é algo prático. Você não precisa repetir os parâmetros de CFLAGS em CXXFLAGS, basta usar "${CFLAGS}", que quer dizer o mesmo.

Outra opção que pode ser usada é "-fomit-frame-pointer", que reduz o tamanho do código, mas torna mais difícil debugar a compilação. É o que diz aqui:
E aqui:
Obs.: fiz esse artigo com base em Funtoo, mas então por que estou usando documentação de Gentoo? Eu estou usando a distribuição Funtoo, mas como Gentoo e Funtoo são distribuições do mesmo criador, e Funtoo é baseado em Gentoo (Gentoo melhorado), a documentação de Gentoo quase toda serve para Funtoo. Como Funtoo é uma distribuição mais nova, tem pouca documentação oficial.

Próxima variável: CHOST

Essa variável especifica ao GCC em que tipo de máquina o código será construído. Ela tem um valor dividido em 4 campos: arquitetura, plataforma, sistema operacional e biblioteca C. Apenas o primeiro campo é obrigatório. Você pode definir o CHOST apenas como, por exemplo: x86_64. Fim.

Mas estamos falando de uma distribuição de compilação, e não uma distribuição genérica. O sentido de usar uma distribuição dessas é especificar detalhes em busca de um melhor "encaixe" entre sistema e hardware. O normal seria deixar assim, por exemplo:

CHOST="x86_64-pc-linux-gnu"

Para ver outros parâmetros, veja:

FEATURES

Existe uma série de melhorias ou opções que podem ser especificadas no make.conf, são as FEATURES. Para vê-las consulte o manual do Portage.

Para ver as que estão ativadas, no momento, use o comando:

# emerge --info | grep ^FEATURES=

Saída:

FEATURES="assume-digests binpkg-logs clean-logs 
collision-protect config-protect-if-modified 
distlocks ebuild-locks fail-clean fixlafiles merge-sync news 
parallel-fetch preserve-libs protect-
owned sandbox sfperms strict unknown-features-warn 
unmerge-logs unmerge-orphans 
userfetch xattr"


Mas eu não especifiquei todas elas no arquivo make.conf. Elas são determinadas, também, pela escolha do "profile" (perfil) durante a configuração do sistema. Para ver os profiles atuais use o comando:

# eselect profile show

Saída:

Currently set profiles:
    arch: gentoo:funtoo/1.0/linux-gnu/arch/x86-64bit
   build: gentoo:funtoo/1.0/linux-gnu/build/current
  flavor: gentoo:funtoo/1.0/linux-gnu/flavor/desktop
 mix-ins: gentoo:funtoo/1.0/linux-gnu/mix-ins/xfce

Automatically enabled profiles:
 mix-ins: gentoo:funtoo/1.0/linux-gnu/mix-ins/print
 mix-ins: gentoo:funtoo/1.0/linux-gnu/mix-ins/X
 mix-ins: gentoo:funtoo/1.0/linux-gnu/mix-ins/audio
 mix-ins: gentoo:funtoo/1.0/linux-gnu/mix-ins/dvd
 mix-ins: gentoo:funtoo/1.0/linux-gnu/mix-ins/media
 mix-ins: gentoo:funtoo/1.0/linux-gnu/mix-ins/console-
extras


O uso de perfis facilita a configuração do sistema, pois automatiza a escolha de FEATURES do Portage e também de FLAGS que não estão explícitas no arquivo make.conf.

As únicas FEATURES que eu especifiquei no make.conf foram:

FEATURES="clean-logs parallel-fetch collision-protect fail- clean"


  • clean-logs - apaga os logs com mais de 7 dias, por padrão.
  • parallel-fetch - manda a saída de busca ou download para background, enquanto compila.
  • collision-protect - evita que um aplicativo não substitua arquivos que não são seus.
  • fail-clean - limpa arquivos temporários quando uma compilação falha.

As outras foram selecionadas automaticamente com base no meu perfil.

ACCEPT_KEYWORDS

Define o nível de estabilidade do sistema, pela arquitetura. Por exemplo: se usar "amd64", estará se referindo aos pacotes estáveis e se usar "~amd64", os pacotes instáveis serão aceitos.

Essa informação não tem necessariamente a ver com otimização, mas como precisa da definição do processador, torna-se interessante defini-la de forma consciente.

MAKEOPTS

Se refere ao número de processos em paralelo que serão divididos entre os núcleos do processador durante a compilação. O manual oficial do Funtoo recomenda definir o número de processadores +1. Exemplo:

MAKEOPTS="-j5"

Para saber o número de núcleos do processador, use:

# grep "processor" /proc/cpuinfo | wc -l

Acrescente 1, e adicione à variável.

Conclusão

Com certeza isso não encerra o assunto em questão, longe disso. Mas acredito que serviu como uma introdução aos usuários que estão querendo usar a distribuição Funtoo. Digo isso, pois me coloco no lugar daqueles que apreciariam ter alguma informação sobre o tema, um incentivo, mas sentem dificuldade em encontrar. Como sou usuário recente em Funtoo, peço que por gentileza me corrijam caso tenha cometido algum deslize. Os links que recomendo e que usei para este artigo estão descritos no corpo do texto.

Abraço.

   

Páginas do artigo
   1. Introdução
Outros artigos deste autor

Tem Facebook? Então tem Joli OS

Curiosidades e mitos sobre Slackware

Mamãe, quero Arch! (parte 1)

Distros para quem ama a liberdade

Incentivo ao Funtoo

Leitura recomendada

Configurando o TIM WEB - HUAWEI E220

PHP5 + Apache2 no Ubuntu 7.04, com suporte ao MySQL e SQL Server

CentOS - Pós-instalação básica

Erro no KDM (temas) depois de update no Sabayon

Como gerenciar usuários e grupos

  
Comentários
[1] Comentário enviado por px em 15/09/2014 - 10:03h

Mas... pra que fazer isto? kkkk

Brincadeirinha! bom artigo, parabéns.

[2] Comentário enviado por ednux em 15/09/2014 - 12:33h

Bom artigo. Apesar de não ser muito abrangente na compilação do Kernel, abre um leque de opções.

Eu não sabia que era possível otimizar tão a fundo assim um sistema GNU/Linux
e muto menos que a suit GNU era a responsável por "ligar os pontos"...

De fato, com o passar dos anos um sistema já não fica tão rapido quanto costumava ser,
dai a necesssidade de otimizar um kernel para determinado hardware.

Se algum dia eu for experimentar isso, esse tal Funtoo será minha primeira opção. xD

[3] Comentário enviado por moisespedro em 15/09/2014 - 13:56h

Bons links sobre o assunto: http://wiki.gentoo.org/wiki/GCC_optimization e http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#Optimize-Options

E tem esse aqui pra descontrair https://forums.gentoo.org/viewtopic-t-309752.html

[4] Comentário enviado por albfneto em 15/09/2014 - 16:57h

Excelente artigo. mais um favoritado,
eu uso assim também, conheço o assunto do artigo, mas favoritei
vai ajudar muitos usuários a editar make.conf e compilar kernel.

[5] Comentário enviado por xerxeslins em 15/09/2014 - 22:15h


[1] Comentário enviado por px em 15/09/2014 - 10:03h:

Mas... pra que fazer isto? kkkk

Brincadeirinha! bom artigo, parabéns.


kkkkkk! acabei colocando esse aviso porque imaginei alguém entrando nesse tipo de discussão, como aconteceu no artigo do exherbo.

rsrs

[6] Comentário enviado por xerxeslins em 15/09/2014 - 22:16h


[2] Comentário enviado por ednux em 15/09/2014 - 12:33h:

Bom artigo. Apesar de não ser muito abrangente na compilação do Kernel, abre um leque de opções.

Eu não sabia que era possível otimizar tão a fundo assim um sistema GNU/Linux
e muto menos que a suit GNU era a responsável por "ligar os pontos"...

De fato, com o passar dos anos um sistema já não fica tão rapido quanto costumava ser,
dai a necesssidade de otimizar um kernel para determinado hardware.

Se algum dia eu for experimentar isso, esse tal Funtoo será minha primeira opção. xD


Valeu!

Falei pouco sobre o kernel porque não tenho intimidade com ele. Conheço pouco sobre configuração de kernel.

Abraço!

[7] Comentário enviado por xerxeslins em 15/09/2014 - 22:17h


[3] Comentário enviado por moisespedro em 15/09/2014 - 13:56h:

Bons links sobre o assunto: http://wiki.gentoo.org/wiki/GCC_optimization e http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#Optimize-Options

E tem esse aqui pra descontrair https://forums.gentoo.org/viewtopic-t-309752.html


Gostei! depois vou ler com calma esse último.


[8] Comentário enviado por xerxeslins em 15/09/2014 - 22:18h


[4] Comentário enviado por albfneto em 15/09/2014 - 16:57h:

Excelente artigo. mais um favoritado,
eu uso assim também, conheço o assunto do artigo, mas favoritei
vai ajudar muitos usuários a editar make.conf e compilar kernel.


Obrigado albfneto.

Como viu, é bem simples, mas acho que pro iniciante ajuda muito.

[9] Comentário enviado por Morvan em 16/09/2014 - 16:21h

Boa tarde.

Excelente artigo. Para o pessoal noviço, fonte de informação valiosa. Para os veteranos, ajuda muito, pois, às vezes, mesmo sabendo destas diretivas, acabamos fazendo compilação pesada no default.

Dica para definir, via script, MAKEOPTS, a partir da sugestão do XerxesLins:

!#/bin/sh
nuc=`cat /proc/cpuinfo | grep -i cores | cut -f2 -d: | sort -bu`
numop=`expr $nuc + 1`
MAKEOPTS="-j"$numop
# para testar, echo $MAKEOPTS

Este script pode ser invocado sempre que se for fazer compilação demorada e | ou que requeira otimização.

Morvan, Usuário Linux #433640. Seja Legal; seja Livre. Use Linux.

[10] Comentário enviado por fabio em 21/09/2014 - 19:58h

Mais um excelente artigo Xerxes. Que emoção!

Me confirma se recebeu o comentário tudo certinho. Obrigado.

[11] Comentário enviado por xerxeslins em 21/09/2014 - 22:10h


[10] Comentário enviado por fabio em 21/09/2014 - 19:58h:

Mais um excelente artigo Xerxes. Que emoção!

Me confirma se recebeu o comentário tudo certinho. Obrigado.


Recebido.


Contribuir com comentário