Felicidades a todos los administradores de sistemas, incluyendo a los BOFH
Archive for the ‘servidores’ category
30 de Julio día del SysAdmin
July 30th, 2010[php] Depurando / Profiling en php ( II )
July 28th, 2010En este caso analizamos un hecho real, una web que tarda en cargar aleatoriamente entre 10 y 12 segundos. El problema es que al medir los tiempos en otro servidor no llega a 2 segundos. Después de revisar conectividad, carga de sistema, carga de apache … y demás parámetros habituales; todo estaba perfecto. Así que decidimos relizar el profiling de la web para localizar el cuello de botella dentro de los scripts php.
En el artículo anterior [php] Depurando / Profiling en php ( I ) dejamos instalado el módulo APD para capturar la información necesaria y luego procesarla. Recordamos que hay que usar la función apd_set_pprof_trace(); para que se generen los datos. En nuestro caso hemos seleccionado la ruta /tmp en donde se almacenarán estos ficheros.
Ejecutamos unos cuantas veces el script php que nos interesa. Generamos una captura de una ejecución en 1-2 segundos (/tmp/pprof.32231.1) y seguimos ejecutando hasta que conseguimos una captura de datos de una ejecución que tardó unos 10-11 segundos (/tmp/pprof.01666.0)
Vamos a comparar la captura de los datos :
La ejecución buena :
# pprofp -R /tmp/pprof.32231.1 Trace for /var/www/vhosts/hostingaldescubierto.com/httpdocs/index.php Total Elapsed Time = 0.36 Total System Time = 0.03 Total User Time = 0.07 Real User System secs/ cumm %Time (excl/cumm) (excl/cumm) (excl/cumm) Calls call s/call Memory Usage Name -------------------------------------------------------------------------------------- 100.0 0.00 0.36 0.00 0.07 0.00 0.03 1 0.0000 0.3589 0 main 96.1 0.00 0.34 0.00 0.08 0.00 0.03 5 0.0000 0.0690 0 require_once 59.1 0.00 0.21 0.00 0.01 0.00 0.00 8 0.0000 0.0265 0 include 58.9 0.00 0.21 0.00 0.01 0.00 0.00 1 0.0000 0.2113 0 call_user_func_array 58.9 0.00 0.21 0.00 0.01 0.00 0.00 1 0.0000 0.2113 0 Pages->index 58.9 0.00 0.21 0.00 0.01 0.00 0.00 1 0.0000 0.2112 0 Pages->show 58.9 0.00 0.21 0.00 0.01 0.00 0.00 1 0.0000 0.2112 0 Template->build 58.8 0.00 0.21 0.00 0.01 0.00 0.00 2 0.0000 0.1054 0 MY_Loader->view 58.6 0.00 0.21 0.00 0.01 0.00 0.00 2 0.0000 0.1052 0 MY_Loader->_ci_load 56.8 0.00 0.20 0.00 0.00 0.00 0.00 1 0.0000 0.2038 0 weather_google_api 56.8 0.20 0.20 0.00 0.00 0.00 0.00 1 0.2037 0.2037 0 simplexml_load_file 29.4 0.00 0.11 0.00 0.05 0.00 0.02 1 0.0000 0.1054 0 Pages->Pages 29.2 0.00 0.10 0.00 0.05 0.00 0.02 1 0.0000 0.1048 0 Pages->Public_Controller 13.9 0.00 0.05 0.00 0.03 0.00 0.02 1 0.0000 0.0497 0 Pages->MY_Controller 13.4 0.00 0.05 0.00 0.02 0.00 0.03 2 0.0000 0.0241 0 MY_Loader->_ci_autoloader 12.2 0.00 0.04 0.00 0.01 0.00 0.00 3 0.0000 0.0146 0 Banners_model->get_by_section 11.7 0.00 0.04 0.00 0.00 0.00 0.00 25 0.0000 0.0017 0 CI_DB_mysql_driver->query 11.5 0.00 0.04 0.00 0.01 0.00 0.00 6 0.0000 0.0069 0 Banners_model->add_hit 11.4 0.04 0.04 0.03 0.03 0.01 0.01 65 0.0006 0.0006 0 defined 10.9 0.00 0.04 0.00 0.00 0.00 0.00 25 0.0000 0.0016 0 CI_DB_mysql_driver->simple_query
El fichero de 10-12 segundos :
# pprofp -R /tmp/pprof.01666.0 Trace for /var/www/vhosts/hostingaldescubierto.com/httpdocs/index.php Total Elapsed Time = 10.34 Total System Time = 0.02 Total User Time = 0.08 Real User System secs/ cumm %Time (excl/cumm) (excl/cumm) (excl/cumm) Calls call s/call Memory Usage Name -------------------------------------------------------------------------------------- 100.1 0.00 10.35 0.00 0.09 0.00 0.02 5 0.0000 2.0692 0 require_once 100.0 0.00 10.34 0.00 0.08 0.00 0.02 1 0.0000 10.3394 0 main 99.1 0.00 10.24 0.00 0.01 0.00 0.00 8 0.0000 1.2802 0 include 99.0 0.00 10.24 0.00 0.01 0.00 0.00 1 0.0000 10.2409 0 call_user_func_array 99.0 0.00 10.24 0.00 0.01 0.00 0.00 1 0.0000 10.2409 0 Pages->index 99.0 0.00 10.24 0.00 0.01 0.00 0.00 1 0.0000 10.2409 0 Pages->show 99.0 0.00 10.24 0.00 0.01 0.00 0.00 1 0.0000 10.2409 0 Template->build 99.0 0.00 10.24 0.00 0.01 0.00 0.00 2 0.0000 5.1202 0 MY_Loader->view 99.0 0.00 10.24 0.00 0.01 0.00 0.00 2 0.0000 5.1200 0 MY_Loader->_ci_load 99.0 0.00 10.23 0.00 0.00 0.00 0.00 1 0.0000 10.2335 0 weather_google_api 99.0 10.23 10.23 0.00 0.00 0.00 0.00 1 10.2333 10.2333 0 simplexml_load_file 0.7 0.00 0.08 0.00 0.06 0.00 0.01 1 0.0000 0.0766 0 Pages->Pages 0.7 0.00 0.08 0.00 0.05 0.00 0.01 1 0.0000 0.0761 0 Pages->Public_Controller 0.5 0.00 0.05 0.00 0.04 0.00 0.01 2 0.0000 0.0266 0 MY_Loader->_ci_autoloader 0.5 0.00 0.05 0.00 0.04 0.00 0.01 1 0.0000 0.0524 0 Pages->MY_Controller 0.4 0.04 0.04 0.04 0.04 0.01 0.01 65 0.0006 0.0006 0 defined 0.4 0.00 0.04 0.00 0.02 0.00 0.01 38 0.0000 0.0010 0 MY_Loader->helper 0.3 0.00 0.04 0.00 0.03 0.00 0.00 10 0.0000 0.0036 0 MY_Loader->model 0.3 0.00 0.03 0.00 0.02 0.00 0.01 1 0.0000 0.0312 0 Pages->Controller 0.3 0.00 0.03 0.00 0.02 0.00 0.01 1 0.0000 0.0311 0 Pages->_ci_initialize
Vemos claramente esta linea que es la que penaliza el tiempo de ejecución del script:
99.0 10.23 10.23 0.00 0.00 0.00 0.00 1 10.2333 10.2333 0 simplexml_load_file
Perfecto, ya sabemos lo que tenemos que buscar el uso de la función simplexml_load_file. Buscamos los ficheros que usan esta funcion, por ejemplo así :
find -name "*php" -exec grep -l simplexml_load_file {} \;
Entre los resultados encontramos uno, que llama especialmente la atención, en el que solicita un fichero xml de google http://www.google.com/ig/api?weather=madrid&oe=utf-8.
Vamos a medir cuanto tiempo tarda en descargarlo :
# time wget 'http://www.google.com/ig/api?weather=madrid&oe=utf-8' --2010-07-26 18:27:47-- http://www.google.com/ig/api?weather=madrid&oe=utf-8 Resolving www.google.com... 66.249.92.104 Connecting to www.google.com|66.249.92.104|:80... connected. HTTP request sent, awaiting response... 200 OK Length: unspecified [text/xml] Saving to: `api?weather=madrid&oe=utf-8.1' [ <=> ] 1,291 --.-K/s in 0s 2010-07-26 18:27:57 (12.0 MB/s) - `api?weather=madrid&oe=utf-8.1' saved [1291] real 0m10.157s user 0m0.002s sys 0m0.001s
Parece bastante claro que la ejecución se ralentiza por la petición a google… una caché que se actualice cada día, hora o cada minuto solucionaría este problema.
[php] Depurando / Profiling en php ( I )
July 23rd, 2010Para poder diagnosticar qué sucede en la máquina cuando se ejecuta un script en php es necesario instalar un depurador o profiler. En este caso instalamos Advanced Php Debugger.
En máquinas Centos, como es usual no lo tenemos en el repositorio así lo instalaremos manualmente usando ‘pecl‘ que lo provee el paquete de php-pear .
pecl install apd
Será necesario tener instalado make, gcc y autconf
Nos podemos encontrar con este error :
# pecl install apd WARNING: channel "pear.php.net" has updated its protocols, use "channel-update pear.php.net" to update downloading apd-1.0.1.tgz ... Starting to download apd-1.0.1.tgz (36,643 bytes) ..........done: 36,643 bytes 15 source files, building running: phpize Configuring for: PHP Api Version: 20041225 Zend Module Api No: 20060613 Zend Extension Api No: 220060519 building in /var/tmp/pear-build-root/apd-1.0.1 running: /tmp/pear/download/apd-1.0.1/configure checking for egrep... grep -E checking for a sed that does not truncate output... //bin/sed checking for cc... cc checking for C compiler default output file name... a.out checking whether the C compiler works... configure: error: cannot run C compiled programs. If you meant to cross compile, use `--host'. See `config.log' for more details. ERROR: `/tmp/pear/download/apd-1.0.1/configure' failed
Normalmente es debido a que tenemos /var y /var/tmp con la opcion de noexec. Para poder ejecutarlo correctamente pondremos temporalmente estos puntos de montaje con permisos de ejecución y luego lo restauramos:
mount -o,remount,rw,exec /var/tmp mount -o,remount,rw,exec /tmp pecl install apd mount -o,remount,rw,noexec /var/tmp mount -o,remount,rw,noexec /tmp
Nos insteresa quedarnos con este contenido para configurar el fichero .ini :
running: make INSTALL_ROOT="/var/tmp/pear-build-root/install-apd-1.0.1" install Installing shared extensions: /var/tmp/pear-build-root/install-apd-1.0.1/usr/lib64/php/modules/ running: find "/var/tmp/pear-build-root/install-apd-1.0.1" | xargs ls -dils 12 1 drwxr-xr-x 3 root root 1024 Jul 23 18:33 /var/tmp/pear-build-root/install-apd-1.0.1 2057 1 drwxr-xr-x 3 root root 1024 Jul 23 18:33 /var/tmp/pear-build-root/install-apd-1.0.1/usr 4113 1 drwxr-xr-x 3 root root 1024 Jul 23 18:33 /var/tmp/pear-build-root/install-apd-1.0.1/usr/lib64 6169 1 drwxr-xr-x 3 root root 1024 Jul 23 18:33 /var/tmp/pear-build-root/install-apd-1.0.1/usr/lib64/php 8225 1 drwxr-xr-x 2 root root 1024 Jul 23 18:33 /var/tmp/pear-build-root/install-apd-1.0.1/usr/lib64/php/modules 8226 129 -rwxr-xr-x 1 root root 130196 Jul 23 18:33 /var/tmp/pear-build-root/install-apd-1.0.1/usr/lib64/php/modules/apd.so Build process completed successfully Installing '/usr/lib64/php/modules/apd.so' install ok: channel://pear.php.net/apd-1.0.1
Tendremos que crear un fichero en /etc/php.d/apd.ini con este contenido
zend_extension = /usr/lib64/php/modules/apd.so apd.dumpdir = /tmp apd.statement_tracing = 0
y comprobamos que el modulo carga con php -m
#php -m .... [Zend Modules] Advanced PHP Debugger (APD) Zend Optimizer
Ahora ya podemos lanzar el profiling en nuestras páginas, para ello podemos incrustar este fragmento de código y activarlo sólamente cuando accedamos nosotros y no los clientes:
<?php
$DEBUGIPS = array('93.174.6.8','192.168.1.1');
if(array_search($_SERVER[REMOTE_IP], $DEBUGIPS)) {
apd_set_pprof_trace();
}
?>
Y con esto acabamos la primera parte, atentos a la segunda
contratar un vps con server4you.de
April 23rd, 2010Una empresa Alemana suele ser sinónimo de seriedad y calidad. Por lo menos en lo personal siempre me ha dado la sensación de tratar con gente muy preocupada por la imagen de su producto y ofrecer un buen servicio. No digo, precio, si no servicio.
Tras oir hablar hace tiempo de server4you.de y ver el catálogo de productos decidimos contratar un vps. La oferta inmejorable, vps 1024 de ram 25 gb de disco, 5 tb de trafico al mes por 8,85 euros al mes y una oferta de 6 meses gratis si contratas 1 año. Total con impuestos unos 57 euros un año !!!! increible.
Pues eso que no os lo creais, nos registramos esperamos 24 horas, no tenemos el alta. Miramos en las transacciones del banco y nos cobran 2 euros. Bueno, puede ser normal para comprobar que la tarjeta sea real. Mandamos correo preguntando y nada, a esperar , a las 48 horas nos contestan que envíemos una copia del dni o carnet de conducir. Vale, aceptamos también y lo envíamos.
Otras 24 horas después nos contestan que tardan un mínimo de 48 horas en tramitar los correos de gestion y seguimos esperando. Al día siguiente contestan que como no hemos enviado la documentación cancelan el pedido y hasta otra.
Evidentemente enviamos una contestación indicando que el envío de la documentación estaba realizada, bla bla bla bla. Y la contestación hasta el día de hoy ha sido nula. También reclamamos nuestros 2 eurazos !!! que hasta hoy no hemos recuperado.
Visto lo visto nuestra recomendaciń es que no hagais negocios con server4you.de seguramente haya clientes en españa con sus productos, pero si no hubiera sido por que me fué recomendada por un cliente. pensaría que es una estafa y server4you una empresa fantasma.
La Rebelión de los spammers
March 30th, 2010La Rebelión de los spammers es un interesante artículo de David Barroso que leí hace años y ahora lo he vuelto a encontrar por casualidad. El documento habla de la metodología que usa para localizar e identificar procesos maliciosos, cómo identifica el fallo de seguridad, y análisis del enemigo. Se detalla el uso de herramientas de sistema lsof, strace, etc.. etc… Aunque para muchos este tipo de tareas es trivial por realizarlas a diario, no deja de ser un documento interesante para leer.
Dejo copia en el servidor del documento que he localizado en http://his.sourceforge.net/proy_his/papers/spammers/spammers.es.html del proyecto Honeynet In Spanish aparantemente muerto en 2006
El documento lo podeis encontrar en http://www.hostingaldescubierto.com/rebelion-spammers/spammers.es.html
He migrado mi web y ahora no me salen los acentos !!!
November 20th, 2009Suele ocurrir cuando migramos de un sistema a otro que el juego de caracteres del sistema no es el mismo. Esto unido a que la mayoría de los no profesionales ni saben ni les interesa codificar sus webs correctamente genera horror y caos tras una migración.
Frases célebres :
- me han hackeado la web, las eñes (ñ) no salen
- no salen los acentos, arreglamelo
- algo pasa con el office que me salen símbolos en vez de tildes , eñes y exclamaciones.
- y la mítica de no me funciona internet…
Para evitar que esta tortura se dilate en el tiempo tengo un copy paste bastante elegante que ahorra tiempo:
cd /var/www/vhosts/tudominio.ext/httpdocs alias cp='cp' for file in $( find -name "*.htm*" ); do echo "convirtiendo $file.."; cat $file |iconv -flatin1 -t utf8> ../tmp.htm; cp ../tmp.htm $file ; done ; rm -f ../tmp.htm
Basicamente convertimos todos los ficheros de latin1 a utf8 usando un fichero temporal fuera del httpdocs para que no nos convierta el propio fichero temporal.
RECOMENDACIÓN:
Elegir un fichero, hacer el iconv a mano y ver que aparece correctamente en el explorador ya que apache también puede estar configurado para usar por defecto un juego de caracteres u otro. O que el cambio no sea de latin1 a utf8 sino al revés. Eso ya es cosa vuestra.
Ejemplo de configuracion de ipmi
November 26th, 2008Algunos servidores ofrecen la posibilidad de usar IPMI 1.0 o 2.0 para manejar algunas características o información del hardware.
Aquí dejo una chuleta corta para ver la información de los interfaces y configurar uno de ellos copiando y pegando.
Inforamcion del channel 1 ( interface )
ipmitool> channel info 1
Channel 0x1 info:
Channel Medium Type : 802.3 LAN
Channel Protocol Type : IPMB-1.0
Session Support : multi-session
Active Session Count : 0
Protocol Vendor ID : 7154
Volatile(active) Settings
Alerting : enabled
Per-message Auth : enabled
User Level Auth : enabled
Access Mode : disabled
Non-Volatile Settings
Alerting : enabled
Per-message Auth : enabled
User Level Auth : enabled
Access Mode : disabled
Configuración del interface
sudo ipmitool shell lan set 1 access on lan set 1 ipsrc static lan set 1 ipaddr 10.10.10.1 lan set 1 netmask 255.0.0.0.0 lan set 1 defgw ipaddr 10.10.10.0 lan set 1 arp respond on lan set 1 arp generate on lan set 1 arp interval 5
Solo falta crear un usuario
set user pepe plain-text password
sencillo y rápido.
Muy recomendable también las herramientas freeipmi
reset drac dell server / cuando el control remoto se queda colgado
November 11th, 2008Lo mejor que uno puede hacer al adquirir un servidor dedicado es añadirle un control remoto ( KVM, Drac, BMC, IPMI, Megarac … ) Con este hardware tenemos la tranquilidad de que sea la hora que sea y sin tener que esperar al servicio técnico, podemos reinstalar la máquina, reiniciarla, chequearla, actualizar firmware… como si la máquina la tuvieramos delante de nosotros.

De todos los controles remotos que he podido probar, me quedo con el DRAC4 de Dell, practicamente no da problemas y corre bajo java. Drac5 sí da problemas y ademas requiere instalar un OCX.
El caso crítico en que tu servidor se cuelge y el DRAC esté completamente costado y no se pueda visualizar el arranque, desespera y mucho. El problema de DRAC5 si no recuerdo mal viene dado de un bug que no ha sido corredigo con el que se pueden tostar los DRAC5 de Dell. No es demasiado problema si accedemos a nuestro hardware de control remoto via ssh y lanzamos el comando racadm racreset. Podeis consultar este enlace http://hostingaldescubierto.com/wordpress/2008/04/11/error-unable-to-connect-to-vkvm-press-ok-to-exit/
En unos segundos el drac habrá reiniciado y será totalmente operativo de nuevo.
En cuanto a los servicios de control remoto de otras marcas como Fujitsu, no están mal, pero son bastante más lentos y dan algún que otro problema con el video. Creo que alguna acutalización reciente en el firm ha subsanado estos problemas.

Aparte está Supermicro que usa un kvm exactamente identico al que usan en lantronix ( spider ). En el caso de lantronix es externo y el de supermicro interno con un hardware adicional sus servidores y muy importante, funcionan bajo java.
Para los más valientes, con impi quizás os sirva, tan solo servirá para hacer ping y reiniciar el servidor, más alguna funcionalidad como temperaturas, etc…
Lo que si hay que tener en cuenta es que casi todos dan problemas con el teclado a la hora de marcar algunos caracteres.
Protegiendo el servidor: APF (Advanced Policy Firewall)
September 5th, 2008Un paquete de software muy usado para defender nuestros servidores es APF. La instalación es muy rápida por lo que podemos ver en seguida si resulta eficaz ante un ataque. Se basa en filtros usando iptables y listas de ips para bloquear. Es muy completo, pero lo más importante es que es rápido de instalar y no da problemas. Solución rápida en momentos de crisis
Para instalarlo :
cd /usr/src wget http://www.r-fx.ca/downloads/apf-current.tar.gz tar zxvf apf-current.tar.gz cd apf-* sh install.sh
La instalación es así:
# sh install.sh Installing APF 9.6-5: Completed. Installation Details: Install path: /etc/apf/ Config path: /etc/apf/conf.apf Executable path: /usr/local/sbin/apf Other Details: Listening TCP ports: 111 Listening UDP ports: 111,45188,45234,46761,48062 Note: These ports are not auto-configured; they are simply presented for information purposes. You must manually configure all port options.
Iniciar el servicio apf
apf -s
Los logs están en /var/log/apf_log
más información en http://rfxnetworks.com/apf.php
Plesk con más de 300 dominios = apache + “Too many open files”
May 7th, 2008En Plesk 8.X existe una limitación a 300 dominios, a partir de la cual habría que recompilar apache para dar soporte a más dominios sin problemas.
Cuando un servidor con Plesk llega a este volumen, puede ocasionar problemas como “Too many open files” y no arraca el servicio.
Este problema puede ser solucionado de varias formas.
Una es ampliar el numero de ficheros que se pueden abrir usando:
ulimit -n 2048 /etc/init.d/apache restart
Para configurar estos parámetros se usa el fichero /etc/security/limits.conf o ficheros de configuracion en /etc/security/limits.d
Por ejemplo para todos los usuarios poner un limite de ficheros abiertos 1024 y 65535 sería:
* soft nofile 1024 * hard nofile 65535
O directamente por consola:
ulimit -nH 65535 ulimit -nS 1024
La opción que recomienda Plesk para no tener que reiniciar apache y que está disponible desde la version 8.2 es esta:
http://kb.parallels.com/en/2066
mysql -uadmin -p`cat /etc/psa/.psa.shadow` psa -e "replace into misc (param,val) values ('apache_pipelog', 'true');"
/usr/local/psa/admin/sbin/websrvmng -v -a
/etc/init.d/apache restart
Otra opción alternativa es mirar los limites del kernel con sysctl
Se podría forzar de las siguientes formas:
echo 65535 > /proc/sys/fs/file-max
O bien agregar en /etc/sysctl.conf la linea
fs.file-max=65535
Si el error no es aplicable a Plesk, se puede intentar eliminar los semaforos que usa apache con esta linea :
ipcs -s | grep apache | awk '{print $2}' | xargs ipcrm -s