lunes, 24 de junio de 2013

Control de ancho banda "low-cost"

más low-cost que otra cosa ...

Buenas tardes, para unos inventitos que estoy preparando, necesito dar prioridad a ciertas cosas en relación al ancho de banda con internet. Soluciones para el control de ancho de banda, QoS, packet filter y demás, hay cientos, pero casi ninguna encaja en mi infraestructura de red doméstica. Así que he preparando un par de configuraciones con las que conseguir el mismo efecto, sin necesitar más hardware.

Os recuerdo mi infraestructura de red:
es de lo más simple que puede haber. Uno de los problemas lo tengo en que es el RaspberryPi el que tiene todos los servicios: transmission, vozip, demonios, notificaciones ... Por lo que hacer una priorización (con el ruter de Jazztel) de trafico, esta complicado.
El mayor (casi el único en mi caso) absorvedor de ancho de banda es el Transmission, así que vamos a asegurarnos de algunas configuraciones, en el archivo setings.json:
    "alt-speed-down": 50,
    "alt-speed-enabled": false,
    "alt-speed-up": 10,

Como vemos, establecemos la velocidad alternativa a esos valores. Con esa velocidad no tendremos problemas en usar un proveedor de vozip o publicar nuestro servicio en la nube. Así que lo siguiente es ...

Demonio para monitorizar ordenes de velocidad alternativa

Si ejecutamos en nuestro RaspberryPi:
transmission-remote -as


veremos que el transmission entra en el modo de velocidad alternativa. Para recuperar la velocidad normal, ejecutamos:
transmission-remote -AS

Vaaaaaaale, podemos programar el siguiente demonio /usr/local/bin/velocidad_transmission.sh :
(enlace en pastebin)
Al final del archivo /etc/rc.local añadimos:
screen -dmS velocidadtransmission /bin/bash /usr/local/bin/velocidad_transmission.sh

con eso conseguimos que se quede a la escucha cada vez que se inicia el Raspberry, ahora ejecutamos esa línea tal cual para dejarlo en segundo plano.

Priorizando la vozip sobre los torrents

Ahora en nuestro Asterisk, podemos añadir al /etc/asterisk/extensions.conf las líneas (tendrás que adaptarlo a tu código):
[salientes]
exten => _[69]XXXXXXXX,1,NoOp(llamada al ${EXTEN} con BSO)
same => n,Dial(${gtw}/${EXTEN},,tT)
same => n,Macro(velocidad,fin)
same => n,Goto(nulo,s,1)

exten => h,1,Macro(velocidad,fin)
same => n,Goto(nulo,s,1)

[entrantes]
exten => s,1,NoOp(Ha llamado ${CALLERID(num)})
same => n,Macro(velocidad,inicio)
same => n,Dial(SIP/1002,${TIMEOUT},${opc})
same => n,Goto(nulo,s,1)

exten => h,1,Macro(velocidad,fin)
same => n,Goto(nulo,s,1)

[macro-velocidad]
exten => s,1,NoOp(macro velocidad, tipo de funcion: ${ARG1})
; arg1 puede ser inicio o fin
same => n,Goto(${ARG1},1)

; si es inicio, bajamos la velocidad
exten => inicio,1,NoOp(es una llamada nueva, bajamos la velocidad del Transmission)
same => n,System(wget http://localhost:8998/transmission/lento/ -O /dev/null)
same => n,MacroExit()

; si es fin, subimos la velocidad
exten => fin,1,NoOp(subimos la velocidad)
same => n,System(wget http://localhost:8998/transmission/rapido/ -O /dev/null)
same => n,MacroExit()

con las que ejecutamos el modo lento o rápido a nuestro transmission ¿a que mola? Pero si estas siguiendo esto paso a paso, te habrás preguntado "¿y para que necesitas un demonio? Podrías cambiar la velocidad desde el dialplan" pues lo he programado así para ...

Priorizar un juego/app de Android sobre los torrents

jejeje para ello usaremos AutomateIt PRO (busca en el Play). Vamos configurando:
1- Añadimos una nueva regla
2- Elegimos un disparador AND:
3- Ahora pulsamos en el + :
4- Ahora un disparador OR:
5- Ahora marcamos los componentes compuestos del OR:
6- Ahora seleccionamos "Disparador: estado de una aplicación":
7- En esta pantalla, nos aseguramos de tener el checkbox marcado y seleccionamos una applicacion:
8- Yo he elegido el Facebook, por ejemplo. Mucho ojo!, ahora seleccionamos una nueva aplicación:
9- Yo he elegido Ingress. Puedes repetir el paso 8 tantas veces como aplicaciones quieras priorizar. Cuando termines pulsa en:
10- Con eso volvemos al disparador AND del principio, para seleccionar el disparador de estado de red:
11- Elegimos el wifi de casa, porque no queremos que actúe si abrimos esas apps y estamos en el curro (por ejemplo):
12- Con eso hemos terminado con los disparadores, ahora toca la acción:
13- Y ponemos los datos del demonio (ojo con el checkbox):
14- Ponemos nombre y marcamos las opciones correspondientes:
15- Tiene que tener esta pinta más o menos:
¿Y para que sirve todo esto? Pues para algo tan simple como que cuando se abra el Facebook o el Ingress, estando conectado al wifi de casa, hace un GET al demonio del transmission y lo pone en LENTO.
Ahora sólo te queda hacer exactamente lo mismo, pero desmarcando el checkbox del paso 7 ... eso ya lo dejo en tus manos.

Resumiendo

Con esto hemos conseguido hacer que cuando haya una llamada en nuestro Asterisk, ya sea entrante o saliente, el transmission se pone en estado LENTO. Cuando la llamada termina, recupera el estado de RÁPIDO.
Hemos configurado además el AutomateIt para que haga lo mismo cuando se ejecutan aplicaciones en el Android que requieran de más ancho de banda, o que simplemente no queremos que vayan muy lentas.
Y con esto y un bizcocho, tenemos un priorizador de ancho de banda (low-cost).

16 comentarios:

  1. Hola,
    me mola mucho el blog que tienes, pero cada día que posteas me surge la misma duda.
    ¿de verdad no te da problemas de estabilidad la raspberry pi?
    La mía, que es la segunda porque la anterior la cambié ya que me daba corrupción de SD día sí día no, no consigo que esté 4 días sin problemas y no sé si estoy gafado o hago algo mal.

    Mi montaje es el siguiente:
    RPi de 512MB, modelo B.
    /boot en SD
    / en un USB kingston 32GB para evitar la corrupción de datos
    el parámetro "turbo" en el /boot/cmdline.txt
    raspbian actualizadísima y lo mismo el firmware
    la memoria de vídeo a 16MB

    corriendo:
    - ssh + DNS dinámico para acceder.
    - minidlna
    - transmission
    - calibre-server
    - centerim (soy el que te comenté lo del fichero external hace un tiempo, calcula mi desesperación :P )
    - apache
    - yowsup (para whatsapp)

    Últimamente me encuentro la RPi por las mañanas sin ningún demonio de los anteriores corriendo. Si accedo directamente con teclado (el ssh está parado) me encuentro con que el uptime es correcto (no muestra un reinicio) y no veo ningún error revisando los logs. En el cron (que también está parado) no hay nada tampoco.

    Cualquier sugerencia de por donde van los tiros me iría guay porque ya tengo el culo pelado de probar cosas y no lograr nada.

    Help me Obi-Wan, you're my only hope.

    ResponderEliminar
    Respuestas
    1. tengo que hacerte la pregunta tonta primero ¿has probado otra sd?

      Eliminar
    2. No es tonta, he probado como 4. La primera RPI se "comió" (badblocks al canto) tres. He probado una sandisk de 8GB de clase 4 que venía con el kit de iniciación de raspberry pi, otras dos kingston de 8GB de clase 4. Ahora estoy con otra Kingston de 4GB de clase 4.

      Probé a cambiar también la fuente que venía de 1A por otra de un móvil samsung de 700mA que es la que hay ahora.

      He puesto lo del USB con la partición raíz para evitarme problemas con la SD. En principio, sólo usaría (creo, vamos) la SD para el proceso de arranque dado que en la SD sólo se está montando /boot.

      Gracias

      Eliminar
    3. que cosa más rarísima. Yo lo del usb como sistema de ficheros ... no lo veo, no me fiaría de eso. El alimentador de 700mah samsung es el mismo que uso yo.
      Antes as comentado:
      "Últimamente me encuentro la RPi por las mañanas sin ningún demonio de los anteriores corriendo. Si accedo directamente con teclado (el ssh está parado) me encuentro con que el uptime es correcto (no muestra un reinicio) y no veo ningún error revisando los logs. En el cron (que también está parado) no hay nada tampoco."
      Si esto lo as comprobado con el tema del USB, puede ser un error en el montaje o que te falta alguna opción en la escritura en tiempo real. A ver si puedes vaciar el /var/log/syslog, reinicia, espera a que falle, pon el log en pastebin y pon aqui el enlace, a ver si le vemos algo.

      Eliminar
    4. Gracias, probaré esto a ver qué pasa. Lo del USB como sistema de ficheros es porque busqué este tipo de errores y sugerían que no se guardara el sistema de ficheros en una SD (había gente con problemas similares al mío) pues no están preparadas para muchas escrituras mientras que un USB aguanta más.

      Eliminar
    5. Si me permites la sugerencia... yo probaría a quitar el modo turbo lo primero, para ver si así falla o no.

      Lo de que falla la sd lo dudo, yo tengo el so instalado en ella y el transmission 24/7, lleva meses funcionando y sin ningún problema.
      Has realizado esto, a mi me fue de perlas
      http://rsppi.blogspot.com.es/2012/11/torrents-solucionado.html

      Eliminar
    6. Una y todas las que quieras. ¿el modo turbo no es precisamente lo que aparece en el enlace? En su momento lo puse porque salía el error "kevent drop no-se-que-mas". También usé el parámetro del sysctl.

      Estaba pensando, ¿qué modelo de SD usáis? ¿micro-sd con adaptador, clase 10, marca? Las mías han sido de clase 4 y algunas con adaptador y otras sin. Lo mismo el problema es por la velocidad de escritura en la SD (aunque lo dudo).

      En cualquier caso está bien saber que el cacharro os funciona, a una mala será que he tenido mala suerte y comprando otra soluciono estos problemas.

      Eliminar
    7. Yo utilizo unas sd de 16 gb de clase 10 para las dos raspberrys que tengo.
      Con una le puse un cargador "chino" y me hacía estraños, empezaba funcionando bien y al cabo de un tiempo se quedaba sin red y se bloqueaba. Ahora la raspberry que uso para el transmisión la tengo enchufada al usb que tengo en el router, y va de perlas.

      Eliminar
    8. Hola

      Has probado con otra distrinbución? yo uso Arch ARM y va de lujo, eso si, sin gráfica que es lo que se usa en servers, puro ssh y a tirar, además para lo que quieres te va bastante fino y lijero como la seda, vamos, lo digo sólo por probar, ya que es más problema de software que de hardware, osea que la RPI está bien digo yo.

      Suerte.

      Eliminar
    9. A mí se me ha estropeado una vez la SD pero tenía la cpu de la rasp con overclocking a 800. He leído por ahí que a las sd no les sienta bien. Y eso que sólo uso la SD para el boot, el resto del filesystem lo tengo en un disco usb. Desde que he restaurado la frecuencia de cpu me va perfecta, sin fallos. Yo no la uso para reproducción con el xbmc, así que no me afecta el bajar la velocidad.

      Saludos,

      Eliminar
  2. Hola no es que sepa mucho sobre el tema...pero seguramente la faltan amperios ..prueba con una fuente de 2000ma...cualquiera sirve..corta el cable de una generica i le pones la conexion mini usb de la que tienes con su positivo i negativo( rojo i negro)..ya diras.

    ResponderEliminar
    Respuestas
    1. Hola gracias por la sugerencia. Primero voy a probar lo que dice Juan Mol del syslog y después probaré con otra fuente. En su día ya use una de 1A y no sé si irán por ahí los tiros. En principio la RPi consume 500mA y 100 más por cada USB con lo uqe con mi fuente de 700 iría bien, pero seguiré tu recomendación a ver si descubro el misterio.

      Gracias

      Eliminar
  3. Hola

    Esta genial tu blog, gracias por estos pequeños truquetes.
    Te he simplificado un poco el script, espero que no te importe. http://pastebin.com/SsndKVNJ

    Un saludo.

    ResponderEliminar
    Respuestas
    1. Se me olvidaba, en mi caso me gustaría que se pusiese en "modo lento" o se ejecutaran otras acciones cuando empiezo a reproducir algo con el xbmc, ¿sabéis si hay algún estado del xbmc que te lo indique?

      Eliminar
  4. @Javi yo utilizo la raspberry Modelo B con una SHDC cat 4 de 4 GB de la primera marca que pille en el worten barata. Tengo todo el sistema operativo ahí montao y un USB de 400 GB para las descargas por Torrent.

    Yo en su día tuve problemas, la primera SD que utilize me daba problemas (tb era una raspbian antigua, de esto hace ya bastantes meses) pero despues nunca mas.

    Esta 24/7 con Raspbian haciendo de servidor de torrent (transmission-daemon) + NAS (samba) + Centro multimedia (uso el movil con raspi remote para ver las pelis que bajo) y la verdad que desde que la dejé configurada, no he tenido que tocarla nunca.

    Si te sigue dando problemas te puedo mandar una foto de mi sd, o pasarte algun img simple con mi raspi recien instalada y actualizada por si las moscas.

    ResponderEliminar
  5. A mi me passaba algo similar y descubrí el porque.
    Teneis que usar una regleta de proteccion y filtrado de red. Por lo visto mi raspi se quedaba piyuli cuando mi hija le daba a los interruptores de la luz 46 veces seguidas (ya sabeis como son los crios) y estos picos de corriente los captaba el altavoz de la cadena de musica y crujian a la raspi.
    Suerte!

    ResponderEliminar