Optimizando FreeBSD mediante compilações

Autor: Julio Merino (aka Slink)
Data: 27 de outubro de 2001.


Um dos principais motivos pelos que uso FreeBSD é que posso compilar e optimizar todo o que se distribui em código fonte. Uma das vantagens diretas disto é optimizar as librerias e/ou ejecutables para o hardware da máquina, fazendo que funcionem mais depressa.

Escrevi este pequeno artigo para explicar-vos que podeis fazer para optimizar vosso sistema.

O arquivo make.conf

O arquivo principal para as optimizaciones é o /etc/make.conf. Numa instalação nova este arquivo não existe, pelo que tereis que o criar. Podeis fazer-vos uma idéia de todo o que se pode pôr nele folheando o /etc/defaults/make.conf. Há que ter em conta que este ultimo arquivo não deve modificar-se, e todos as mudanças que queiramos pôr devem ir em etc //make.conf.

A função deste arquivo é predefinir várias variáveis que terão efeito nas compilações que façamos, seja num make world ou nos ports.

Variáveis globais

Vou descrever aqui algumas das variáveis que podeis definir em etc //make.conf que afetam a todo o sistema de compilação.

CPUTYPE determina o tipo de microprocesador que temos. Em função do que ponhamos aqui, aplicassem-se uns flags de optimización ou outros (automaticamente) na compilação. Podeis ver todos os valores possíveis em etc //defaults/make.conf que dependerão da versão de vosso sistema. Para um 4.4-STABLE se suportam estes valores:

#   Intel x86 architecture:
#       (AMD CPUs)      k7 k6-2 k6 k5
#       (Intel CPUs)    p4 p3 p2 i686 i586/mmx i586 i486 i386
#   Alpha/AXP architecture: ev6 pca56 ev56 ev5 ev45 ev4.

Uma vez determinemos qual é o correto, procedemos a adicioná-lo ao /etc/make.conf:

CPUTYPE=p2.

As seguintes variáveis importantes são os flags de compilação de C e C++. Para isso dispomos de duas variáveis: CFLAGS (que afeta ao compilador de C) e CXXFLAGS (que afeta ao compilador de C ++). Devemos ser cuidadosos com os flags que adicionámos a estas variáveis; há muitos flags que farão que os programas não funcionem bem, ou que o sistema se volte muito inestable (vo-lo digo por experiéncia...). Minha recomendação é que useis estes valores:

CFLAGS=-Ou2 -pipe
CXXFLAGS+=-Ou3.

Como podeis ver, em CFLAGS definimos um nível de optimización dois e a opção -pipe. Esta ultima não é realmente um flag de optimización; mais do que nada fará do que as compilações sejam muito mais rápidas usando pipes em lugar de arquivos temporais.

CXXFLAGS tem que adicionar o conteúdo novo a ela mesma, já que por defeito se define igual que CFLAGS. Neste caso adicionamos um nível de optimización três.

Aqui vos mostro um CFLAGS que NÃO, repito, NÃO debeis usar já que produz código inestable (i.e. o sistema se reinicia ao usar kldload, nmbd ou kdeinit soltam cores, X4 não funciona, top dá valores incorretos, etc):

CFLAGS=-Ou2 -pipe -malign-double -ffast-math -fomit-frame-pointer \
       -funroll-loops -frerun-loop-opt -fgcse -fcse-follow-jumps \
       -fcse-skip-blocks -frerun-cse-after-loop -fschedule-insns2.

Se pus isto aqui é para que vos hagáis uma idéia de todo o que podeis usar (conferir o info de gcc ). É possível que se usais algum destes flags ganheis velocidade e não sucedan problemas, mas a combinação que vos mostrei não funciona bem, ao menos com gcc 2.95.

Variáveis para o make world e o make kernel

Como disse, com o /etc/make.conf podeis controlar o make world e a compilação do kernel. Uma das variáveis a destacar é COPTFLAGS. Esta variável define os flags de optimización para o compilador de C que se usarão ao compilar os kernels. É independente de CFLAGS . Um bom valor para ela é:

COPTFLAGS=-Ou -pipe

Se usais níveis de optimización mas elevados, é possível que o kernel funcione, mas vos arriscais a que não vá bem. Ademais, a diferença de velocidade que ganharíeis seria mínima, pelo que não vale a pena.

Agora vou descrever umas variáveis que aceleram a compilação de um make world e de um kernel, ainda que não afetam os ejecutables nem librerias.

Cada vez que compilámos um kernel precisamos reconstruir todos os módulos que há em modules /. Muitas vezes isto é desnecessário, mas é um processo muito lento. Podemos evitar esta compilação com as seguintes variáveis:

NÃO_MODULES=true
MODULES_WITH_WORLD=true

Deste modo os módulos não se compilassem com o kernel mas se compilassem junto ao make world. Parece razoável que o kernel se compile várias vezes sob um mesmo checkout do sistema, mas como a listagem de módulos é sempre fixo, com que os compilemos uma vez por checkout, será suficiente.

Por outro lado podemos definir a variável seguinte para que não se compilem as profiled libraries. Estas são ráramente úteis, mas precisam muito tempo de compilação que geralmente podemos evitar:

NOPROFILE=true

Para terminar esta seção cabe destacar um flag muito útil que podemos usar quando executamos o make world. Este é o -jX (onde X é um numero). Este flag nos permite manter vários processos de compilação funcionando simultaneamente e em várias CPUs. Ainda que não disponhamos de várias CPUs este flag também optimiza o tempo de compilação já que normalmente o pescoço de garrafa se forma com o acesso a disco. Minha recomendação é que useis um flag -j4 que mantém quatro compilações funcionando em paralelo:

/usr/src# make -j4 buildworld

Se dispondes de várias CPUs, provar com outros valores e determinar qual vos vai melhor.

Variáveis para os ports

Há muitos ports que suportam opções de optimización e que muitas vezes passam desapercibidas já que normalmente não nos fixámos no processo de compilação, e é ali onde se nos dizem

Algumas delas são as seguintes:

WITH_PNG_MMX=yes
OPT_ARCH=i586.

Sento não dispor de mas, ainda que seguro que as há. Como véis, a primeira habilita o suporte MMX na libreria png, e a segunda habilita a optimización para Pentium no pacote mpg123. Alguns outros pacotes se autoconfiguran para usar determinadas optimizaciones, pelo que não devereis preocupar-vos.

É recomendável que hechéis uma olhadela ao Makefile de cada port antes de que o compileis para que vejais que opções suporta.

Por outro lado, alguns pacotes suportam opções de optimización no processo de autoconfiguración, mas que não estão suportadas pelos ports. Um exemplo claro é qt23 que tem suporte optimizado para alguns cartões gráficos. Para habilitar este suporte podemos editar o arquivo /usr/ports/x11-toolkits/qt23/Makefile e adicionámos -accel-mach64 à linha do CONFIGURE_ARGS.

Do mesmo modo, alguns ports, como kdelibs2, vêm com as opções de depuração ativadas, que fazem que logo vá muito mais lento. Estas opções também podem desativar-se retocando o Makefile.

Se quereis ver as opções deste estilo que suporta cada port, podeis fazer um make extract do pacote. Logo, entrais no subdirectorio work/ e ali executais o ./configure com a opção de ajuda. Por exemplo

# cd /usr/ports/x11/kdelibs2
# make extract
# cd work/kdelibs-2.2
# ./configure --help

Da saída deste comando vemos as opções que podem interessar-nos e que adicionaremos ao CONFIGURE_ARGS do Makefile como disse antes.

Temos de ir com cuidado sobre o que tiramos ou adicionámos. Devemos lembrar que os ports estão programados para instalar uma série de arquivos predefinidos e que, se no CONFIGURE_ ARGS habilitámos alguma opção que faça que alguns arquivos não sejam criados, o make install fallará logo. É o caso de mozilla , no que se deshabilitamos a compilação do programa de correio, a instalação falla.

Conclusão

Espero que com estes truques vejais uma das vantagens claras de usar FreeBSD, e é que podeis aproveitar muito melhor vosso computador do que vos imaginais.

Por suposto, todo o comentado se pode aplicar a NetBSD ou OpenBSD, mas será necessário que vejais que variáveis são suportadas ou qual é seu nome, já que possivelmente se chamem de um modo distinto. Como nota, nestes dois BSD's o arquivo se chama /etc/mk.conf.

Vinga, ¡a compilar!


Hosted by www.Geocities.ws

1