Archive for Linux
January 15, 2008 a las 4:18 pm por Edwin Plauchu · Archivado en Ubuntu, Programacion, Linux
Introduccion
Lenguajes script como Perl, Python, Php, Ruby y Tcl estan recibiendo bastante atencion hoy en dia - principalmente porque estos lenguajes facilitan el desarrollo de aplicaciones y prototipos de las mismas de un modo impresionantemente acelerado. Puedo decir como experiencia que al momento de usar python, el tiempo de desarrollo ha sido drasticamente bajo - con la ventaja agregada de la robustes y flexibilidad del codigo. Pero habra situaciones en las que el scripting puro no trabajara como lo deseamos, un ejemplo tipico de esto son las aplicaciones cientificas que requieren una alta velocidad de calculo para rutinas graficas o aplicaciones que requieren controlar o coordinar hardware en base a tiempo real. Entonces he llegado a la conclucion paradigmatica de que lo que necesito es un lenguaje mezclado, en el cual lenguajes tradicionales como C/C++ realicen lo duro del bajo nivel , mientras la logica de la app la pueda realizar en modo Scripting.
Este articulo se enfoca principalmente en el uso de una herramienta que se enfoca a la creacion de Wrappers, con la intencion de integrar el codigo escrito en C/C++ con el popular lenguaje scripting Python. Los fragmentos de codigo en este articulo fueron probados sobre un ubuntu gutsy y una version de Python 2.5.1. Espero que todo eso te sean tan util como a mi.
Obtener SWIG
SWIG es desarrollado por Dave Beazley y puede ser descargado de www.swig.org. o bien puedes instalaro mediante la herramienta apt-get de tu debian… ojo tambien requieres g++ y python2.5-dev.
apt-get install swig g++
Un ejemplo simple
Diremos que tenemos una funcion llamada suma(a,b) escrita en codigo C la cual nos retornara la suma de dos numeros que le sean pasados como argumentos. Veremos como usar la funcion “suma” desde Python. Crearemos el archivo de nombre aritmetica.c el cual contendra el siguiente codigo:
int suma(int a, int b)
{
return a+b;
}
Ahora ejecutaremos el siguiente comando:
swig -python -module aritmetica aritmetica.c
Esto nos retornara lo siguiente:
root@pianodaemon-laptop:/home/pianodaemon$ ls -l
total 100
-rw-r--r-- 1 pianodaemon pianodaemon 41 2008-01-15 15:48 aritmetica.c
-rw-r--r-- 1 pianodaemon pianodaemon 1605 2008-01-15 15:48 aritmetica.py
-rw-r--r-- 1 pianodaemon pianodaemon 92723 2008-01-15 15:48 aritmetica_wrap.c
Observemos que fueron creado 2 nuevos archivos, aritmetica_wrap.c y aritmetica.py. Nosotros deberiamos ahora de compilar ambos aritmetica.c y aritmetica_wrap.c para producir archivos de codigo objeto, la compilacion sera con el siguiente comando:
root@pianodaemon-laptop:/home/pianodaemon$ gcc -I/usr/include/python2.5/ -c aritmetica.c aritmetica_wrap.c
Observe que ya logramos compilar el codigo objeto con exito.
pianodaemon@pianodaemon-laptop:~/gulsinborrame$ ls -l
total 136
-rw-r--r-- 1 pianodaemon pianodaemon 41 2008-01-15 15:48 aritmetica.c
-rw-r--r-- 1 pianodaemon pianodaemon 707 2008-01-15 16:15 aritmetica.o
-rw-r--r-- 1 pianodaemon pianodaemon 1605 2008-01-15 16:11 aritmetica.py
-rw-r--r-- 1 pianodaemon pianodaemon 92723 2008-01-15 16:11 aritmetica_wrap.c
-rw-r--r-- 1 pianodaemon pianodaemon 28884 2008-01-15 16:15 aritmetica_wrap.o
Ahora procedemos a generar un libreria compartida, para eso utilizaremos el enlazador de linux ld:
ld -shared -o aritmetica.so aritmetica.o aritmetica_wrap.o
Finalmente probaremos la libreria que hemos generado:
import aritmetica
>>>aritmetica.suma(10, 20)
30
>>>aritmetica.suma(10, -10)
0
>>>
January 11, 2008 a las 12:04 pm por Edwin Plauchu · Archivado en Windows, Programacion, GPL, FreeBSD, Linux, Solaris
Vamos a crear un buscador que busque en una tabla de nuestra base de datos y que según el número de palabras buscadas utilice LIKE o el Full Text Search de MySQL.
Que és Full Text Search?
El Full Text Search utiliza los índices de la tabla para hacer las búsquedas y hace las comparaciones de la misma forma que se hacen en los grandes buscadores y no como una comparación sencilla y costosa en tiempo como la utilizada por el like.
El resultado que devuelve es ordenado por similitud a las palabras o cadena buscada, esto se puede hacer ya que cuando va encontrando los resultados el mismo le asigna un indice de similitud a lo buscado, con lo que podemos saber lo exacto que es el resultado.
Para crear el índice en la tabla a buscar haremos:
ALTER TABLE noticias ADD FULLTEXT(titulo, texto);
Suponiendo que la tabla se llama noticias y los campos que queremos buscar són titulo y texto. Debemos tener en cuenta que los campos del índice solo pueden ser Char, Varchar o TEXT.
Nota: Los índices hacen que las tablas ocupen más espacio en disco peró agilizan mucho las búsquedas.
MATCH … AGAINST
Para buscar en la tabla utilizando el índice, haremos:
SELECT * FROM el índice WHERE MATCH(titulo, texto)
AGAINST ('palabras_a_buscar')
Si queremos saber noticias de similitud del resultado podemos hacer:
SELECT * FROM noticias WHERE MATCH(titulo, texto)
AGAINST ('palabras_a_buscar') AS similitud
Donde similitud sera el valor de aproximación a la busqueda.
Problemas del MATCH … AGAINST
El problema principal es que ens busquedas de una sola palabra acostumbra a fallar, ya que tiene un límite dado por el MySQL de busqueda de palabras mayores o iguales a 4 carácteres, por lo que si buscasemos por ejemplo PHP no tendriamos resultado. Lo que haremos es mirar si la cadena que nos llega es de una sola palabra o de más de una, en caso de ser una haremos la búsqueda usando LIKE y si es más de una usaremos MATCH … AGAINST Buscador con paginación.
//Conectar con la base de datos,
//también podemos poner el ADODB
//Yo utilizo conexiones con código directamente aquí
include ("conexion_bd.php");
if ($p_busca!='')
{ if (!$num) $num=0;
//Separamos las palabras usando cada espacio como separador
//Hacemos la separación de la cadena a buscar
$cadena_buscada=explode(" ",$p_busca);
if (count($cadena_buscada)==1)
{
//Si solo hay una palabra usamos LIKE
$sql=" SELECT SQL_CALC_FOUND_ROWS titulo, texto
FROM noticiasLIKE '%".$p_busca."%' OR texto LIKE '%".$p_busca."%'
WHERE titulo
LIMIT ".$num.",10";
}
elseif (count($cadena_buscada)>1)
{
//Si hay más de una palabra usaremos MATCH AGAINST
$sql=" SELECT SQL_CALC_FOUND_ROWS titulo, texto, MATCH (titulo, texto)
AGAINST MATCH (titulo,AS Score FROM noticias
('".$p_busca."') texto) AGAINST ('".$p_busca."')
WHERE BY Score DESC LIMIT ".$num.",10";
ORDER
}
$rs = $db->Execute($sql);
if (!$rs) echo $conn->ErrorMsg();
else if ($rs->fields["id"])
{ while (!$rs->EOF)
{ echo $rs->fields["titulo"].'‘.$rs->fields[”texto”];
} $rs->MoveNext();
}
else
echo ‘No se han encontrado resultados correspondientes a su búsqueda.’;
//Paginación
$rs_cont=$db->Execute (”select found_rows() as total_filas”);
if ($rs_cont->fields[”total_filas”]>10)
{ for ($i=0; $i<$rs_cont->fields[”total_filas”] && $i<50; $i=$i+10)
{ $a++;
echo '[’.$a.’] ’;
} }
}
December 28, 2007 a las 2:42 pm por Edwin Plauchu · Archivado en FreeBSD, Linux, Solaris
Los siguientes criterios de configuracion, los he aplicado a un servidor de 8 cores y 8 gb en RAM, y la cosa funciona de maravilla.
Sobre el MYSQL que corre en este servidor hay tablas tanto innodb como myisam. incluyo parametros para las dos engines.
[mysqld]
innodb_log_buffer_size=8M
#Explicacion: medida del buffer que innodb usara para su archivo de log.
#Consecuencia:Un buffer de log grande, permite a transacciones extensas ejecutarce, sin necesidad de acceso a disco antes de que la
# transaccion se confirme.
#Criterio de calculo: 1MB por cada GB de RAM.
innodb_buffer_pool_size=4294967296
#Explicacion: Empleado para almacenamiento intermedio de los datos e indices de sus tablas
#Consecuencia: Mientras mas grande sea este valor menos operaciones de IO disco seran necesarias para acceder a los datos de las tablas.
#Criterio de calculo: En un servidor de base de datos dedicado se puede asignar hasta el 80% de la memoria RAM. No dedicados Menos del 50% de RAM.
innodb_buffer_mem_pool_size=16M
#Explicacion: almacena info del diccionario de datos y estructuras internas, el valor por defecto es de 1MB
#Consecuencia: Evita que se haga paginacion a disco cuando, se acaba la memoria de este pool.
#Criterio de calculo: Entre mas tablas se tengan en la aplicacion, mayor debera ser el tamaño de este buffer,.
join_buffer_size=16777216
#Explicacion: buffer que se usa para joins que no usan índices (full joins)
#Consecuencia: obtencion de un full join más rápido ( cuando se añaden índices no es posible.)
#Criterio de calculo:2097152 bytes por cada Gigabyte de RAM.
skip-bdb
skip-ndbcluster
#Explicacion: Deshabilita el soporte para base de datos bdb y ndbcluster
#Consecuencia: Ahorro en la memoria asignada por sistema operativo al proceso mysqld
innodb_data_file_path=/dev/hdc1:250MBraw;/dev/hdc2:250MBraw
#Explicacion: Utilizar dispositivos crudos como Datafiles
#Consecuencia: Aumento en velocidad relacionada a operaciones de IO sobre disco.
query_cache_size=134217728
#Explicacion: Almacena el texto de una consulta SELECT junto con el resultado que se le envió al cliente.
#Consecuencia: Si se recibe una consulta idéntica posteriormente, el servidor devuelve el resultado de la
# caché de consultas en lugar de parsear y ejecutar la consulta de nuevo.
#Criterio de calculo:16777216 bytes por cada Gigabyte de RAM.
query_cache_limit=1M
#Criterio de calculo: consultas menores a 1MB no merecen ser cacheadas.
query_cache_type=1
#Consecuencia: Permite el cacheo excepto para aquellos comandos que empiecen con SELECT SQL_NO_CACHE
key_buffer_size=100663296
#Explicacion: Cachea los bloques de índices para tablas MyISAM. Cada vez que una búsqueda usa un índice,
# MySQL mirará antes de nada a ver si el índice relevante está o no en memoria.
#Consecuencia: Incrementando el valor se obtiene un mejor tratamiento de índices y por consecuencia, mejor rendimiento.
#Criterio de calculo:12582912 bytes por cada Gigabyte de RAM. Pero si solo se utilizan tablas MyISAM utilice 5% a 50% de la RAM.
sort_buffer=67108864
#Explicacion: Búffer de ordenación se usa para responder a búsquedas que involucren el ordenamiento de los datos -aquellas
# con una sentencia ORDER BY en ellas. Además, el búffer de ordenaciónse usa para las búsquedas que involucren
# agrupar datos -aquellas con una sentencia GROUP BY.
#Consecuencia: Reduce dramáticamente la cantidad de tiempo que se usa para ordenar grandes grupos de resultados
#Criterio de calculo: 8388608 bytes por cada Gigabyte de RAM.
read_buffer_size=8M
#Explicacion: Cada thread que realiza un escaneo secuencial reserva un buffer de su tamaño (en bytes) para cada tabla que escanea.
# Si realiza muchos escaneos secuenciales, puede incrementar este valor.
#Consecuencia: Mejora el rendimiento en los escaneos secuenciales.
#Criterio de calculo: 1MB por cada Gigabyte de RAM.
open_files_limit=4096
#Explicacion: limite de archivos abiertos por mysql
#Consecuencia: Ciertas operaciones requeriran mas de 1024 descriptores de archivos abiertos en mysqld, sobre todo aplicaciones web.
#Criterio de calculo: 1024 es el predeterminado, aumente este valor si observa errores referentes a esto en el log de errores de mysql.
# No aumente este valor mas alla de 4kb.
[mysqldump]
quick
Si tienen algo que agregar a esta configuracion, u algun otro criterio, lo anexare a este articulo a la brevedad.
Feliz año nuevo 2007 
December 27, 2007 a las 12:33 pm por Edwin Plauchu · Archivado en Linux
Dandole Tuning al swappiness para prevenir una catastrofe en RAM improvisada
Swappiness es el termino que los desarrolladores del kernel de linux dieron al rendimiento entre aplicaciones que paginan hacia el disco y (en la practica) a la contraccion de las caches. Si Swappiness fuece establecida a 0, Linux preferirá mantener applicaciones en RAM y no engrandecer los caches. Caso contrario, si establecieramos Swappiness a 100, Linux preferirá hacer swap a las aplicaciones, y alargar los caches lo mas posible. El parametro de 60 por default que viene en la mayoria de los sistemas linux suele ser algo saludable.
La ironia de esta preferencia Swappiness radica en este factor, paginando una aplicacion no esta siendo utilizada generalmente producira un incremento sobre el rendimiento de red, ya que el cache realmente ayuda a esto muchisimo cuando este es requerido — pero este aumento sobre el rendimiento de red, se traducira en una fuga del rendimiento percivida, lo notaras cuando tu aplicacion descomprima un archivo con algunos segunditos de retraso, tal vez eso no te importe en el momento que suceda, pero cuando si te llega a importar, sera el momento en que tu aplicacion ya no te responda de manera instantanea :).
Sobre mi laptop, se me ha ocurrido aplicar el swappiness lo mas cercano a cero. La razon de por que se me ocurrio hacer esto? Lo hago por que deseo inmunizar mi laptop contra esas pequeñas interrupciones de tiempo causadas por la manipulacion de grandes archivos temporales (pienso hacer una copia de un archivo grande de video hacia otro disco). El cache debera de ser lo mas grande posible, pero esto no debera desplazar a las demas aplicaciones que ya se encuentran corriendo.
No me crees ? Si tienes 2 gb para usar sobre tu particion / , entonces que esperas incredulo corre los siguientes comandos en el siguiente orden:
sync
echo 3 > /proc/sys/vm/drop_caches
dd if=/dev/zero of=/tmp/archivobasurita count=1 bs=900M
find / > /dev/null && cp /tmp/archivobasurita /tmp/archivobasurita2
La tiempo consumido en la ejecucion de los anteriores comandos fue de 6:20 min:seg. Desesperantemente lento no ? Imagina como pueden tus aplicaciones podrian esperar, mientras el disco duro centellea con su lucecita frenéticamente :)…..
Muy bien, ahora modifiquemos el swappiness de nuestro sistema. (por supuesto como root):
sysctl -w vm.swappiness=1
intenta otra vez con los comandos de arriba. Sientes la diferencia, el tiempo se redujo a 2:05 min:seg?
La razon de esta rapidez, cuando tenemos el swappiness casi a cero, El nucleo de Linux no aumenta el cache para que las aplicaciones paginen, dandote una experiencia de rapido acceso a memoria.
Para hacer este cambio permanente, escribe vm.swappiness=1 sobre tu archivo /etc/sysctl.conf.
Los caches del sistema de archivos son mas importantes que otros caches
Existen dos tipos de caches en un Linux VFS.
* Block cache: contiene cache de dispositivos de bloque
* inode/dentry(inodo y de entrada de directorio): una capa sobre el block cache, el cache de entrada de directorios y otros sistemas de archivos relacionados, tienen para el sistema linux un costo de busqueda mucho mayor, al del cache de dispositivos de bloque.
Ya establecimos que la cache del sistema de archivos es importante ya que, sin esta, la busqueda y manejo de los archivos seria extremadamente lenta. Ahora aprenderemos como decirle a linux que cache preferimos inode/dentry u otras caches.
Probemos esto:
sync
echo 3 > /proc/sys/vm/drop_caches
dd if=/dev/zero of=/tmp/basurita count=1 bs=900M
sysctl -w vm.vfs_cache_pressure=100
find / > /dev/null
cp /tmp/basurita /tmp/basurita2
time find / > /dev/null
sysctl -w vm.vfs_cache_pressure=50
find / > /dev/null
cp /tmp/basurita2 /tmp/basurita3
time find / > /dev/null
rm -f /tmp/basurita /tmp/basurita2 /tmp/basurita3
Esta serie de comandos lo que hace basicamente es, buscar todos los archivos sobre tu disco, despues crear grandes archivos. Esto se hace 2 veces, la primera vez con las parametros por default del cache, y la segunda vez con los parametros del cache fuertemente orientados a favor de la cache inode/dentry.
Observaste la salida de los anteriores comandos. Notaste que la segunda vez que se corren los comandos realmente se consume menos tiempo? Esto definitivamente reduce los tiempos sobre nuestro equipo gnu linux. Cuando este knob(perilla o boton de mando, segun el diccionario de proyecto lucas Ver 0.1.6 ) esta cercano a 1, el kernel preferira proteger la cache inode/dentry por estar liberando block cache primero.
Para hacer este cambio permanente, agrega vm.vfs_cache_pressure=50 sobre tu archivo /etc/sysctl.conf.
Experimenta con este valor. Valores proximos a 100 no proveen ninguna ganancia en rendimiento. Valores cercanos a cero pueden causar enorme actividad swap durante la escaneo de grandes sistemas de archivos.
December 27, 2007 a las 10:52 am por Edwin Plauchu · Archivado en Linux
En MySQL 5.0, puedes usar particiones crudas(raw disk partitions) como espacio de tables(tablesspace) con datafiles. El rendimiento obtenido al hacer uso de una particion o dispositivo crudo, es considerable, con esto se evita el uso de el buffer-cache, recurso generalmente utilizado cuando se accesa a cualquier sistema de archivo en entornos Linux, lo cual generalmente decrementa el rendimiento de Mysql cuando este usa Innodb.
Cuando creas un data file, deberas colocar la palabra clave newraw inmediatamente despues la medida del data file en innodb_data_file_path. Deberas de especificar una medida que no sea mas grande que el tamaño de tu particion.
Nota: Un 1MB sobre InnoDB es 1024 * 1024 bytes, donde 1MB usualmente es 1,000,000 bytes en especificaciones de disco.
[mysqld]
innodb_data_home_dir=
innodb_data_file_path=/dev/hdc1:250MBnewraw;/dev/hdc2:250MBnewraw
[root@localhost ~]$ /etc/init.d/mysql stop
Shutting down MySQL [ OK ]
[root@localhost ~]$ /etc/init.d/mysql start
Starting MySQL [ OK ]
Retocamos el archivo de configuracion y procedemos a quitar el prefijo new
[mysqld]
innodb_data_home_dir=
innodb_data_file_path=/dev/hdc1:250MBraw;/dev/hdc2:250MBraw
[root@localhost ~]$ /etc/init.d/mysql restart
Shutting down MySQL [ OK ]
Listo, ya tienes a mysql funcionando con innodb datafiles en particiones raw.
December 21, 2007 a las 10:25 am por Edwin Plauchu · Archivado en Linux
Introduccion — Que es un prueba de Stress ?
Las pruebas de stress, son aquellas pruebas que tratan de probar o visualizar el comportamiento de un sistema gnu/linux bajo condiciones demandantes. Las pruebas de stress sobre un periodo de tiempo, permitiran darnos la confianza que realmente estamos comparando manzanas con manzanas y naranjas con naranjas.
Pero cual es la metodologia a seguir para llevar a cabo una prueba de stress sobre sistemas gnu/Linux?.
Metodologia — Evaluacion de la utilizacion de los recursos del sistema
La seleccion de pruebas adecuadas puede stresar los recursos del sistema. Cuatro areas principales del sistema gnu/Linux afectaran la respuesta y tiempo de ejecucion:
* CPU: Tiempo consumido en el procesado de daatos sobre el o los CPU(s) de una maquina.
* Memory: Tiempo consumido en lectura y escritura para y proveniente de la memoria real.
* I/O: Tiempo consumido en lectura y escritura para y proveniente de la unidad de almacenamiento.
* Networking: Tiempo consumido en lectura y escritura para y proveniente de la red.
Metodologia — Las Herramientas de los Testers
Los diseñadores de pruebas deberan conocer muy bien las siguientes dos herramientas, ya que les permitiran evaluar los niveles de utilizacion de los recursos del sistema.
* top: Una herramienta open source, cuyo proyecto es lidereado por Albert D. Cahalan, herramienta que por lo general esta incluida en la mayoria de las distribuciones linux sobre los kernels 2.4.X y 2.6.X.
* sar: Otra herramienta open source; la cual es lidereada por Sebastien Godard. Esta herramienta es tambien incluida en la mayoria de las distribuciones Linux y trabaja sobre los kernels 2.4.X y 2.6.X.
* stress: Generador de carga de trabajo (workload) para sistemas POSIX. Cargara de trabajo a la CPU(s), memoria, discos. Programa escrito en ensamblador bajo la licencia GPL.
Para evaluar la utilizacion de los recursos del sistema, se requerira multiples pruebas combinadas, que puedan alcanzar el nivel de utilizacion deseado. La Sobre-Utilizacion es siempre un objetivo de las pruebas que se aplicaran. Haciendo referencia a esto, podriamos tener el siguiente caso, escoger una combinacion de pruebas con bastante I/O que pueda llevar a la o los CPU(s) ha tener un rendimiento pobre y vice versa.
Metodologia — Las Herramientas de los Testers — Diferencias entre sar y top
La herramienta top es muy usada para determinar rapidamente cuales recursos (CPU, memory, o I/O) afecta cada prueba y que proporcion de estos es utlizada en el preciso momento en que se ejecuta la prueba. En cambio la herramienta sar es usada para la recoleccion de datos estadisticos de la utilizacion de red y tambien registrara los estados(snapshots) de la utilizacion total del sistema en cierto periodo de tiempo.
Una vez que has seleccionado una combinacion de pruebas a correr sobre tu gnu/linux, una prueba debera de ejecutarce durante cierto periodo de tiempo que sea adecuado para la evaluacion de la utilizacion del recurso. El monto de tiempo que la prueba corra sera algo muy particular de cada prueba. Asumiendo que multiples pruebas estan siendo executadas concurrentemente, El monto de tiempo debera de ser lo suficientemente largo para que todas esas pruebas se completen. La herramienta sar debera de estar corriendo durante este periodo de evaluacion. Mientras las pruebas corren sar se mantendra recolectando todos los niveles de utilizacion de todos los recursos.
El siguiente ejemplo muestra la salida referente a CPU, memoria, y utilizacion de red:
10:48:27 CPU %user %nice %system %iowait %idle
10:48:28 all 0.00 0.00 0.00 0.00 100.00
10:48:29 all 3.00 0.00 1.00 0.00 96.00
10:48:30 all 100.00 0.00 0.00 0.00 0.00
10:48:31 all 100.00 0.00 0.00 0.00 0.00
02:27:31 kbmemfree kbmemused %memused kbswpfree kbswpused %swpused
02:29:31 200948 53228 20.94 530104 0 0.00
02:31:31 199136 55040 21.65 530104 0 0.00
02:33:31 198824 55352 21.78 530104 0 0.00
02:35:31 199200 54976 21.63 530104 0 0.00
02:27:31 IFACE rxpck/s txpck/s rxbyt/s txbyt/s
02:29:31 eth0 738.79 741.66 76025.55 136941.85
02:31:31 eth0 743.30 744.97 76038.82 136907.77
02:33:31 eth0 744.80 745.02 76135.53 136901.38
02:35:31 eth0 742.35 744.34 75947.45 136864.77
Metodologia — Las Herramientas de los Testers — Recopilar datos sobre el rendimiento con sar
El programa que se ocupa de recopilar la informacion se llama sadc (system activity data collector o recolector de datos de la actividad del sistema). Obtiene su informacion, principalmente del kernel, a traves del sistema de archivos virtual en /proc. Despues guarda los datos sobre un archivo (uno por dia en /var/log/sa/sarDD, donde DD hace referencia al dia del mes). sar tambien inclulle 2 scripts que se ejecutaran con cron:
* sa1: recopila datos de forma regular.
* sa2: utlizado para crear los informes sintetizados
Un ejemplo de estos script sobre la tabla cron:
# Ejecuta la herramienta de recopilacion de datos cada 10 minutos
*/10 * * * * root /usr/lib/sa/sa1 1 1
# Genera un informe diario del rendimiento de los procesos a la 23:59
59 23 * * * root /usr/lib/sa/sa2 -A
Metodologia — Las Herramientas de los Testers — Creando informes para medir el rendimiento del sistema
Si los informes diarios creados por el script sa2 no son suficientes, puedes crear los tuyos propios utilizando sar. Por defecto este programa obtiene la informacion del archivo de datos del dia actual, a menos que se especifique lo contrario. Para hacer que sar obtenga los datos de un archivo en particular, utilizamos la bandera -f /var/log/sa/saDD. Puedes seleccionar multiples archivos usando varias banderas -f. Dado que muchos de los informes que crea sar tienen un tamaño considerable, puede que quieras redirigir la salida a un archivo.
Para crear un informe basico que muestre el uso de CPU y el porcentaje de tiempo gastado esperando E/S, ejecutamos sar sin ningun argumento:
01:10:00 PM CPU %user %nice %system %iowait %idle
01:20:00 PM all 7.78 0.00 3.34 20.94 67.94
01:30:00 PM all 0.75 0.00 0.46 1.71 97.08
01:40:00 PM all 0.65 0.00 0.48 1.63 97.23
01:50:00 PM all 0.96 0.00 0.74 2.10 96.19
02:00:00 PM all 0.58 0.00 0.54 1.87 97.01
02:10:00 PM all 0.80 0.00 0.60 1.27 97.33
02:20:01 PM all 0.52 0.00 0.37 1.17 97.94
02:30:00 PM all 0.49 0.00 0.27 1.18 98.06
Average: all 1.85 0.00 0.44 2.56 95.14
* Si %idle (desocupado) esta cerca de cero, la CPU entonces esta sobrecargada.
* Si el valor %iowait(espera por e/s) es grande, tus discos estan sobrecargados.
Para comprobar como se comporta el fichero de paginacion, ejecuta sar -B para obtener un informe similar al siguiente:
11:00:00 AM pgpgin/s pgpgout/s fault/s majflt/s
11:10:00 AM 8.90 34.08 0.00 0.00
11:20:00 AM 2.65 26.63 0.00 0.00
11:30:00 AM 1.91 34.92 0.00 0.00
11:40:01 AM 0.26 36.78 0.00 0.00
11:50:00 AM 0.53 32.94 0.00 0.00
12:00:00 PM 0.17 30.70 0.00 0.00
12:10:00 PM 1.22 27.89 0.00 0.00
12:20:00 PM 4.11 133.48 0.00 0.00
12:30:00 PM 0.41 31.31 0.00 0.00
Average: 130.91 27.04 0.00 0.00
Puede que el número de veces que se ha tenido que recurrir a la paginación no sea determinante, pero el que exista un alto número de fallos mayores de página (majflt/s) indica que el sistema necesita más memoria.
Para obtener estadísticas de red, utilizamos sar -n DEV. Este comando genera un informe que muestra estadísticas con los datos transmitidos y recibidos para cada interfaz de red. Veamos una versión abreviada de este informe:
11:00:00 AM IFACE rxpck/s txpck/s rxbyt/s txbyt/s
11:10:00 AM lo 0.62 0.62 35.03 35.03
11:10:00 AM eth0 29.16 36.71 4159.66 34309.79
11:10:00 AM eth1 0.00 0.00 0.00 0.00
11:20:00 AM lo 0.29 0.29 15.85 15.85
11:20:00 AM eth0 25.52 32.08 3535.10 29638.15
11:20:00 AM eth1 0.00 0.00 0.00 0.00
Para ver los errores de red, prueba con el comando sar -n EDEV
Metodologia — Las Herramientas de los Testers — Creando informes para medir el rendimiento del sistema — Informes en tiempo real
También podemos utilizar sar para ver que está pasando en este preciso momento con un componente del sistema. Si le pasamos un intervalo de tiempo (en segundos) y el número de informes a producir, podemos obtener información inmediata sobre un posible cuello de botella.
Por ejemplo, para ver el informe básico cada segundo durante los próximos 10 segundos, usaríamos sar 1 10. Cualquiera de las combinaciones de banderas anteriores se pueden ejecutar con estos parámetros para obtener resultados cercanos al tiempo real.
Metodologia — Las Herramientas de los Testers — Recopilar datos sobre el rendimiento con sar — Fugas de rendimiento (extra topic)
Fuera del tema de las pruebas de strees en linux. Si sospechas que puede existir algun problema de rendimiento con cierto programa en particular que ya le causa bastante stress a tu sistema gnu/linux, tambien puedes utilizar sadc para recopilar datos sobre ese proceso(-x), o sus hijos(-X), pero necesitaras crear tu propio script que use estas banderas.
Incluso si contamos con potencia de sobra para correr nuestras aplicaciones, sar siempre puede ser útil para registrar cambios en el volumen de trabajo a lo largo del tiempo. Para hacer esto, guardaremos los informes (sar sólo guarda siete) en un directorio diferente durante un periodo de tiempo de unas pocas semanas o un mes. Este grupo de informes pueden servir como ejemplo del volumen de trabajo normal del sistema. Se pueden comparar los siguientes informes con estos resultados previos para ver cómo cambia el volumen de trabajo con el tiempo. Podemos incluso automatizar estos informes usando python, ruby, perl.
En la gestión de grandes sistemas, las pruebas de rendimiento son importantes para predecir qué hardware actualizar y cuándo hacerlo. También nos proporciona datos con los que justificar estas actualizaciones.
Las herramientas de los testers — Provocando stress a nuetro sistema GNU/linux
Stressar un sistema no significa que le haremos un benchmark, significa que le daremos una carga especifica para cada uno de sus subsistemas (cpu,user,nice,system,irq,softirq,iowait,idle). Los siguientes screenshots fueron realizados sobre un equipo llamado rome con 8 cpu(s).
Utilizare la herramienta top (tambien lo puedes hacer con sar si asi lo deseas) y la herramienta stress para mandarle cargas de trabajo a rome.
Las herramientas de los testers — Provocando stress a nuetro sistema GNU/linux — Carga de trabajo nula
Como ya estaras viendo en este screenshot, se muestran 2 terminales, una que espera cualquier orden especifica sobre bash y la otra ejecutando top (para visualizar el modo de multiples cpu(s) precione C en top).

Actualmente el sistema se encuentra en lo que podriamos llamar un estado muy relax. Tan solo habra que dar un vistazo a %idle cuyos niveles estan muy cerca del 100%.
Las herramientas de los testers — Provocando stress a nuetro sistema GNU/linux — Carga de trabajo para los CPU(s)
Sobre este screenshot, observa como al saturar las CPU(s) de carga, %idle se acerca cada vez mas a 0% y las CPU(s) cada vez mas al 100% de su saturacion.
Aqui la app stress es lanzado con 8 procesos sqrt(), lo que significa que ejecutaran 8 multiples ciclos infinitos de raices cuadradas.

Las herramientas de los testers — Provocando stress a nuetro sistema GNU/linux — Carga de trabajo para las llamadas al sistema
En este screenshot observa como el parametro -i 4 , introduce 4 ciclos infinitos que ejecutan la llamada al sistema sync(), generando con esto carga de trabajo para el subsistema system.

Las herramientas de los testers — Provocando stress a nuetro sistema GNU/linux — Carga de trabajo para los discos
Ejecutaremos con stress una carga de escritura de 3gb para los discos, observe como se dispara el %iowait:

Una vez finalizada la carga de trabajo, observa que en el directorio donde ejecutaste la app stress se te genero un archivo ascii producto de esta carga de trabajo realizada para el disco ( un archivo ascii de 3.0 gb ).
Las herramientas de los testers — Provocando stress a nuetro sistema GNU/linux — Mas informacion sobre la app stress
El formato para correr la aplicacion stress es la siguiente:
stress [opciones [args]] ...
stress suporta las siguientes opciones:
`-?'
`--help'
Show help information.
`--version'
Show version information.
`-v'
`--verbose'
Turn up verbosity.
`-q'
`--quiet'
Turn down verbosity.
`-n'
`--dry-run'
Show what would have been done.
`-t secs'
`--timeout secs'
Time out after secs seconds.
`--backoff usecs'
Wait for factor of usecs microseconds before starting work.
`-c forks'
`--cpu forks'
Spawn forks processes each spinning on `sqrt()'.
`-i forks'
`--io forks'
Spawn forks processes each spinning on `sync()'.
`-m forks'
`--vm forks'
Spawn forks processes each spinning on `malloc()'.
`--vm-bytes bytes'
Allocate bytes number of bytes. The default is 1.
`--vm-hang'
Instruct each vm hog process to go to sleep after allocating memory. This contrasts with their normal behavior,
which is to free the memory and reallocate ad infinitum. This is useful for simulating low memory conditions on a machine.
For example, the following command allocates 256M of RAM and holds it until killed.
% stress --vm 2 --vm-bytes 128M --vm-hang
`-d forks'
`--hdd forks'
Spawn forks processes each spinning on `write()'.
`--hdd-bytes bytes'
Write bytes number of bytes. The default is 1GB.
`--hdd-noclean'
Do not unlink file(s) to which random ASCII data is written.
Nota: Sufijos pueden ser s,m,h,d,y (para tiempo) o k,m,g (para tamaño).
pre>
Conclusiones
La cantidad de carga de trabajo que puedes asignar con la app stress, es algo muy variable, ya que la app stress al permitir combinar sus diferentes opciones de carga, te permitira la ejecucion de multiples pruebas combinadas. Y gracias a las herramientas sar y top, la medicion de recursos del sistema ya sea a modo de estadistica a intervalo de tiempo (con sar) o de informacion en el momento (con top), estaran siempre a disposicion de cualquier administrador de sistema gnu/linux.
November 13, 2007 a las 9:42 am por Edwin Plauchu · Archivado en Ubuntu, FreeBSD, Linux, Solaris
lsof (ls Open Files) o listado de archivos abiertos, es una gran aplicación pero bastante desconocida y que nos puede sacar de muchas dudas o apuros. lsof es una herramienta muy completa, por lo que en éste articulo solo se muestra la información que más vamos a necesitar.
NOTA: Si se quiere saber más sobre el uso de lsof ejecutad “man lsof “.
Utilidad de lsof.
Como he dicho antes, lsof muestra los archivos y procesos abiertos en el moment o del chequeo, por lo que nos será de utilidad para llevar un seguimiento de seguridad o de procesos bloqueados.
Desmontando un CD rebelde.
# umount /cdrom
umount: /cdrom: device is busy
Vaya, ¡¿por qué no se desmonta y me dice que el dispositivo está ocupado?! No se ha desmontado porque algun proceso esta haciendo uso del CDROM y hasta que no lo libere no podremos desmontarlo, el problema es que desconocemos que aplicacion se encuentra usando dicho CDROM, mediante lsof podremos conocerlo.
# lsof +D /cdrom
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
konqueror 621 zx80 cwd DIR 3,64 2048 57344 /cdrom
lsof nos dice que el proceso konqueror está usando el directorio /cdrom con el usuario zx80. La solución es sencilla entoces, basta con cerrar konqueror y problema resuelto. Para los que usamos mucho la consola y llegamos a tener unas cuantas sesiones abiertas pasa que en vez de konqueror puede salir bash. Esto es debido a que alguna de las consolas está dentro del directorio activo del cd-rom, por lo que bastaría salirse del directorio de trabajo del CD o cerrar ese bash.
# kill 621
Ya podemos desmontar.
Quien está detrás de una conexión ?
Esta vez usamos la herramienta netstat. Para quien no conozca esta herramienta decir que es un monitor de red. Nos dirá qué conexiones activas tenemos y mucha inform ación sobre ellas. Vamos a ver qué conexiones tenemos activas:
# netstat - n
Active Internet connections (only servers)
Proto Recv- Q Send - Q Local Address Foreign Address
tcp 0 0 *:printer *:* LISTEN
tcp 0 0 localhost:www *:* LISTEN
tcp 0 0 *:6000 *:* LISTEN
tcp 0 0 *:smtp *:* LISTEN
Nos muestra información sobre algunos puertos en espera (Listen) pero desconocemos qué aplicación está detrás. Me llama la atención el puerto TCP 6000, así que voy a ver quien está detrás:
# lsoft - i :6000
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
X 279 root 3u Ipv4 349 TCP *:3000 (LISTEN)
Vemos que la aplicacion X es la culpable de que el puerto 6000 esté abierto y a la espera.
Qué procesos están usando un directorio.
Una de las utilidades que más se usan es averiguar qué aplicaciones están trabajando en un directorio concreto. Se usa esta opción sobre todo para vigilar el uso de troyanos o espias. SI quisiera saber qué procesos están usando mi directorio pondría lo siguiente:
pianodaemon@pianodaemon-laptop:~$ lsof +D /home/pianodaemon/
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
x-session 5962 pianodaemon cwd DIR 8,1 4096 6684674 /home/pianodaemon/
compiz 6013 pianodaemon cwd DIR 8,1 4096 6684674 /home/pianodaemon/
gnome-pan 6015 pianodaemon cwd DIR 8,1 4096 6684674 /home/pianodaemon/
nautilus 6017 pianodaemon cwd DIR 8,1 4096 6684674 /home/pianodaemon/
emerald 6127 pianodaemon cwd DIR 8,1 4096 6684674 /home/pianodaemon/
compiz.re 6128 pianodaemon cwd DIR 8,1 4096 6684674 /home/pianodaemon/
................ ...
Otros usos.
Estos son otros usos de la herramienta lsof, que aunque son algo menos usados nos pueden sacar de algun apuro o duda.
# lsof - g n: Donde n es un ID de grupo.
Esto muestra los archivos abiertos por un grupo que queramos. Si quisieramos ver los archivos de varios grupos a la vez, los separariamos por comas:
# lsof - g wheel,users
# lsof - u n: Donde n es un ID de usuario, lo que nos mostrará los archivos abiertos por ese usuario. Al igual que con los grupos, se pueden especificar varios usuarios de una vez.
# lsof - l: Para no convertir el ID a nombre de usuario, útil en casos de logeos corruptos o sistemas lentos.
# lsof - N: Nos muestra los archivos NFS abiertos.
November 12, 2007 a las 11:56 am por Edwin Plauchu · Archivado en Programacion, FreeBSD, Linux, Solaris
Introducción
Como muchos ya saben, muchas cosas se manejan en Unix, y en consecuencia en Linux, como si fueran archivos, se abren, se cierran, se escribe en ellos, etc. Este pequeño artículo hace referencia a las marcas de tiempo que ponen los Unix en dichos archivos. Al menos los que estan basados en inodes.
Viendo las marcas de tiempos
Para el principiante el comando ls es su primera opción pero si entra en problemas, como yo lo hice, puede que se frustre con dicho comando. Ejemplo:
root@pianodaemon-laptop:/home/pianodaemon# ls -l proto.sh
-rw-r--r-- 1 pianodaemon pianodaemon 4878 2007-11-09 12:44 proto.sh
¿ En este caso qué marca de tiempo estamos viendo ?
Las tres marcas
Unix pone tres marcas de tiempo a un archivo:
stat el comando
stat es parte del paquete coreutils de GNU. Por favor, instalatelo si esta disponible para tu plataforma, hasta donde se, Linux, AIX, Solaris, y otros sabores de Unix, Esto te va a ahorrar muchos dolores de cabeza.
Cuando se crea por primera vez un archivo, por ejemplo con el comando touch, las tres marcas tienen el mismo valor. Miremos ahora la salida de stat del mismo archivo ejemplo:
root@pianodaemon-laptop:/home/pianodaemon# stat proto.sh
File: `proto.sh'
Size: 4878 Blocks: 16 IO Block: 4096 archivo regular
Device: 801h/2049d Inode: 6685006 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/pianodaemon) Gid: ( 1000/pianodaemon)
Access: 2007-11-09 17:27:44.000000000 -0600
Modify: 2007-11-09 17:27:44.000000000 -0600
Change: 2007-11-09 17:27:44.000000000 -0600
¡Esto si es información completa ! Vemos reportado, el nombre, el tamaño, los bloques, el tipo de archivo (regular), información física de donde se encuentra (dispositivo/inode), los permisos estandar, los dueños del archivo y las tres marcas de tiempo Unix.
Opciones interesantes de formato de salida del comando stat:
- %X Time of last access as seconds since Unix Epoch
- %x Time of last access
- %Y Time of last modification as seconds since Unix Epoch
- %y Time of last modification
- %Z Time of last change as seconds since Unix Epoch
- %z Time of last change
Las opciones en mayúscula nos imprimen la marca de tiempo transcurrido desde la Epoca Unix, y las opciones en minúscula imprimen la marca de tiempo legible para el humano.
Ejemplo:
root@pianodaemon-laptop:/home/pianodaemon# stat --format=%X proto.sh
1194650864
root@pianodaemon-laptop:/home/pianodaemon# stat --format=%x proto.sh
2007-11-09 17:27:44.000000000 -0600
Ambos “números” son equivalentes m¡s el primero es un número absoluto, el segundo es interpretado ya que muestra la configuración de la zona horaria (-0600). Mi configuración de hora/fecha es zona America/Mexico y uso UTC.
Marca de Tiempo
Las marcas de tiempo se almacenan en el inode del archivo correspondiente con, hasta donde he confirmado, 32 bits de codificacion. Estos enteros son con signo, los negativos representan fechas en el pasado de la época Unix, y los positivos, fechas futuras desde la época Unix. La época Unix es la hora/fecha 00:00:00 UTC del 1ero de Enero de 1970.
Algunos datos para desarrolladores Python
En lo personal prefiero el desarrollar scripts sobre el interprete Python a bash. Asi que uso stat sobre el mismo:
import os, glob
from stat import *
for folder in glob.glob( base_path ):
for file in glob.glob( folder + '/*.mp3' ):
print file
# retrieves the stats for the current file
# return the last-modified-date
last_mod_date = os.stat( file )[ST_MTIME]
print last_mod_date
November 6, 2007 a las 9:45 am por Edwin Plauchu · Archivado en Ubuntu, Linux
Hace unos dias (los pocos dias que llevo en telefonica mexico, aqui en el DF), un nuevo conocido y reciente usuario de linux, me hizo la siguiente pregunta…
Como puedo visualizar mis rutas, conecciones y puertos abiertos tcp/ip ?
Esto no es nada absolutamene del otro mundo, y muchos de ustedes creo que ya lo saben, aun asi, considero que es bueno contestar a este tipo de preguntas que son mas cotidianas de lo que uno piensa entre los usuarios newbies.
Le comente que le escribiria la respuesta en el blog de gulsin.. (creo que de esta manera… todos aquellos que se realizacen la misma pregunta en google sin duda obtendran el mismo beneficio que el..)
La orden netstat.
Esta orden se utiliza para visualizar el estado de diversas estructuras de datos del sistema de red, desde las tablas de enrutado hasta el estado de todas las conexiones del host donde se ejecuta.
Conexiones y puertos abiertos….
root@pianodaemon-laptop:/home/pianodaemon# netstat -at
Conexiones activas de Internet (servidores y establecidos)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 localhost:ipp *:* ESCUCHAR
tcp 0 0 pianodaemon-lapto:38621 fg-in-f191.google.c:www ESTABLECIDO
tcp 0 0 pianodaemon-lapto:34637 bu-in-f189.google.c:www ESTABLECIDO
tcp 0 0 pianodaemon-lapto:38622 fg-in-f191.google.c:www ESTABLECIDO
tcp 0 0 pianodaemon-lapto:38821 bu-in-f83.google.co:www ESTABLECIDO
tcp6 0 0 *:8009 *:* ESCUCHAR
tcp6 0 0 *:8180 *:* ESCUCHAR
Visualizando Rutas
root@pianodaemon-laptop:/home/pianodaemon# netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
10.225.181.128 0.0.0.0 255.255.255.128 U 0 0 0 eth0
172.16.142.0 0.0.0.0 255.255.255.0 U 0 0 0 vmnet1
192.168.10.0 0.0.0.0 255.255.255.0 U 0 0 0 vmnet8
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
0.0.0.0 10.225.181.131 0.0.0.0 UG 0 0 0 eth0
Eso es todo, pasenla chido……….
September 28, 2007 a las 11:36 pm por Rasta · Archivado en Windows, Linux
Mis favoritas:
>> Actualizaciones frecuentes y sin dolor todo el tiempo, Yo tengo un escritorio 3d(compiz) y una barra de busqueda(deskbar) por mas de un año sin problemas.
>> Multiple escritorios. facil, uno es muy poco para ser util.
checa la lista completa.