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
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 sectorsDevice 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
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
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 TorrenteTorrente
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-b2b046850469
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,+0x8000000swapon /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