-O3
Agora veremos a variável -O. Esta variável controla o nível geral de otimização. Alterar esse valor fará com que a compilação do código demore mais e usará muito mais memória, especialmente à medida que o nível de otimização for aumentado.
Existem sete configurações -O: -O0, -O1, -O2, -O3, -Os, -Og e -Ofast. Devemos usar apenas um deles em
/etc/portage/make.conf.
Com exceção de -O0, as configurações -O ativam cada uma vários sinalizadores (flags) adicionais.
Segundo a wiki do Gentoo, -O3 é o maior nível de otimização possível. Ele permite otimizações que usam mais memória durante a compilação. Mesmo assim, compilar com -O3 não garante melhorar o desempenho e, em muitos casos, pode tornar o sistema lento devido a binários maiores e maior uso de memória. Parece ruim, não é? -O3 também é conhecido por quebrar vários pacotes. Usar -O3 não é recomendado! Mas veremos que ele pode ser usado, desde que com sabedoria.
Como vimos, o uso de otimização -O3 (a máxima possível) PODE criar problemas no sistema. Acredito que isso seja culpa do código do programa e não do compilador. Uma pessoa[1] resolveu fazer vários testes no Gentoo com o uso do -O3, LTO e Graphite. Após 8 meses de testes, ele conseguiu criar algo estável e deu a nós, meros usuários, o caminho das pedras para usarmos essas mesmas configurações de otimização com segurança, sem quebrar nada, pelo menos até agora.
[1]: Shane Peelar. Cientista da Computação (PhD) interessado em PNL, computação heterogênea, realidade virtual, engenharia reversa e jogos.
O procedimento está descrito no
overlay GentooLTO.
Assim que você entra na página do GentooLTO, se depara com a seguinte mensagem:
"Aviso: esta configuração não é para os fracos de coração. Provavelmente não é uma boa ideia usar isso em um sistema de produção!"
Mas qual seria a graça em usar o Gentoo sem um pouco de emoção? XD
Conforme o autor do overlay, quase 30% dos aplicativos no repositório do Gentoo não precisam dessa configuração! E ele acrescenta:
"No início de 2017, comecei a fazer um experimento, construindo o Gentoo usando o sinalizador do compilador GCC -O3. [É bem documentado na wiki do Gentoo que esta não é uma configuração recomendada, mas eu queria ver até que ponto as coisas quebrariam. Acontece que a maioria dos pacotes que não podem ser compilados com -O3 e serão forçados a compilar com -O2 de qualquer jeito nas próprias ebuilds, portanto, experimentei pouquíssimas falhas. Devido ao sucesso que tive com o uso -O3, decidi complicar um pouco mais as coisas, então adicionei a otimização graphite nessa mistura. Depois fui um pouco mais ousado e adicionei o LTO. Depois de cerca de oito meses fazendo isso, me senti bem com a minha configuração e decidi publicá-la para que os interessados possam vê-la."
Em resumo, para usar a configuração sugerida pelo overlay, primeiramente adicione o overlay "mv" e o "lto-overlay". Exemplo:
# layman -a mv
# layman -a lto-overlay
Usando o flaggie, libere as opções instáveis para os seguintes programas:
# flaggie sys-config/ltoize +~amd64
# flaggie app-portage/portage-bashrc-mv +~amd64
# falggie app-shells/runtitle +~amd64
Depois:
# emerge sys-config/ltoize
Você já deve ter percebido que o objetivo é criar um link nas configurações normais do Portage (make.conf) para que ele aplique as otimizações sem alterar o padrão. Para isso deixe o arquivo "make.conf" com o link para as configurações e com o número de processos em paralelo que irá usar. Por exemplo, o meu está assim (e com profile desktop):
# cat /etc/portage/make.conf
# These settings were set by the catalyst build script that automatically
# built this stage.
# Please consult /usr/share/portage/config/make.conf.example for a more
# detailed example.
NTHREADS="16"
source /etc/portage/make.conf.lto
CFLAGS="-march=native ${CFLAGS} -pipe" #NOTE: Consider using -falign-functions=32 if you use an Intel processor. See issue #164.
CXXFLAGS="${CFLAGS}"
#COMMON_FLAGS="-march=native -O2 -pipe"
#CFLAGS="${COMMON_FLAGS}"
#CXXFLAGS="${COMMON_FLAGS}"
#FCFLAGS="${COMMON_FLAGS}"
#FFLAGS="${COMMON_FLAGS}"
# NOTE: This stage was built with the bindist Use flag enabled
PORTDIR="/var/db/repos/gentoo"
DISTDIR="/var/cache/distfiles"
PKGDIR="/var/cache/binpkgs"
# This sets the language of build output to English.
# Please keep this setting intact when reporting bugs.
LC_MESSAGES=C
#MAKEOPTS="-j16"
MAKEOPTS="-j${NTHREADS}"
GRUB_PLATFORMS="efi-64"
USE="gstreamer pulseaudio -doc -bluetooth -ios -aqua -cdrom -dvd"
VIDEO_CARDS="radeon r600"
ACCEPT_LICENSE="*"
PORTAGE_TMPDIR="/tmp"
Depois da alteração no "make.conf", recompile tudo aplicando as novas mudanças com o comando:
# emerge -e @world
Provavelmente isso deve levar algumas horas, principalmente se você tem o KDE Plasma instalado. Recomendo aplicar antes de ir dormir.
Conclusão
Não teria muito sentido usar Gentoo para obter o mesmo nível de otimização que uma distribuição comum. Mas até a instalação padrão do Gentoo (com -O2, sem LTO e sem Graphite), eu acredito, deve ser mais otimizada que o as distribuições comuns, por causa do "-march=native". Mesmo assim, o legal é tentar aproveitar mais a flexibilidade que o sistema oferece. Estou tentando aprender a fazer isso!
Agora vem a grande pergunta: com essas configurações, o sistema realmente fica melhor? Não fiz nenhum teste de benchmark, mas eu responderia: com certeza!
Estou usando o KDE Plasma, que é provavelmente o ambiente mais gordo que existe, com o papel de parede animado, ambiente cheio de efeitos e mesmo assim o sistema não apresenta NENHUM lag, ou travamento por mínimo que seja! E, recentemente, eu testei outras distribuições como openSUSE, Arch, Kubuntu e Manjaro, no meu "olhômetro" o Gentoo se saiu melhor.
Se problemas surgirão, só o tempo irá dizer. Por enquanto estou curtindo a aventura. Caso alguém tenha percebido algum erro nos procedimentos ou tenha alguma sugestão, por favor deixe um comentário, pois sou novato em Gentoo e estou tentando aprender.
Tem um meme e vou deixar aqui para descontrair. Archusers, não levem isso a sério! =P
Fontes