SafeChildren Banner

Havoc Oracle Solaris Experts

jueves, 1 de octubre de 2009

Instalar MemCached en Solaris 10 64bits

AVISO ABR.2010: He detectado que "en ciertas arquitecturas" el proceso de MemCached sobre 64bis, no responde correctamente cuando se compila con GCC, por ello, os recomiendo inicialmente Instalar y Configurar MemCache(32bits) en Solaris 10


Introducción
MemCached es una caché distribuida de alto rendimiento cuyo principal uso es la aceleración de páginas web mediante cacheo en memoria de las SQL. De esta forma, evitamos tener que llamar a la base de datos.

Aunque pueda parecer una tontería no lo es ya que una cache bien implementada es muy eficiente, más que la de la base de datos. Si, es cierto, bien implementada, pero esto es un tema de programación y nosotros nos vamos a centrar en cómo instalarlo sobre Solaris 10 en 64bits.

Por que en 64bits?
Simple, de esta forma podemos tener un tamaño de caché superior a 4Gb. En la actualidad ya no es raro encontrar máquinas con 8,16,32Gb de RAM ( y de ahí en adelante), por ello, vamos a instalarlo en 64bits.

Nota: Si lo que queremos es que sea de 32bits, simplemente no deberemos exportar el flag de gcc -m64 y las bibliotecas serán /usr/lib y no /usr/lib/64


Compilación de LibEvent en 64bits
La compilación de LibEvent no tiene mucha complicación, simplemente utilizaremos el flag -m64 de gcc para hacerlo de 64bits y --prefix para situarlo en la ubicación /opt/memcached
$ export CFLAGS=-m64
$ export CXXFLAGS=-m64
$ ./configure --enable-static --prefix=/opt/memcached/libevent/64
$ make
# make install

Comprobación de la instalación
Si la instalación ha concluido sin errores, ahora tendremos instalado nuestro libevent en /opt/memcached/libevent/64, sin embargo, tenemos que indicarle dónde se encuentran las bibliotecas de acceso correcto para gcc (si no lo tenemos asignado ya), por ejemplo, si no tenemos asignado nuestro LD64, nos encontraremos con el siguiente error,
$ ldd libevent.so
libnsl.so.1 => /lib/64/libnsl.so.1
librt.so.1 => /lib/64/librt.so.1
libresolv.so.2 => /lib/64/libresolv.so.2
libsocket.so.1 => /lib/64/libsocket.so.1
libc.so.1 => /lib/64/libc.so.1
libgcc_s.so.1 => /usr/sfw/lib/libgcc_s.so.1 - clase ELF incorrecta: ELFCLASS32
libmp.so.2 => /lib/64/libmp.so.2
libmd.so.1 => /lib/64/libmd.so.1
libscf.so.1 => /lib/64/libscf.so.1
libaio.so.1 => /lib/64/libaio.so.1
libdoor.so.1 => /lib/64/libdoor.so.1
libuutil.so.1 => /lib/64/libuutil.so.1
libgen.so.1 => /lib/64/libgen.so.1
libm.so.2 => /lib/64/libm.so.2
/platform/SUNW,Sun-Fire-280R/lib/sparcv9/libc_psr.so.1
/platform/SUNW,Sun-Fire-280R/lib/sparcv9/libmd_psr.so.1
Esto es debido a que está intentando enalzarse con la versión de 32bits de libgcc y nuestro binario es de 64bits, así que, simplemente, la indicaremos que no busque ahí, sino en /usr/sfw/lib/64
$ export LD_LIBRARY_PATH_64=/opt/memcached/libevent/64/lib:/usr/sfw/lib/64
$ pwd
/opt/memcached/libevent/64/lib
$ ldd libevent.so
libnsl.so.1 => /lib/64/libnsl.so.1
librt.so.1 => /lib/64/librt.so.1
libresolv.so.2 => /lib/64/libresolv.so.2
libsocket.so.1 => /lib/64/libsocket.so.1
libc.so.1 => /lib/64/libc.so.1
libgcc_s.so.1 => /usr/sfw/lib/64/libgcc_s.so.1
libmp.so.2 => /lib/64/libmp.so.2
libmd.so.1 => /lib/64/libmd.so.1
libscf.so.1 => /lib/64/libscf.so.1
libaio.so.1 => /lib/64/libaio.so.1
libdoor.so.1 => /lib/64/libdoor.so.1
libuutil.so.1 => /lib/64/libuutil.so.1
libgen.so.1 => /lib/64/libgen.so.1
libm.so.2 => /lib/64/libm.so.2
/platform/SUNW,Sun-Fire-280R/lib/sparcv9/libc_psr.so.1
/platform/SUNW,Sun-Fire-280R/lib/sparcv9/libmd_psr.so.1
Aunque ld buscará en LD_LIBRARY_PATH las bibliotecas de 64 o 32 (en función de lo que necesite) es más correcto poner las bibliotecas de 32bits en LD_LIBRARY_PATH y las de 64bits en LD_LIBRARY_PATH_64

Compilación de MemCache en 64bits
En memcached no es necesario exportar los CFLAGS ya que se puede configurar utilizando --enable-64bit, además utilizaremos --with-libevent para indicarle dónde tenemos instalado nuestro LibEvent
$ ./configure --enable-64bit --with-libevent=/opt/memcached/libevent/64 --prefix=/opt/memcached
$ make
# make install

Comprobación de la instalación
Al igual que hemos hecho antes, comprobaremos que todas las dependencias se encuentran. Si faltase alguna, entonces tendríamos que exportar correctamente nuestro LD_LIBRARY_PATH_64
$ pwd
/opt/memcached/bin
$ ldd memcached
libumem.so.1 => /lib/64/libumem.so.1
libnsl.so.1 => /lib/64/libnsl.so.1
libsocket.so.1 => /lib/64/libsocket.so.1
libevent-1.4.so.2 => /opt/memcached/libevent/64/lib/libevent-1.4.so.2
libc.so.1 => /lib/64/libc.so.1
libmp.so.2 => /lib/64/libmp.so.2
libmd.so.1 => /lib/64/libmd.so.1
libscf.so.1 => /lib/64/libscf.so.1
librt.so.1 => /lib/64/librt.so.1
libresolv.so.2 => /lib/64/libresolv.so.2
libgcc_s.so.1 => /usr/sfw/lib/64/libgcc_s.so.1
libdoor.so.1 => /lib/64/libdoor.so.1
libuutil.so.1 => /lib/64/libuutil.so.1
libgen.so.1 => /lib/64/libgen.so.1
libaio.so.1 => /lib/64/libaio.so.1
libm.so.2 => /lib/64/libm.so.2
/platform/SUNW,Sun-Fire-280R/lib/sparcv9/libc_psr.so.1
/platform/SUNW,Sun-Fire-280R/lib/sparcv9/libmd_psr.so.1
Un pequeño Tuning: Uso de libumem
Como podéis ver, yo tengo una biblioteca llamada libumem que, según man es "una biblioteca rápida, escalable para la caché de objetos en memoria con soporte para multithread", entonces, si estoy ejecutando memcached y a la vez libumem qué pasa? Libumem es una versión mejorada de malloc, calloc, alloc con funcionalidades de debug y memory leaks, además está demostrado que es mucho más eficiente así que por qué no usarla.

Para que libumem se precarge simplemente deberemos establecer las variables de entorno LD_PRELOAD_32 y LD_PRELOAD_64 con las ubicaciones de libumem.
$ echo $LD_PRELOAD_32
/usr/lib/libumem.so.1:/usr/lib/extendedFILE.so.1:
$ echo $LD_PRELOAD_64
/usr/lib/sparcv9/libumem.so.1:
Si queremos que las configuraciones de LD_PRELOAD_32/64 y LD_LIBRARY_PATH se cargen por defecto a todos los usuarios (aunque no es muy recomendable) podemos incluirlo en /etc/profile
$ vi /etc/profile
LD_PRELOAD_32=/usr/lib/libumem.so.1:/usr/lib/extendedFILE.so.1:$LD_PRELOAD_32
LD_PRELOAD_64=/usr/lib/sparcv9/libumem.so.1:$LD_PRELOAD_64

:wq
Nota: Esto tiene "algún" problema con Oracle 9i

Puedes obtener más información desde el man de LibUmem
$ man libumem
Iniciar MemCached
La ejecución de memcached no es muy diferente a cualquier otro binario, sin embargo, los parámetros son muy numerosos, por ello, es necesario entender qué hace cada uno. Para ello, puedes ejecutar memcached con la opción -h que muestra la ayuda

Por ejemplo, si queremos que tenga 256 Mb de caché y un máximo de 2048 conexiones con 4 threads, ejecutaremos

$ ./memcached -m 256 -c 2048 -L -t 4
^CSIGINT handled.
Para detener el proceso, pulsamos Ctrl+C y saldrá.

Conclusiones
Hemos visto cómo podemos instalar sin mayores problemas memcached en 64bits sobre Solaris, ejecutarlo y tenerlo ahí a la espera, sin embargo, nuestro siguiente paso debe ser integrarlo con SMF para poder gestionarlo de igual forma que otros servicios.

Aunque no he podido preparar la configuración del archivo manifiest de memcached, espero que alguien se anime a crearlo y compartirlo con todos, no?

Nota sobre versiones instaladas
Alguna vez me he econtrado con problemas al compilar en los diferentes Solaris, esto es debido a que gmake suele ser una version antigua y tiende a fallar. Por eso, os pongo las versiones con las que suelo compilar las herramientas para los post
$ which make
/usr/local/bin/make
$ which gcc
/usr/sfw/bin/gcc
$ make -v
GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for sparc-sun-solaris2.10
$ gcc -v
Reading specs from /usr/sfw/lib/gcc/sparc-sun-solaris2.10/3.4.3/specs
Configured with: /sfw10/builds/build/sfw10-patch/usr/src/cmd/gcc/gcc-3.4.3/configure --prefix=/usr/sfw --with-as=/usr/ccs/bin/as --without-gnu-as --with-ld=/usr/ccs/bin/ld --without-gnu-ld --enable-languages=c,c++ --enable-shared
Thread model: posix
gcc version 3.4.3 (csl-sol210-3_4-branch+sol_rpath)

Referencias

No hay comentarios:

Publicar un comentario en la entrada