Sei sulla pagina 1di 4

Optimizando FreeBSD mediante

compilaciones
Autor: Julio Merino (aka Slink)
Fecha: 27 de octubre de 2001
Uno de los principales motivos por los que uso FreeBSD es que puedo compilar y optimizar todo
lo que se distribuye en cdigo fuente. Una de las ventajas directas de esto es optimizar las
librerias y/o ejecutables para el hardware de la mquina, haciendo que funcionen ms deprisa.
He escrito este pequeo artculo para explicaros qu podis hacer para optimizar vuestro sistema.
El archivo make.conf
El archivo principal para las optimizaciones es el /etc/make.conf. En una instalacin nueva este
archivo no existe, por lo que tendris que crearlo. Podis haceros una idea de todo lo que se
puede poner en l hojeando el /etc/defaults/make.conf. Hay que tener en cuenta que ste ultimo
archivo no debe modificarse, y todos los cambios que queramos poner deben ir en
/etc/make.conf.
La funcin de este archivo es predefinir varias variables que tendrn efecto en las compilaciones
que hagamos, sea en un make world o en los ports.
Variables globales
Voy a describir aqu algunas de las variables que podis definir en /etc/make.conf que afectan a
todo el sistema de compilacin.
CPUTYPE determina el tipo de microprocesador que tenemos. En funcin de lo que pongamos
aqu, se aplicaran unos flags de optimizacin u otros (automticamente) en la compilacin.
Podis ver todos los valores posibles en /etc/defaults/make.conf que dependern de la versin de
vuestro sistema. Para un 4.4-STABLE se soportan estos 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
Una vez determinemos cual es el correcto, procedemos a aadirlo al /etc/make.conf:
CPUTYPE=p2
Las siguientes variables importantes son los flags de compilacin de C y C++. Para ello
disponemos de dos variables: CFLAGS (que afecta al compilador de C) y CXXFLAGS (que
afecta al compilador de C++). Debemos ser cuidadosos con los flags que aadimos a estas
variables; hay muchos flags que harn que los programas no funcionen bien, o que el sistema se
vuelva muy inestable (os lo digo por experincia...). Mi recomendacin es que usis estos
valores:
CFLAGS=-O2 -pipe
CXXFLAGS+=-O3
Como podis ver, en CFLAGS definimos un nivel de optimizacin dos y la opcin -pipe. sta
ultima no es realmente un flag de optimizacin; ms que nada har que las compilaciones sean
mucho ms rpidas usando pipes en lugar de archivos temporales.
CXXFLAGS tiene que aadir el contenido nuevo a ella misma, ya que por defecto se define igual
que CFLAGS. En este caso aadimos un nivel de optimizacin tres.
Aqu os muestro un CFLAGS que NO, repito, NO debeis usar ya que produce cdigo inestable
(i.e. el sistema se reinicia al usar kldload, nmbd o kdeinit sueltan cores, X4 no funciona,
top da valores incorrectos, etc):
CFLAGS=-O2 -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
Si he puesto esto aqu es para que os hagis una idea de todo lo que podeis usar (consultar el info
de gcc). Es posible que si usis alguno de estos flags ganis velocidad y no sucedan problemas,
pero la combinacin que os he mostrado no funciona bien, al menos con gcc 2.95.
Variables para el make world y el make kernel
Como he dicho, con el /etc/make.conf podis controlar el make world y la compilacin del
kernel. Una de las variables a destacar es COPTFLAGS. Esta variable define los flags de
optimizacin para el compilador de C que se usarn al compilar los kernels. Es independiente de
CFLAGS. Un buen valor para ella es:
COPTFLAGS=-O -pipe
Si usis niveles de optimizacin mas elevados, es posible que el kernel funcione, pero os
arriesgis a que no vaya bien. Adems, la diferencia de velocidad que ganarais sera mnima, por
lo que no vale la pena.
Ahora voy a describir unas variables que aceleran la compilacin de un make world y de un
kernel, aunque no afectan los ejecutables ni librerias.
Cada vez que compilamos un kernel necesitamos reconstruir todos los mdulos que hay en
/modules. Muchas veces esto es innecesario, pero es un proceso muy lento. Podemos evitar esta
compilacin con las siguientes variables:
NO_MODULES=true
MODULES_WITH_WORLD=true
De este modo los mdulos no se compilaran con el kernel pero se compilaran junto al make
world. Parece razonable que el kernel se compile varias veces bajo un mismo checkout del
sistema, pero como el listado de mdulos es siempre fijo, con que los compilemos una vez por
checkout, ser suficiente.
Por otro lado podemos definir la variable siguiente para que no se compilen las profiled libraries.
stas son rramente tiles, pero necesitan mucho tiempo de compilacin que generalmente
podemos evitar:
NOPROFILE=true
Para terminar esta seccin cabe destacar un flag muy til que podemos usar cuando ejecutamos
el make world. ste es el -jX (dnde X es un numero). ste flag nos permite mantener varios
procesos de compilacin funcionando simultneamente y en varias CPUs. Aunque no
dispongamos de varias CPUs este flag tambin optimiza el tiempo de compilacin ya que
normalmente el cuello de botella se forma con el acceso a disco. Mi recomendacin es que usis
un flag -j4 que mantiene cuatro compilaciones funcionando en paralelo:
/usr/src# make -j4 buildworld
Si disponis de varias CPUs, probar con otros valores y determinar cul os va mejor.
Variables para los ports
Hay muchos ports que soportan opciones de optimizacin y que muchas veces pasan
desapercibidas ya que normalmente no nos fijamos en el proceso de compilacin, y es all donde
se nos dicen.
Algunas de ellas son las siguientes:
WITH_PNG_MMX=yes
OPT_ARCH=i586
Siento no disponer de mas, aunque seguro que las hay. Como vis, la primera habilita el soporte
MMX en la libreria png, y la segunda habilita la optimizacin para Pentium en el paquete
mpg123. Algunos otros paquetes se autoconfiguran para usar determinadas optimizaciones, por
lo que no deberis preocuparos.
Es recomendable que hechis una ojeada al Makefile de cada port antes de que lo compilis para
que veis qu opciones soporta.
Por otro lado, algunos paquetes soportan opciones de optimizacin en el proceso de
autoconfiguracin, pero que no estn soportadas por los ports. Un ejemplo claro es qt23 que
tiene soporte optimizado para algunas tarjetas grficas. Para habilitar este soporte podemos editar
el archivo /usr/ports/x11-toolkits/qt23/Makefile y aadimos -accel-mach64 a la lnea del
CONFIGURE_ARGS.
Del mismo modo, algunos ports, como kdelibs2, vienen con las opciones de depuracin
activadas, que hacen que luego vaya mucho ms lento. Estas opciones tambin pueden
desactivarse retocando el Makefile.
Si queris ver las opciones de este estilo que soporta cada port, podis hacer un make
extract del paquete. Luego, entris en el subdirectorio work/ y all ejecutis el
./configure con la opcin de ayuda. Por ejemplo:
# cd /usr/ports/x11/kdelibs2
# make extract
# cd work/kdelibs-2.2
# ./configure --help
De la salida de este comando vemos las opciones que pueden interesarnos y que aadiremos al
CONFIGURE_ARGS del Makefile como he dicho antes.
Hemos de ir con cuidado sobre lo que quitamos o aadimos. Debemos recordar que los ports
estn programados para instalar una srie de archivos predefinidos y que, si en el
CONFIGURE_ARGS habilitamos alguna opcin que haga que algunos archivos no sean creados,
el make install fallar luego. Es el caso de mozilla, en el que si deshabilitamos la
compilacin del programa de correo, la instalacin falla.
Conclusin
Espero que con estos trucos veis una de las ventajas claras de usar FreeBSD, y es que podis
aprovechar mucho mejor vuestro ordenador de lo que os imaginis.
Por supuesto, todo lo comentado se puede aplicar a NetBSD u OpenBSD, pero ser necesario
que veis que variables son soportadas o cul es su nombre, ya que posiblemente se llamen de un
modo distinto. Como nota, en estos dos BSD's el archivo se llama /etc/mk.conf.
Venga, a compilar!

Potrebbero piacerti anche