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.
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.
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:
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:
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:
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.
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:
Para ver outros parâmetros, veja:
Para ver as que estão ativadas, no momento, use o comando:
# emerge --info | grep ^FEATURES=
Saída:
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:
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:
As outras foram selecionadas automaticamente com base no meu perfil.
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.
Para saber o número de núcleos do processador, use:
# grep "processor" /proc/cpuinfo | wc -l
Acrescente 1, e adicione à variável.
Abraço.
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}"
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.
Brincadeirinha! bom artigo, parabéns.