Hola muchachos, voy a comentaros mis experiencias trasteando con transmission y un HG556a de Vodafone.
Si no os apetece leer,
podéis saltar hasta el final donde hago mis preguntas, todo lo demás que escribo va con ánimo de documentar un poco el
uso de transmission,
el rendimiento obtenido y el
uso de almacenamiento externo.
Antes de nada, pongo las especificaciones técnicas del equipo usado, para que tengáis las referencias en mente sin tener que buscar por ahí.
Router: Huawei HG556a
- 300Mhz de procesador (MIPS)
- 64MB de RAM
- Almacenamiento interno: 16MB
- Wifi : Atheros
- OpenWRT: Branch de Noltari bcm63xx-r35539 (Barrier Breaker)
Memoria USB (para SWAP)Memoria USB (para almacenamiento)- Tamaño: 2GB
- Sistema de archivos: FAT16 (driver vfat)
Disco duro USB (para almacenamiento)- Tamaño de particiones: 50GB
- Partición 1: FAT32 (driver vfat)
- Partición 2: ext3 (driver ext4)
- Caché interna: 16MB
Límite permanente en todas las pruebas: 150 conex. máx. y 150 conex. máx por torrent.
RAM utilizada por transmission en fresco (nada más arrancar y sin contar la caché): ~10.4MB
Torrent usado para pruebas: Imagen de ubuntu con más de 500 seeds.
Benchmark de Entrada/Salida: Disco Duro USB: 5.5MB/s (Uso de CPU: 100%)
Pendrive: 1.5MB/s (Uso de CPU: 100%)
(Son las velocidades máximas de los mismos. En un PC alcanzan la misma velocidad, pero sin gasto aparente de CPU)
Primera pruebaDurante la primera prueba no toqué ninguna opción de configuración de rendimiento, sólo adapté pequeñas cosas como el directorio de almacenamiento.
- Swap: No activada
- Almacenamiento Memoria USB
- Partición FAT16 montada con el parámetro umask=000 (por vagancia) para permitir escritura al usuario daemon
- Tamaño de la caché de escritura: 2mb
- Límite de bajada: Ilimitado
- Reserva de memoria: Rápida
- Encriptación: preferente
Resultado:Por alguna extraña razón, aún con la reserva de memoria rápida, la descarga tarda en comenzar un minuto más o menos porque el kernel se dedica a hacer operaciones de Entrada/Salida en el pendrive. (se puede ver con el comando top)
La descarga progresa de manera accidentada, dando picos de descarga altos, periodos más o menos estables de descarga y periodos planos donde se pierde casi toda la velocidad ya que la CPU está ocupada por el kernel que está dedicándose a guardar trozos del archivo descargado en el pendrive.
Añado otra imagen en la que se puede ver que el kernel se está dedicando a operaciones de E/S(Entrada/Salida):
Segunda pruebaPara intentar evitar los periodos en los que la CPU es monopolizada por el kernel para tareas de E/S, me dediqué a eliminar todos los búfferes entre transmission y la memoria USB. De esta manera esperaba que la carga de E/S no fuese puntual sino costante, de manera que durante todo el proceso, el kernel necesitase sólo un 5% constante de CPU para guardar los datos en la memoria USB.
- Swap: Desactivada
- Almacenamiento: Memoria USB
- Partición FAT16, montada con la opción sync
- Tamaño de la caché de escritura: 0mb
- Límite de bajada: 200KB/s
- Reserva de memoria: Desactivada
- Encriptación: desactivada
Resultado:A los tres minutos de descarga el sistema se volvió inestable y tuve que cerrar el proceso transmission. El proceso klogd monopolizó la CPU escribiendo entradas en el registro de sistema anotando cada bloque defectuoso que encontraba en la memoria USB.
Conclusión:Me he cargado la memoria USB
. Las memorias USB tienen una vida que se mide en número de escrituras sobre un mismo bloque. Al eliminar los búfferes de acceso y escritura al disco, el número de peticiones a la memoria USB se eleva un montón, hasta el punto de destrozar bloques de ésta. Cosa que con los búfferes no pasa, porque hasta que el búffer se escribe en disco, todas las peticiones modifican la información del búffer y no el disco, así pues, por cada X-MB de buffer sólo se hace una petición con buffer y, por el contrario, 'chococientas-mil' peticiones sin él.
Tercera pruebaViendo que la escritura en un pendrive requiere de mucho tiempo de espera ocupada por parte de la CPU y que eliminar el buffer de sistema (lo que puede hacerse especificando opciones a la hora de montar la partición) y la caché de transmission era una _muy_ mala idea, probé a, simplemente, eliminar la caché de transmission y dejar trabajar al buffer de E/S de linux.
- Swap: Desactivada
- Almacenamiento: Memoria USB
- Partición FAT16, montada con el parámetro umask=000 para permitir escritura al usuario daemon
- Tamaño de la caché de escritura: 0mb
- Límite de bajada: 200KB/s
- Reserva de memoria: Rápida
- Encriptación: desactivada
Resultado:La descarga se realiza más suavemente y, a pesar de los micro cortes en la descarga, no se pierde velocidad cada vez que éstos tienen lugar.
La CPU está ociosa, de media, en un 30% y de la parte ocupada de la cpu se dedica un 14% de media a Entrada y Salida.
Llega a bajar a 200KB/s de media.
El pendrive no sufrió daños al eliminar la caché de transmission.
Conclusiones:Después de jugar un poco con la velocidad máxima de descarga, decidí dejarla en 200KB/s porque es lo que aguanta el procesador estable sin provocar que otros procesos del router se queden sin CPU y empiecen a funcionar a trompicones (como Dropbear, el servidor de ssh que ha llegado a dejar de responder durante 5min.)
Cuarta pruebaHabiendo encontrado la manera estable de descargar a un pendrive, intenté forzar la máquina para ver hasta dónde podía llegar, pero esta vez usando encriptación.
- Swap: Desactivada
- Almacenamiento: Memoria USB
- Partición FAT16, montada con el parámetro umask=000 para permitir escritura al usuario daemon
- Tamaño de la caché de escritura: 0mb
- Límite de bajada: 80KB/s
- Reserva de memoria: Rápida
- Encriptación: Forzada (Sólo peers con encriptación)
Resultado:La descarga se realiza correctamente, pero el sistema está algo más cargado que en el experimento anterior.
Por lo general, la descarga se realiza de manera fluida, pero en 10mins hubo dos parones de dos segundos en los cuales dejó de descargar y la CPU estaba al 100%. Tras los parones, la velocidad tardó un poco en volver a llegar a los 80KB/s
Conclusiones:Es posible usar encriptación y escribir en un pendrive, pero el coste de la encriptación hace que el sistema no de abasto para atender las peticiones de E/S así que hay que limitar la velocidad de bajada, que tras jugar un poco con el valor, decidí dejar en 80KB/s
Quinta pruebaAhora probé a guardar los datos en la partición ext3 de un Disco Duro externo USB. Como es la primera prueba, elegí unos datos de configuración un poco anárquicos, porque no sabía muy bien qué explotar en busca de limitaciones.
- Swap: No activada
- Almacenamiento Disco Duro
- Partición ext3
- Tamaño de la caché de escritura: 15mb
- Límite de bajada: 400KB/s
- Reserva de memoria: Rápida
- Encriptación: preferente
Resultado:A los dos minutos la aplicación hizo que el sistema dejase de responder, la CPU estaba saturada entre operaciones de E/S y transmission intentando trabajar. Al no haber swap a la que desplazar contenido de la RAM para llenar el buffer de 15MB configurado en transmission, el sistema se congeló. Tuve que dener el proceso manualmente mediante el puerto de serie del router, ya que las conexiones ssh dejaron de responder.
Sexta PruebaEn esta prueba intenté solventar el problema de quedarme sin RAM conectando un pendrive que hiciera las veces de partición swap.
- Swap: Activada
- Almacenamiento: Disco Duro
- Partición ext3
- Tamaño de la caché de escritura: 15mb
- Límite de bajada: 300KB/s
- Reserva de memoria: Rápida
- Encriptación: Forzada
Resultado:Al principio, el proceso estuvo parado unos segundos, mientras el kernel pasaba datos no utilizados de la RAM al pendrive que usé como SWAP.
Esta prueba transcurrió sin problemas, sin bajadas de velocidad y sin periodos notables de CPU invertidos en E/S (El uso de CPU por parte del kernel para esta tarea nunca pasó del 15%)
Conclusiones:Escribir en un Disco Duro USB que tenga caché interna es una tarea mucho menos pesada que escribir en un pendrive, pues la memoria caché acepta toda la información inmediatamente y deja la CPU libre mientras el disco se dedica a escribir la información en disco.
Séptima PruebaDurante esta prueba quise forzar el router hasta los límites de mi línea ADSL, sin encriptación y sin ocupar un puerto USB con un pendrive-swap.
- Swap: Desactivada
- Almacenamiento: Disco Duro
- Partición ext3
- Tamaño de la caché de escritura: 8mb
- Límite de bajada: 800KB/s
- Reserva de memoria: Rápida
- Encriptación: Desactivada
Resultado:La descarga sucedió de forma fluída, sin parones, llegando a una velocidad media de 550KB/s y ocupando el proceso "transmission" 20MB de RAM, pero el sistema estaba un poco saturado, ya que se quedaba sin cpu durante algunos segundos, lo cual no afectó a la descarga pero dejó sólo un 6% de CPU libre, de media. Pero no detecté que la CPU se dedicara a E/S de forma notable en ningún momento.
Conclusiones:Como, en mi caso, el disco duro externo sólo tenía 8MB de caché, es suficiente con que configuremos transmission con 8MB de caché, así cada vez que transmission vuelque su caché en la caché del disco duro, puede realizarse de un viaje sin hacer esperar al sistema.
Tras jugar un poco con el valor de velocidad máxima de descarga, lo fijé en 500KB/s lo que dejó, de media, el 20% de la CPU libre.
Octava PruebaVisto que el router se manejaba bien con 500KB/s de bajada sin encriptación decidí hacer pruebas forazando la encriptación.
- Swap: Desactivada
- Almacenamiento: Disco Duro
- Partición ext3
- Tamaño de la caché de escritura: 8mb
- Límite de bajada: 300KB/s
- Reserva de memoria: Rápida
- Encriptación: Forzada
Resultado:La descarga se realizó sin parones, a 250KB/s de media, ocupando 20MB de RAM y dejando libre el 21% de la CPU.
Conclusiones:No decidí probar a bajar a un máximo de 300KB/s por antojo, hice varias pruebas y sólo he puesto la que ha dado buenos valores, aunque conseguí que descargase a 350KB/s de media al poner el límite en 400KB/s, pero la CPU quedaba libre un 6% de media y pasaba largos ratos al 100%, por lo que decidí probar con menos.
Conclusiones Finales- Utilizar un pendrive como almacenamiento externo para descargar torrents es costoso y dependiendo de tu router y de el caso de cada uno, hay que tener en cuenta la velocidad de descarga, el uso de encriptación y la CPU que se quiera dedicar a otras tareas.
- Utilizar un pendrive como partición swap puede sacarnos de un apuro si necesitamos que un proceso disponga de mucha RAM, pero si tenemos otros procesos que trabajen activamente con la RAM puede que el tiro nos salga por la culata y el sistema deje sin CPU a esos procesos porque está ocupado en sacar y meter los datos de éstos de la SWAP
- Los pendrives tienen una vida de escritura limitada. No se debe montar una partición de un pendrive con la opción sync si se van a escribir datos de manera no-secuencial.
- Un router no es un PC y su capacidad de proceso es limitada, así que si queremos que los todos los servicios del router funcionen fluídamente, hay que sacrificar velocidad de bajada (sobre todo en caso de usar encriptación) en favor de la estabilidad general del sistema
- La caché interna de los Discos Duros USB descongestiona a la CPU en tareas de E/S
PreguntasDurante estas pruebas le he dado mucha caña a la CPU, pero he intentado que no se congestionase. Si quisiera empujar el router un poco más allá y no me importara que dejase de responder...
-¿Qué tal reaccionaría el hardware a una carga de CPU cercana al 100% de manera prolongada?
-¿Es sano (para el router) que la CPU esté mucho tiempo al 100%?
-¿Debería hacer modding y acoplarle un ventilador?
Gracias por leer el troncho que he escrito. (Si no lo habéis leído, gracias también.)
Edito: Añado las pruebas de rendimiento de los dispositivos de almacenamiento usados.