martes, 21 de enero de 2014

Ubuntu: controlando la velocidad de descarga de apt

Saludos a todos.

Esto es quizás algo que le ha pasado a casi todos mis amigos usuarios de las distros ubuntu y sus descendientes.

Hoy les tengo una solución sencillísima y práctica para un problema que se puede presentar tanto en casa como en el ambiente de trabajo.




En una ocasión tuve que utilizar la conexión de la empresa donde estaba realizando la instalación de algunos de mios servicios en un servidor Linux Ubuntu Server. Esto porque tuve la necesidad de actualizar algunos de los paquetes que estaban demasiado obsoletos en este servidor. Para esto utilicé el acostumbrado apt-get desde la línea de comandos:
  $> sudo apt-get dist-upgrade  

Con lo cual obtuve como siempre los paquetes que se debian actualizar debido a que estaban a la mano en los repositorios. Pero esta vez, para este servidor, me notificó que era necesario descargar más de 400Mb de archivos. Esto no es mucho, pero la conexión a internet del cliente (y es la unica que tienen por ahora) no era tan veloz (bueno, en venezuela el internet no es tan rápido), aún así, y con la debida autorización del cliente, me dispuse a aceptar la descarga.

Lo que no sabiamos era el impacto que tendría en las operaciones de los sistemas del cliente, el cual usaba algunos sistemas RTP/RTCP (Protocolo de Transporte para Tiempo real), crítico para un sistema de intercambio de información que manejaban a través de internet. En cuanto puse a descargar los paquetes usando dicha conexión, el rendimiento de la cnexión para el sistema del cliente se fué al piso.

En vista que la actualización no era crítica para el cliente, pero su sistema sí, tuve que suspender la actualización y dediqué unos minutos a buscar alguna solución rápida y fácil para actualizar el servidor sin impactar el sistema del cliente, esto para cuando me toque hacer actualizaciones de servidores linux en iguales condiciones de conexión de red.

Nada mas sencillo que la solución que encontré en los mismos foros de Ubuntu. Con unos parámetros pasados al comando apt-get:
 $> sudo apt-get -o Acquire::http::Dl-Limit=<velocidad> <comando> 

Con estos parámetros se logra establecer una velocidad máxima de descarga de <velocidad> kbps para los paquetes que están pendientes de actualizarse. El comando puede ser update, upgrade, dist-upgrade, etc. El comando que yo utilicé para la actualización limitada a 16kbps, y el cual dejo como ejemplo, fué el siguiente:
 $> sudo apt-get -o Acquire::http::Dl-Limit=16 dist-upgrade 

Además puede ser usado con los comandos update, upgrade, dist-upgrade, etc.

Saludos y hasta una próxima entrega.

Fuente: Ubuntu Forums


domingo, 19 de enero de 2014

Linux: Ver el consumo de una aplicación específica usando el comando top

Saludos a todos los amantes de Linux.

En ocasiones he observado que mi sistema se torna lento por haber iniciado algún proceso cuyo consumo de recursos del sistema no conocía con anticipación.



Es por esto que me dediqué nos minutos a buscar el mejor comando para ver el consumo de mis aplicaciones y es acá donde entra el comando "top". Este comando muestra una lista dinámica (según el orden seleccionado) con las aplicaciones en ejecución y su consumo de recursos:

$> top

Sin embargo me vi luego en la necesidad de ver el consumo de una aplicación específica conociendo el nombre de la misma. Por ejemplo: en un sistema con cinnamon (Linux Mint 15) observamos que se tornó lento el entorno por alguna razón, así que buscamos el consumo de la aplicación "cinnamon", y averiguamos un comando perfecto para esto:

$> top -p "`pgrep -d ',' php5`"

Obsérvense bien las "comillas invertidas" dentro de las comillas dobles, y las comillas simples que rodean la coma central.

Este comando nos mostrará una salida como esta:





Además muestra los valores de recurso de manera dinámica, por lo que tenemos toda la información necesaria del comportamiento de las aplicaciones cuyo nombre comiencen por la palabra "cinamon".

Para salir presionamos la tecla "Q" o usamos el acostumbrado "CTRL+C".

Hasta una próxima entrada.....



miércoles, 2 de octubre de 2013

Linux: Buscar texto dentro de los archivos de un directorio

En esta ocasión presento una solución simple y elegante para un problema que se presenta comúnmente para los programadores.

Como programador tengo cientos de miles de líneas de código en mis carpetas, y tengo cientos de carpetas en mi sistema. Muchas veces no recuerdo en qué archivo se encuentra cierto texto (alguna constante global, alguna función de un archivo incluido, etc), por lo que se me presenta el problema de hacer una búsqueda archivo por archivo de manera secuencial y dentro de cada subcarpeta.



Dicen que la mejor solución a un problema es generalmente la más simple. De todas las soluciones encontré la más simple para el ambiente Linux, usando la utilidad grep desde la línea de comandos:

$> grep -inr "texto a buscar!" /ruta/donde/estan/los/archivos

Con este comando se emite un texto con el nombre del archivo, el número de la línea donde está ubicado el texto, y el texto de la línea completa resaltando lo buscado.

Eso es todo, simple y limpio. Espero sea de utilidad.

sábado, 29 de junio de 2013

Para programadores: Simular una conexión de red lenta

Cuando se desarrollan aplicaciones web se hace muy necesario para los programadores simular una conexión de internet que en la mayoría de las veces se asemeje a la conexión promedio del usuario promedio, aunque si bien es cierto que las velocidades de acceso a internet son cada vez mayores, no está demás comprobar el comportamiento de nuestra aplicación para velocidades más semejantes a las del usuario real promedio.

En mi caso particular, me gusta probar mis aplicaciones en conexiones promedio de 56kbps a 128kbps, aunque, por supuesto, el rendimiento será mucho mejor si en la realidad se supera este límite.


Generalmente mis desarrollos los mantengo alojados en un servidor en una red local o, en algunos casos, en mi propia PC en casa. Cuando se accesa a las direcciones locales o a "localhost/127.0.0.1" el rendimiento del sistema es vertiginoso. Cuando lo pruebo desde una conexión remota es cuando me doy cuenta que el rendimiento no es tan satisfactorio. Es por esto que me puse a indagar en internet sobre si existía algún "simulador" de redes lentas, o alguna herramienta en la cual se pudiera configurar la velocidad de la conexión.

Yo me he convertido en asíduo usuario de Linux, aunque sin mucha experticia, pero me ha dado resultados muy satisfactorios usar este sistema operativo para trabajar. Para este sistema operativo conseguí una herramienta perfecta para lo que deseaba según lo comentado arriba. Esta herramienta es la llamada tc (traffic control), la cual permite configurar los aspectos más "reales" de cualquier conexión promedio a internet (o inferior, o superior, según el gusto).

Sin agregar más detalles técnicos que pueden ser consultados en páginas especializadas en internet, les proveo los comandos de "tc" que me han resultado utilísimos y que se asemejan más a una conexión real:

Para la activación en direcciones locales (locahost/127.0.0.1) configuramos la interfaz de red "lo":
$> sudo tc qdisc add dev lo root handle 1: htb default 12
$> sudo tc class add dev lo parent 1:1 classid 1:12 htb rate 56kbps ceil 128kbps
$> sudo tc qdisc add dev lo parent 1:12 netem delay 200ms

Para la desactivación:
$> sudo tc qdisc del dev lo root

Para consultar el estado actual del control de tráfico:
$> sudo tc -s qdisc ls dev lo

Si se desea utilizar para otras interfaces de red, tales como eth0..ethn o wlan0..wlann, sólo sustituimos lo por la interfaz que nos interese. Por ejemplo para la wifi: wlan0, nos quedaría como sigue:
Activación:
$> sudo tc qdisc add dev wlan0 root handle 1: htb default 12
$> sudo tc class add dev wlan0 parent 1:1 classid 1:12 htb rate 56kbps ceil 128kbps
$> sudo tc qdisc add dev wlan0 parent 1:12 netem delay 200ms
Desactivación:
$> sudo tc qdisc del dev wlan0 root

Sé que no es difícil escribir un script para ejecutar estos comandos y pasar la interfaz de red como parámetro. Algo así como $> slownet eth0 on/off. Eso prefiero dejárselo a otros expertos (o inexpertos aventureros, jejeje).

Espero que sea de utilidad para programadores web.

sábado, 22 de junio de 2013

Conexión SSH remota a un PC Linux dentro de una red LAN

No soy un experto Linux, pero en mis proyectos más reciente y personalmente estoy usando linux como sistema operativo. En varias ocasiones he tenido necesidad de conectarme de manera remota a algún PC o Servidor que se encuentra dentro de una red LAN para cumplir con algún mantenimiento, utilizando la herramienta ssh.

Esta LAN no está abierta para el acceso directo, pues la red LAN pertenece y es soportada por el cliente, por lo que casi siempre tengo obstáculos para conectarme (cortafuegos).

Para evitar estas situaciones protocolares con el cliente suelo instalar Logmein Hamachi, el cual tiene la gran ventaja de que funciona para los sistemas operativos que uso (Linux y Windows), y además me permite un acceso total por IP a través de una red virtual que mantiene unas direcciones IP estables.

En la mayoría de las ocasiones instalo esto en el servidor (Linux) para poder dar soporte directo al cliente.



Así para conectarme al servidor utilizo la IP que me otorga la red virtual de Hamachi de la siguiente manera:
$> ssh -l usuario <IP Hamachi>

Sin embargo he tenido últimamente necesidad de conectarme a más de un PC Linux dentro de esta red LAN. Lo primero que pensé fué en instalarle a todos esos PC el Logmein Hamachi, sin embargo no me agradaba la idea de tener esa lista extensa de PC's en mi lista de nodos de hamachi, por lo que busqué información sobre si era posible, teniendo un solo computador en la red virtual, conectarse a cualquier otro dentro de esa red LAN, y voilá: la herramienta ssh permite una conexión limpia a cualquier computador usando una sola IP virtual.

Lo único que hace falta es saber la dirección IP (o nombre, según cómo se use) del PC destino dentro de la red LAN.

Para esto se usa el comando ssh de la siguiente manera:
$> ssh -A -t -l <usuario del PC que tiene hamachi> <ip hamachi> ssh -l <usuario del PC en la LAN> <IP/nombre del PC en la LAN>

Así, suponiendo que la IP del computador que tiene instalado hamachi es 25.55.55.55, usuario1, y la IP del computador dentro de la LAN al que nos interesa conectarnos fuera 192.168.0.57, usuario2, el comando quedaría así:
$> ssh -A -t -l usuario1 25.55.55.55 ssh -l usuario2 192.168.0.57

Como es de esperar, la utilidad ssh pedirá las contraseñas de manera secuencial, es decir, primero la del PC con hamachi y luego la del PC en la LAN.

Si fuera necesario hacer más de un "salto" ssh a través de más de una red, el comando funciona de igual forma:
$> ssh -A -t -l usuario1 ip1 ssh -A -t -l usuario2 ip2 ... ssh -l usuarion ipn

Espero que sea de utilidad a aquellos que, como yo, no son tan expertos en este fabuloso sistema operativo.