2016/04/17

Torrenter


En alguna conversación relacionada a FLISOL CABA 2016, se mencionó disponer de alguna copia de la wikipedia para que los asistentes puedan llevársela.

La wikipedia pesa 12 GB completa, 3 GB sin índices ni imágenes según esa conversación.

Si este servicio estuviera disponible en la misma red del Flisolator, generaría un cierto impacto en el ancho de banda, por que una cosa es una instalación que intermitentemente baja 3 a 6 GB a 12 de un saque.

La idea es entonces tener una red separada donde las máquinas bajen sin interferir sobre las instalaciones y con bittorrent que sea más veloz, así no se quedan a vivir.

En cada lugar donde digo eth?, 192.168.?.?, /dev/sd??, /dev/ttyS? y similares, son valores míos, si has de transitar esta experiencia tus valores probablemente sean otros.

Plan A

Aprovechar hardware obsoleto.

Recordando que tenía un mother viejo muy decente con Athlon 2800+, con cinco puertos PCI gracias a @fcingolani y un switch 10/100 de 24 bocas, ofrecí sin compromiso armar una red aparte para este servicio.


En el primer intento venía bien, con 1.75GB de ram, una buena placa de video para usar su memoria como swap (128 MB + 120 MB se podrían usar), un disco sata de 160GB. El BIOS veía las cuatro placas 3com, video ok, memoria ok. Cuando intenté arrancar con pendrive, cuando estaba probando uno de los que tenía, dijo "missing operating system", ok, nada del otro mundo. Pero la apagué y fué definitivo. Nunca más arrancó. Dejé el mother pelado, sin pila, reset de la memoria del BIOS, revisé los capacitores, lo envolví en papel aluminio, cambié de fuente, puse velitas, nada.


Plan B


Lo mismo con un Pentium 3 de 700.

Bueno, no lo mismo, sólo 640MB de RAM y dos discos ATA de 40 80 GB. Es que cuando llegué a las primeras mediciones, uno de los de 40 falló y me obligó a buscar en el cajón y aparecieron dos de 80.

En parte por perversión, en parte por que hay un slot ISA 16, quise usar una (más) vieja ethernet 3c509 como interfaz de control, pero no prosperó. Le puse una Realtek. Retrospectivamente, el fallo se debía a problemas de enrutamiento, así que quizás tambien la agregue.


Las tareas


Instalar algún linux.

RAID: para aumentar el ancho de banda sobre los miserables discos.

Ethernet de control: para facilitar la vida.


Trunking: para aumentar el ancho de banda entre el Torrenter y la red, se configuran varios puertos del switch y las placas para que haga la comunicación en paralelo. En teoría pasamos de una red de 100Mbits a 400Mbits entre el servidor y el switch. A un sólo cliente no le hace diferencia, pero a cuatro o más si.

DHCPD: para que otorgue las direcciones IP a las máquinas que se conecten.

DNS: quizás en otra oportunidad

Memoria video como swap: para aumentar la performance del servidor.

Tracker: para que funcione bittorrent

Torrente: de eso se trata todo esto, no?

Mediciones: tiene sentido gastar plata en un taxi para llevar esto si no hay una diferencia importante en el tiempo de download? veremos...

Arranque desatendido: la idea es llevar una caja que se prenda y ande.

 

La ejecución


Distro

Asumo que quien lee esto sabe más o menos instalar cualquier distro y manejarse con linux.

Debian 8.0.4 32 bits, nada especial, sin entorno gráfico, con algunas cositas útiles.

apt-get install vim ethtool tcpdump

Particionamiento

Disk /dev/sda: 76.7 GiB, 82348277760 bytes, 160836480 sectors

Device     Boot    Start       End   Sectors  Size Id Type
/dev/sda1  *        2048  15624191  15622144  7.5G 83 Linux
/dev/sda2       15624192  16623615    999424  488M 82 Linux swap / Solaris
/dev/sda3       16623616 160835583 144211968 68.8G fd Linux raid autodetect


Disk /dev/sdb: 76.7 GiB, 82348277760 bytes, 160836480 sectors

Device     Boot    Start       End   Sectors  Size Id Type
/dev/sdb1           2048  15624191  15622144  7.5G 83 Linux
/dev/sdb2       15624192  16623615    999424  488M 82 Linux swap / Solaris
/dev/sdb3       16623616 160835583 144211968 68.8G fd Linux raid autodetect


No quiero incursionar en arrancar de raid, así que dejé las sd?1 para / y /home


RAID



apt-get install mdadm

Creación del raid con stripe, los discos en controladoras distintas debería mejorar el ancho de banda.

mdadm --create --verbose /dev/md0 --level=stripe \
  --raid-devices=2 /dev/sda3 /dev/sdb3



mkfs.ext4 /dev/md0




Para que monte al inicio



mdadm --detail --scan >> /etc/mdadm/mdadm.conf
 





blkid | grep md0 >> /etc/fstab

quedando

[/etc/fstab]

#UUID=044d6468-a015-404f-ae97-fb0814ca5aaf
/dev/md0        /RAID           ext4       defaults       0         3


Seguro que pude haber usado UUID en lugar de /dev/md0, pero me desvía de mi camino, que es bastante largo aún.


Trunking

 

Primero, hay que comunicarse con el switch.

apt-get install minicom

Usar un null-modem cable y configurar correctamente la comunicación en minicom:

/dev/ttyS0
19200 8n1 sw flow control
modem dcd line off


Ok, tengo login, pero, ¿cuáles eran las credenciales? las sabía hace 15 años.

Por suerte "3comcso" and password "RIP000" hace reset.

Luego, hay que cerrar las ventanas:


system->security->modify-> las claves de cada usuario


Configurar IP por si queremos guardar otros 15 años el cable en un cajón:

ip->interface->plin plin plin




Recuperar las 100 Mbits full duplex:

ethernet->portMode->all->100full

y finalmente armar el trunk de un lado...

feature->trunk->addPort->1->1
feature->trunk->addPort->1->2
feature->trunk->addPort->1->3
feature->trunk->addPort->1->4  

...y del otro


apt-get install ifenslave


[trunkIt.sh] 
    ifconfig eth0 down
    ifconfig eth1 down
    ifconfig eth2 down
    ifconfig eth3 down
  
    modprobe bonding mode=0 miimon=100
    ifconfig bond0 hw ether 00:11:22:33:44:55
    ifconfig bond0 192.168.1.3 netmask 255.255.255.0 up

    ifenslave bond0 eth0
    ifenslave bond0 eth1
    ifenslave bond0 eth2

    ifenslave bond0 eth3

Si tenés la interfaz de control en la misma red (mala idea, ahora la tengo así sólo por las pruebas) hay que ajustar las rutas con distintas combinaciones de


[goNoTrunk.sh]
    route del -net 192.168.1.0/24 bond0
    route add -net 192.168.1.0/24 eth4

[goTrunk.sh]
    route del -net 192.168.1.0/24 eth4
    route add -net 192.168.1.0/24 bond0

un ping 192.168.1.3 desde otra máquina seguido de un arp -a confirma que está funcionando:



192.168.1.3              ether   00:11:22:33:44:55   C                     eth6

si hay que continuar instalando cosas, puede hacer falta un

route add default gw 192.168.1.1

Primeras mediciones


Deseo determinar si el RAID es más rápido que el IDE pelado. Para ello transferí vía ssh linuxmint-17.3-cinnamon-32bit.iso de 1G4. No lo hice en condiciones de laboratorio, hay otro tráfico en la red, otras actividades en las máquinas involucradas y no repetiré las mediciones a menos que algo me llame la atención.

El resultado que esperaba era:
   La lectura sobre RAID es mejor que sobre IDE.
   La lectura vía trunk es mejor que vía enlace normal.

Veamos la cruda realidad

  • Escritura interfaz de control a IDE     5.0MB/s   04:37 (*)
  • Escritura interfaz de control a RAID    4.9MB/s   04:46
  • Lectura interfaz de control desde IDE   4.5MB/s   05:08



(*) es el mismo tiempo que me dió con los discos de 40 antes de fallar. Eso es bueno, el ruido de la red no interfiere mucho.

Epa, ¿qué pasó??? ¿Está tardando más en leer que en escribir teniendo de este lado una máquina brutalmente más poderosa?

32 bits vs 64 bits (doble)
640 MB vs 16 GB (25!!)
700 Mhz x 1 vs 3.2 GHz x 4 (cuádruple por cuatro)
IDE vs SATA (no sé)

Probablemente ssh está metiendo ruido, voy a tener que instalar un servidor web y usar wget en el cliente. De paso sirve para luego brindar descarga directa.

apt-get install nginx-light


Sólo hay que tirar un par de symlinks a los archivos previamente subidos. La escritura no me importa mucho, en realidad lo interesante es la lectura. Va de nuevo.

  • Lectura interfaz de control desde IDE   11,2MB/s   in 2m 8s
  • Lectura interfaz de control desde RAID  10,9MB/s   in 2m 9s
No hay diferencia apreciable, está en la velocidad máxima, vamos bien.


Ahora, a probar la lectura utilizando el trunk, que es el escenario productivo, de lecturas simultáneas. No pongo la velocidad pues wget marca la última, no la promedio.

  • 3 interfaz de control / IDE     6m 11s
  •                                 5m 45s
  •                                 6m 8s

 Parece coherente, se triplica el tiempo.

  • 3 trunk / RAID                  2m 47s
  •                                 3m 31s
  •                                 2m 47s

repitiendo...


  • 3 trunk / RAID                  4m 55s
  •                                 4m 19s
  •                                 3m 45s
     
Todo mal, los resultados que esperaba eran tipo  2m , veamos que dice ps:



top - 21:54:24 up 12 min,  2 users,  load average: 1.77, 0.98, 0.58
Tasks:  76 total,   1 running,  75 sleeping,   0 stopped,   0 zombie
%Cpu(s):  1.2 us, 11.1 sy,  0.0 ni, 42.8 id,  5.9 wa,  0.0 hi, 39.0 si,  0.0 st
KiB Mem:    641708 total,   593456 used,    48252 free,     9332 buffers
KiB Swap:   999416 total,        0 used,   999416 free.   548752 cached Mem
 

530 www-data  20   0    6520   2164   1688 D 39.5  0.3   0:41.50 nginx

No sé bien como diagnosticar, probablemente hay una saturación general.

Una medida más, igual pienso que lo mejor va a ser ver como se comporta con bittorrent.
  • 4 trunk / RAID                  5m 34s
  •                                 5m 35s
  •                                 4m 3s
  •                                 5m 37s


  • 4 interfaz de control / RAID    8m 20s
  •                                 8m 24s
  •                                 8m 31s
  •                                 8m 27s

pero load average: 0.60

Momento de parar y pensar


¿o será que le cuesta hacer funcionar a las cuatro ethernets? ¿Y si en lugar de usar el trunking, ponemos un cable cruzado en cada ethernet y tenemos cinco conexiónes simultáneas?


Recapitulemos, estos son los planes:

Usar bittorrent, para lo cual hace falta que estén todos en la misma red, para lo cual hace falta trunking.

¿Hace falta trunking? Si hay suficientes máquinas la carga sobre el servidor se alivia considerablemente.


Usar descarga directa, cada uno en su red, pero hay que medir si no es eso lo que hace que se caiga la performance. Además no tengo que sacar del rack el switch y llevarlo, menos trabajo y riesgo.

A ojo, los 12 GB son 45 minutos. Sin duda está mejor que los 70 de sin trunk, pero lejos de los 20 de una conexión no compartida, con o sin trunk. De todos modos, si viene una sola persona a la vez, el tiempo es 20 minutos. A medida que se sumen se degrada por un lado pero se compensa por bittorrent.

Apuesto entonces por trunking + bittorrent, sin importar los números. Igual si me queda tiempo probaré la conexión directa x 5.


Tracker

Ver Torrente

Torrente


Elegí este porque es el único que según apt-cache search hace tracking.

man bittorrent-downloader es tu amigo

Las próximas instrucciones son muy empíricas, puede ser que haya alguna importante falencia conceptual. Es lo que me funcionó.

*) Construir el archivo de torrent, el que uno le pasa al cliente.

btmakemetafile http://192.168.1.3:6969/announce linuxmint-17.3-cinnamon-32bit.iso

No olvidar el /announce, perdí horas por ello.

*) Copiar el .torrent a una carpeta e iniciar el tracker

bttrack --port 6969 --dfile dstate --logfile - --allowed_dir /RAID/TORRENT --allow_get 1



*) Abrir un browser en http://192.168.1.3:6969, tomar el link para el siguiente paso.

*) Posicionarse en la carpeta donde esta el archivo a compartir

btdownloadheadless --check_hashes 0 \
http://192.168.1.3:6969/file?info_hash=l%FCyH%7F%E2%9C%7B%25%92%7D%40%0F%26%C3%05%19%AB%A3%DD



El check_hashes en 1 la primera vez, la siguientes en 0.

Tras mucho, mucho, mucho fallar, he llegado a la conclusión de que sólo convendría usar bittorrent si hay mucha gente bajando.

Hacer un link de /var/www a /RAID/TORRENT (o donde lo hayas puesto) y ahí:

[index.html>
  <html>
    <head>
      <title>
        Flisol CABA 2016 Tracker
      </title>
    </head>
    <body>
      Torrent:

         <a href="linuxmint-17.3-cinnamon-32bit.iso.torrent">
           linuxmint-17.3-cinnamon-32bit.iso
         </a>
      <br/>
      Descarga directa: 

        <a href="linuxmint-17.3-cinnamon-32bit.iso">
           linuxmint-17.3-cinnamon-32bit.iso
        </a>
     <br/>
    </body>
  </html>

Memoria video como swap

Ya estoy un poco cansado y se me acaba el tiempo, así que le doy para adelante. Si puedo en otro momento edito y mejoro.

Hay que hallarla con


lspci -vvv -s 01:00.0

01:00.0 VGA compatible controller: Advanced Micro Devices, ...
  Subsystem: ASUSTeK Computer Inc. Radeon 9200 SE / TD / 128M
  Control: ...
  Status: ...
  Latency: ...
  Interrupt: ...
  Region 0: Memory at e0000000 (32-bit, prefetchable) [size=128M]

  ...

I'm feeling lucky, tiene dos adaptadores...


lspci -vvv -s 01:00.1

01:00.1 Display controller: Advanced Micro Devices, ...  (Secondary)...       Subsystem: ASUSTeK Computer Inc. Device c007
    Control: ...
    Status: ...
    Latency: ...
    Region 0: Memory at e8000000 (32-bit, prefetchable) [size=128M]




Ok, podremos rapiñar 120 MB + 128 MB.

Primer adaptador



Region 0: e0000000 + 800000 (los 8M que dejamos para video) = E0800000

Longitud total: 8000000 (128 MB)
Menos los 8 MB =  7800000 (120 MB)

El comando es entonces:

modprobe slram map=VRAM,0xE0800000,+0x7800000
 
dmesg dice:
 
[  695.642037] slram: devname=VRAM, devstart=0xe0800000, devlength=0x7800000
[  695.659638] slram: Registered device VRAM from 3678208KiB to 3801088KiB
[  695.659664] slram: Mapped from 0xe9780000 to 0xf0f80000



Y el otro? Probemos


e8000000 es la dirección y son los 128 MB completos (80000000)



modprobe phram phram=VRAM,0xe8000000,+0x8000000


cat /proc/mtd

dev:    size   erasesize  name
mtd0: 07800000 00004000 "VRAM"
mtd1: 08000000 00001000 "VRAM"


modprobe mtdblock


ls /dev/mtd*

/dev/mtd0
/dev/mtd0ro
/dev/mtd1
/dev/mtd1ro
/dev/mtdblock0
/dev/mtdblock1

mkswap /dev/mtdblock0
 

Setting up swapspace version 1, size = 122876 KiB
no label, UUID=767e1e0d-cf7b-464d-8895-b2b04685046
9
 

mkswap /dev/mtdblock1
 

Setting up swapspace version 1, size = 131068 KiB
no label, UUID=80ce243a-4c85-43a5-af96-1031cba2470c


Hay que darle prioridad a esta memoria antes que al disco con -p.

swapon /dev/mtdblock0 -p 10
swapon /dev/mtdblock1 -p 10
 
Veamos que pasó. 
 
swapon --summary 


Filename    Type  Size Used Priority
/dev/sdb2                               partition 499708 0 -1
/dev/sda2                               partition 499708 0 -2
/dev/mtdblock0                          partition 122876 0 10
/dev/mtdblock1                          partition 131068 0 10



El script actual es:

[swapOnVideo.sh]

modprobe slram map=VRAM,0xE0800000,+0x7800000
modprobe phram phram=VRAM,0xe8000000,+0x8000000
swapon /dev/mtdblock0 -p 10
swapon /dev/mtdblock1 -p 10

DHCPD

Por último, falta proveer direcciones IP a quienes se conecten.

apt-get install isc-dhcp-server

-------- Lo completaré otro día. --------

Arranque desatendido

Por más último, hay que lograr que se pueda prender la máquina y funcione sin tener que interactuar.

Ya está para
  • raid
  • nginx

Falta para

  • trunking
  • routing
  • bttracker
  • btdownloadheadless
  • swap en video

-------- Lo completaré otro día. --------

Conclusiones


Como ya todos sabemos, si las horas que dediqué las hubiera invertido en freelancear, pude haber comprado una máquina usada funcionando bastante más potente y aprovechar el trunking como es debido. Pero no puedo negar que me divierte bastante hacer esto, al menos no estoy gastando plata.



Links

https://flisol.usla.org.ar/event/caba/

https://raid.wiki.kernel.org/index.php/RAID_setup

http://computerdd.blogspot.com.ar/2006/10/linux-connect-to-serial-console-of.html

https://www.pantz.org/hardware/switches/3com3300passreset.html

http://www.linuxhorizon.ro/bonding.html

http://nginx.org/en/docs/beginners_guide.html

http://www.bittornado.com/


http://ft23.pmenier.net/docext/mtd/TIP_Use_memory_on_video_card_as_swap.html

https://wiki.archlinux.org/index.php/swap_on_video_ram