Análisis de performance y optimización en Clusters Beowulf

Anuncio
Universidad de Buenos Aires
Facultad de Ciencias Exactas y Naturales
Departamento de Computación
Análisis de performance y
optimización en Clusters Beowulf
por
Marı́a Carolina León Carri
{[email protected]}
Director: Dr. Ing. Guillermo Marshall
{[email protected]}
Codirector: Dr. Ing. Carlos Garcı́a Garino
{[email protected]}
Tesis para optar al grado de
Licenciada en Ciencias de la Computación
Agosto 2004
Índice general
1. Introducción
8
2. Conceptos Básicos
2.1. Tecnologı́a de redes . . . . . . . . . . . . . . . . . . . . . .
2.1.1. Tecnologı́a Ethernet . . . . . . . . . . . . . . . . .
2.1.2. Protocolo IP, Internet Protocol (MTU) . . . . . . .
2.1.3. Protocolo TCP, Transmission Control Protocol . . .
2.1.4. Ancho de Banda, Latencia y RTT . . . . . . . . . .
2.1.5. Bonding . . . . . . . . . . . . . . . . . . . . . . . .
2.2. Arquitectura del nodo . . . . . . . . . . . . . . . . . . . .
2.3. Implementación de Gigabit Ethernet en clusters de PC . .
2.4. Sistema de archivos . . . . . . . . . . . . . . . . . . . . . .
2.4.1. Sistema de archivo local - ext3 . . . . . . . . . . . .
2.4.2. Network File System - NFS . . . . . . . . . . . . .
2.4.3. Parallel Virtual File System - PVFS . . . . . . . .
2.4.4. Mosix File System con Direct File System Access
MFS con DFSA . . . . . . . . . . . . . . . . . . . .
2.4.5. Global File System - GFS . . . . . . . . . . . . . .
2.5. Administración de Procesos . . . . . . . . . . . . . . . . .
2.5.1. Portable Batch System - PBS . . . . . . . . . . . .
2.5.2. MAUI Scheduler . . . . . . . . . . . . . . . . . . .
2.5.3. Interacción entre PBS y MAUI . . . . . . . . . . .
2.6. Herramientas de programación . . . . . . . . . . . . . . . .
2.6.1. MPICH . . . . . . . . . . . . . . . . . . . . . . . .
2.6.2. ROMIO . . . . . . . . . . . . . . . . . . . . . . . .
3. Experimentos y optimización
3.1. Performance de Red . . . . . . . . . . . . . . . . . .
3.1.1. Mediciones de Throughput de TCP . . . . . .
3.1.2. Mediciones de Throughput de MPICH . . . .
3.1.3. Influencia del tamaño de las ventanas de TCP
3.1.4. Comparación entre diferentes clusters . . . . .
3.2. Performance de Sistemas de Archivos . . . . . . . . .
3.2.1. Benchmark Bonnie . . . . . . . . . . . . . . .
3.2.2. Benchmark Babieca . . . . . . . . . . . . . . .
3.2.3. MPI I/O: perf y coll perf de ROMIO . . . . .
3.3. Throughput de Procesos . . . . . . . . . . . . . . . .
1
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
10
10
10
11
11
12
12
13
14
15
16
16
18
.
.
.
.
.
.
.
.
.
22
22
22
23
24
24
25
25
26
.
.
.
.
.
.
.
.
.
.
28
28
28
32
33
33
35
36
38
41
46
4. Conclusiones y lı́neas futuras
49
4.1. Conclusiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
4.2. Lı́neas Futuras . . . . . . . . . . . . . . . . . . . . . . . . . . 51
A. Clusters Utilizados
A.1. Cluster Speedy González
A.1.1. Hardware . . . .
A.1.2. Software . . . . .
A.2. Cluster Meteoro . . . . .
A.2.1. Hardware . . . .
A.2.2. Software . . . . .
A.3. Cluster Mercurio . . . .
A.3.1. Hardware . . . .
A.3.2. Software . . . . .
.
.
.
.
.
.
.
.
.
B. Descripción de Benchmarks
B.1. Red . . . . . . . . . . . .
B.1.1. NetPIPE . . . . . .
B.2. Sistema de archivos . . . .
B.2.1. Babieca . . . . . .
B.2.2. Bonnie . . . . . . .
B.2.3. perf y coll perf . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
52
52
52
52
55
55
56
56
56
56
.
.
.
.
.
.
57
57
57
57
57
58
59
C. Configuración TCP en Linux
60
Bibliografı́a
62
2
Índice de figuras
2.1.
2.2.
2.3.
2.4.
2.5.
2.6.
2.7.
2.8.
2.9.
Envı́o de mensajes [21] . . . . . . . . . . . . . . . . . . . . . .
Recepción de mensajes [21] . . . . . . . . . . . . . . . . . . . .
Estructura de capas de NFS [14] . . . . . . . . . . . . . . . . .
Diagrama del sistema PVFS [17]. . . . . . . . . . . . . . . . .
Flujo de metadata y datos en PVFS [17]. . . . . . . . . . . . .
Flujo de datos a través del kernel [17]. . . . . . . . . . . . . .
Ejemplo de distribución de un archivo en una partición PVFS [16]
Ejemplos de particiones Lógicas PVFS [16] . . . . . . . . . . .
Interacción entre PBS y MAUI . . . . . . . . . . . . . . . . .
13
14
17
19
20
20
21
22
25
3.1. Throughput de Speedy para tamaño de buffers default de sockets TCP. Referencias: (F)ast, (E)thernet, (B)onding, M(PICH),
(G)igabit. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.2. Gráfico de Saturación Ethernet del cluster Speedy. . . . . . . . . 31
3.3. Gráfico de Firma Ethernet del cluster Speedy. . . . . . . . . . . . 31
3.4. Throughput de red para distintos tamaños de ventanas de congestión TCP (A) MTU=1500, (B) MTU=3000 y (C) MTU=9000.
34
3.5. Comparación del throughput entre los clusters Meteoro, Mercurio
y Speedy. Referencias: (F)ast, (E)thernet, (B)onding, M(PICH),
(G)igabit. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.6. Throughput de accesos al sistema de archivos. Benchmark Bonnie. 37
3.7. Cantidad de búsquedas por segundo. Benchmark Bonnie. . . . . . 38
3.8. Performance de sistemas de archivos ext3, NFS, PVFS. Comandos
de lectura Unix. Benchmark Babieca. . . . . . . . . . . . . . . . 39
3.9. Performance de sistemas de archivos ext3, NFS, PVFS. Comandos
de lectura/escritura Unix. Benchmark Babieca. . . . . . . . . . . 40
3.10. Distribución fı́sica del archivo generado por perf para la ejecución
con 4 nodos de tamaño 4 MB por nodo, en la partición PVFS
(base=1, pcount=15 y ssize=64 KB). Programa perf de ROMIO. . 41
3.11. Throughput de escrituras/lecturas. (A) sin la función MPI File sync(),
(B) con dicha función. Programa perf de ROMIO. . . . . . . . . 42
3.12. Throughput de (A) escrituras y (B) lecturas SIN la función MPI File sync().
Programa perf de ROMIO. . . . . . . . . . . . . . . . . . . . . 43
3.13. Throughput de (A) escrituras y (B) lecturas CON la función MPI File sync().
Programa perf de ROMIO. . . . . . . . . . . . . . . . . . . . . 44
3.14. Throughput de Funciones Colectivas de lectura/escritura. Programa coll perf de ROMIO para cubos de 2563 . . . . . . . . . . . . . 45
3.15. Porcentaje de cantidad de trabajos por tiempo de duración. . . . . 46
3.16. Corridas homogéneas vs. heterogéneas. . . . . . . . . . . . . . . . 47
3
A.1. Topologı́a del Cluster Speedy. . . . . . . . . . . . . . . . . . . . 54
4
Índice de cuadros
2.1. Caracterı́sticas del throughput nominal del Bus PCI/PCI-X [41]. . 15
3.1. Throughput de accesos al sistema de archivos. Las búsquedas aleatorias están dadas en cantidad de búsquedas por segundo. Benchmark
Bonnie. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
A.1.
A.2.
A.3.
A.4.
A.5.
Caracterı́sticas
Caracterı́sticas
Caracterı́sticas
Caracterı́sticas
Caracterı́sticas
del hardware de Speedy. . . . .
de los discos de Speedy. . . . .
de las placas de red 3c2000 [43].
del hardware de Meteoro. . . .
del hardware Cluster Mercurio.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
53
53
53
55
56
C.1. Configuración TCP en linux. . . . . . . . . . . . . . . . . . . . 61
5
Resumen
En la última década la computación paralela tuvo un gran resurgimiento
gracias a los sistemas tipo Beowulf, cluster de PCs conectadas entre sı́ para
formar una supercomputadora.
El objetivo de este trabajo es presentar un estudio de la performance y
optimización de clusters Beowulf a través del análisis de la compleja relación
existente entre la tecnologı́a de red, la arquitectura del nodo, los sistemas de
archivos, las herramientas de programación y la administración de procesos.
En relación a la tecnologı́a de red y a la arquitectura del nodo, se muestra
que para obtener la máxima performance de Gigabit Ethernet es fundamental
analizar cuidadosamente los elementos subyacentes. El máximo ’throughput’
alcanzable depende fuertemente del bus PCI (Peripheral Component Interconnect) del nodo, de la velocidad del procesador, sus técnicas de ’caching’,
de las caracterı́sticas de la placa de red (capacidad de realizar ’checksums’
y segmentación de paquetes TCP, disponibilidad de un bus PCI dedicado) y
del ’tuning’ de los parámetros TCP.
En relación al sistema de archivos, se muestra que PVFS (Parallel Virtual
File System) resulta la opción más apropiada para utilizar el espacio en disco
distribuido entre los nodos del cluster y para optimizar el uso del mismo en
programas paralelos.
En relación a las herramientas de programación, se prueba que las funciones de operaciones de entrada/salida, MPI I/O (ROMIO), son las que
acceden en forma más eficiente a las áreas de disco global.
Finalmente, con respecto a la administración de procesos se sugiere, entre otras polı́ticas, la implementación de ’checkpointing’ para aumentar el
’throughput’ total de procesos.
En sı́ntesis, éste trabajo pretende mostrar la importancia que tiene para
el logro de una performance óptima de un cluster Beowulf, la elección de
la tecnologı́a de red, la arquitectura del nodo, el sistema de archivos, el administrador de procesos y las herramientas de programación. Un correcto
balance de estos ingredientes permite obtener una notable mejora en el uso
de los recursos facilitando el objetivo fundamental de la computación paralela
que es permitir resolver problemas más grandes en menor tiempo.
6
Agradecimientos
Quisiera dedicar este trabajo especialmente a mis padres Graciela y Juan,
a mis abuelos La Baby y Marcelo, a mi hermana Marı́a y a Rodo. Ellos fueron
las principales personas que me impulsaron y apoyaron cuando decidı́ seguir
esta carrera y siempre estuvieron presentes durante el transcurso de ella.
En los años de estudiante fueron muchos los que participaron de la ’lucha’
por el tı́tulo. Ellos recordarán bien las horas sin dormir que compartimos en
tiempos de entregas de trabajos prácticos, parciales y finales. Podrı́a nombrarlos a todos aquı́ pero no quisiera arriesgarme a olvidar a uno sólo de
ellos.
Y fuera del ambiente universitario los amigos y compañeros de trabajo
fueron la compañı́a ideal para los tiempos de ocio y lamentos.
Y ahora sı́ voy a nombrar a los responsables más directos sobre la realización de este trabajo. A los que lo leyeron una y otra vez para sacarle el
jugo, a los que me explicaron pequeñas pero muy valiosas dudas que me iban
surgiendo, a los que soportaron la desesperación por terminar... Ellos son
especialmente dos grupos, la gente del laboratorio de Sistemas Complejos:
Silvina, Esteban, Graciela, Pablo(s), Ernesto, Diego, Guillermo y Carlos. Y
los del trabajo: Isa, Diego, Jorge y Luis.
7
Capı́tulo 1
Introducción
Los clusters de computadoras se crearon con el objetivo de resolver problemas complejos en forma más económica que los supercomputadores. Están
compuestos por un conjunto de PCs interconectados por una red local. Poseen
software funcional y hardware que permiten que el cluster sea visto y administrado como un sistema único. Los clusters pueden ser agrupados según su
funcionalidad en tres grupos [12]:
servidor aplicaciones administrador central de recursos dedicados a iniciar tareas
alta disponibilidad conjunto de máquinas que garantizan redundancia y
tolerancia a fallas
alta performance sistemas que trabajan en conjunto para solucionar un
problema
Los clusters Beowulf pertenecen al último grupo. Su denominación surgió en la NASA por el investigador Donald Becker quien buscó desarrollar un
recurso de supercómputo sin tener que utilizar una supercomputadora. Interconectó un conjunto de máquinas mediante un switch y logró su objetivo,
un recurso para implementar la computación paralela de alta performance
(High Performance Computing - HPC). Es importante que las computadoras
paralelas de alta performance cumplan esta caracterı́stica, sin embargo no se
espera de ellas que sean confiables. Esto significa que debe realizar los cálculos en forma eficiente y rápida pero que una falla ocasional se tolera y puede
ser superada con solo reinicializar la corrida del problema. Además deben
cumplir con la relación costo/beneficio, se desea obtener alta performance a
bajo costo.
En este trabajo, se analizarán los puntos a tener en cuenta si se quiere
poner en funcionamiento un cluster de alta performance. Las pruebas se
realizarán en el cluster Beowulf Speedy Gonzalez del Laboratorio de Sistemas
Complejos del Departamento de Computación, UBA. Se utilizará software
libre y gratuito. Los recursos a utilizar son:
sistema operativo Linux, Mandrake 9.2 [19]
benchmark de red NetPIPE descripto en el Apéndice B.1.1 que permite el análisis de la capacidad de la red interna que interconecta las
máquinas del cluster
8
sistema de archivos, organización de los discos distribuidos en todas
las máquinas que componen el cluster, NFS y PVFS descriptos en el
Capı́tulo 2.4
sistema de administración de procesos, PBS y MAUI descriptos en el
Capı́tulo 2.5
monitoreo del sistema (uso de memoria, CPU, discos, etc.)
herramientas de programación paralela basadas en pasaje de mensajes,
MPICH (Message Passing Interface) y ROMIO descriptas en el Capı́tulo 2.6.
Además, se llevaran a cabo pruebas en dos clusters externos al laboratorio
descriptos en el Apéndice A que permitirán comparar a Speedy con tecnologı́as más modernas.
9
Capı́tulo 2
Conceptos Básicos
2.1.
Tecnologı́a de redes
La eficiencia de un cluster de alta performance depende en gran parte
de la tecnologı́a utilizada para interconectar sus nodos. Esto se debe a que
los programas paralelos utilizan intercambio de mensajes entre los nodos
involucrados en la resolución de un problema. En esta sección se describirán
algunos aspectos teóricos necesarios a tener en cuenta durante el desarrollo
del trabajo.
2.1.1.
Tecnologı́a Ethernet
Redes Compartidas En un principio bastó con poder conectar los nodos
del cluster mediante una red compartida. Cada nodo con su placa de
red ethernet de 10 Mbps, se conectaba con los demás mediante un hub
a través de cables de cobre de par trenzado según norma de transmisión
10BaseT (10 Mbps). La tecnologı́a Ethernet es un bus broadcast que
transmite paquetes a 10 Mbps. Es un bus porque todas las máquinas
comparten el mismo canal de comunicación, y es broadcast porque todas
las máquinas reciben todas las transmisiones [14]. El modo de transmisión es half duplex.
El mecanismo de acceso al medio en Ethernet es CSMA/CD (Carrier
Sense Multiple Access/Collision Detection). Consiste en que cada nodo
se fija si el bus está libre, si es ası́ envı́a su paquete. Puede ocurrir que
otro nodo haya visto el bus libre al mismo tiempo y haya enviado un
paquete, esto generará una colisión de paquetes que podrá ser detectada
por el transmisor teniendo que reenviar el mensaje luego de un intervalo
de tiempo.
Esta opción presenta la desventaja de que el medio de transmisión de
mensajes es muy lento y con posibles colisiones. Además a medida que
se agregan nodos al cluster estos problemas se producen con mayor
frecuencia y es posible que la red se sature.
Redes Conmutadas Actualmente las computadoras son más potentes y
necesitan un medio de conexión más veloz para alcanzar los niveles de
alta performance deseados. En las redes conmutadas se reemplazó el
10
hub por el switch. En un principio, los conmutadores tenı́an una velocidad de transferencia de 100 Mbps, actualmente han evolucionado
hasta alcanzar 1000 Mbps y más. Esta opción requiere que cada nodo
posea una placa de red fast ethernet (100 Mbps, norma 100BaseT) o
gigabit ethernet (1000 Mbps), dependiendo de la capacidad del switch,
conectadas por un cable de par trenzado. Dicho cable posee 4 pares
de hilos, en Ethernet y Fast Ethernet sólo se empleaban 2 pares, en el
caso de Gigabit se utilizan los 4 pares. Para Gigabit se necesita como
mı́nimo cables de categorı́a 5e y preferentemente categorı́a 6.
En las redes conmutadas cuando un nodo transmite un mensaje a través
del switch hacia otro nodo, es el switch quien se encarga de enviar el
mensaje a la placa del nodo destino. Utiliza el protocolo Ethernet en
modalidad full duplex, con envı́o y recepción de paquetes en forma
simultánea. La transmisión entre la estación y el switch es punto a
punto, el mecanismo CSMA/CD ya no tiene sentido, se emplea un
par de hilos para transmisión de datos y otro para recepción en forma
simultánea. No requiere estar escuchando permanentemente en el bus
como en el primer caso.
2.1.2.
Protocolo IP, Internet Protocol (MTU)
El protocolo estándar TCP/IP define al datagrama IP como la unidad de
información enviada a través de la red y provee las bases para la distribución
de paquetes. El MTU, Maximum Transfer Unit, es el tamaño de paquete más
grande que puede ser transferido a través de una red fı́sica. En teorı́a, puede
ser de hasta 64 Kbytes, pero en la práctica está determinado por el hardware
de red. Actualmente el estándar de los dispositivos para interconectar redes
(switches, routers, etc.) es de 1500 bytes, pero algunas placas de red gigabit
permiten configurar el MTU de hasta 9000 bytes logrando ası́ incrementar
el throughput. Se debe tener en cuenta que si el MTU es muy pequeño, la
máquina estará respondiendo seguido mientras que si es muy grande puede
haber errores y los paquetes tendrı́an que ser retransmitidos.
2.1.3.
Protocolo TCP, Transmission Control Protocol
TCP es un protocolo confiable pues garantiza que los datos llegarán a
destino y orientado a conexión pues simula un túnel entre el emisor y el
receptor. Básicamente una conexión TCP consta de las siguientes partes:
emisor con un buffer para el envı́o de mensajes cuyo tamaño está dado en
bytes
receptor con un buffer para la recepción de mensajes cuyo tamaño está dado
en bytes y puede ser diferente al anterior
Dichos buffers, también llamados ventana de congestión, cambian de tamaño
dinámicamente en el transcurso de una conexión TCP controlando ası́ el flujo
de datos.
El protocolo TCP provee confiabilidad debido al uso de paquetes de acknowledge (ACK), estos paquetes son enviados por el receptor para confirmar
11
que se ha recibido un paquete determinado. Si el emisor no recibe el ACK
en un determinado transcurso de tiempo, reenvı́a el paquete. Si recibe el
ACK continúa enviando paquetes. El tamaño de la ventana de congestión
del emisor indicará cuantos paquetes puede enviar el mismo mientras que
espera el ACK de cada uno de ellos. El tamaño de la ventana del receptor
estará condicionado por la rapidez que el mismo tenga para enviar el ACK
del paquete recibido y liberar espacio en el buffer.
La performance depende del tamaño de las ventana y de la velocidad en
que la red transmita los paquetes. Incrementando el tamaño de la ventana
es posible reducir por completo los momentos ociosos de la red. Una buena
configuración del tamaño de la ventana deslizante, mantiene a la red completamente saturada de paquetes, obteniendo un mejor throughput. Luego, el
máximo throughput está condicionado por el tamaño de ambos buffers. La
siguiente fórmula permite calcular el máximo ancho de banda dado el tamaño
del buffer emisor y el tiempo de respuesta del enlace:
buffer de envı́o
ancho de banda = tamaño delRTT
El ancho de banda, la latencia y el RTT serán explicados en la próxima
sección. Por la misma fórmula, sabiendo el ancho de banda teórico de la red
y el RTT podemos calcular el tamaño óptimo de la ventana de congestión
para lograr un buen throughput.
2.1.4.
Ancho de Banda, Latencia y RTT
La performance de la red se mide preferentemente en bits por segundo
’bps’. Sus caracterı́sticas están dadas por el ancho de banda y la latencia.
El ancho de banda indica la cantidad de datos que pueden ser transferidos a
través de un enlace por unidad de tiempo. La latencia es el tiempo necesario
para transferir un dato desde un origen al destino, generalmente se refiere a
las demoras debidas al procesamiento del dato de red. El tiempo de ida y
vuelta se denomina Round Trip Time (RTT).
El ancho de banda y la latencia están relacionados. Mientras que el máximo ancho de banda teórico es fijo (dado por el hardware de red utilizado), el
ancho de banda real se ve afectado por la latencia de la red, es decir por el
tiempo mı́nimo necesario para transferir un paquete de dato desde un punto
a otro. Mucha latencia en un corto perı́odo de tiempo puede causar cuellos
de botella que no permiten llenar el enlace, por lo tanto decrece el ancho de
banda. También se ve afectado por el overhead del hardware y del sistema
operativo. El ancho de banda práctico lo llamamos throughput. La percepción
de la velocidad de la red es una sı́ntesis de estas dos unidades de medida.
2.1.5.
Bonding
Linux permite instalar dos o más placas de red por nodo con el fin de
obtener un mayor throughput balanceando la carga entre ellas. Esta configuración se denomina bonding, es totalmente transparente para el usuario y
los procesos. Por ejemplo, si se instalan dos placas de red Fast Ethernet por
nodo y se conectan ambas placas al switch se podrı́a obtener un throughput
12
aproximado del 85 % de la suma de la capacidad de ambas placas. Se debe
tener en cuenta que se requiere un switch con el doble de cantidad de bocas
que el número de máquinas a conectar.
El bonding es un driver que es parte del sistema operativo linux. Permite
definir una polı́tica para el balance de carga entre las dos placas, por ejemplo
Round-Robin (envı́a en forma circular un paquete a cada placa disponible).
Es una buena opción para lograr mayor performance de red a bajo costo.
2.2.
Arquitectura del nodo
A grandes rasgos, el camino seguido en una transferencia de datos a través
de una red implica tres cargas en memoria. Del lado del receptor, el adaptador
de red accede directamente a memoria (DMA, Direct Memory Access) para
cargar los datos en el buffer receptor, el CPU lee los datos de dicho buffer y
los escribe al de la aplicación. En una transmisión se realiza el paso inverso.
Las cargas en memoria dependerán de la aplicación que esté siendo utilizada,
tamaños de buffers y el comportamiento de la cache.
El tráfico total de memoria, lecturas/escrituras, es a través del Front
Side Bus - FSB. La Figura 2.1 muestra el tráfico de memoria durante la
transmisión de un mensaje. La Figura 2.2 muestra el tráfico de memoria
durante la recepción de un mensaje.
Envı́o de mensajes. 1. El CPU lee el buffer de la aplicación
2. El CPU escribe los datos al buffer del socket
3. La placa de red (NIC) accede directamente a memoria y lee el
buffer del socket
Figura 2.1: Envı́o de mensajes [21]
Recepción de mensajes. 1. La placa de red (NIC) accede directamente
a memoria y escribe el buffer del socket
2. El CPU lee el buffer del socket
3. El CPU escribe los datos al buffer de la aplicación
13
Figura 2.2: Recepción de mensajes [21]
2.3.
Implementación de Gigabit Ethernet en
clusters de PC
Dado un cluster de PCs interconectado mediante placas de red y switch
Fast Ethernet que presenta buena performance de comunicación, no es trivial
migrar su medio de conexión a Gigabit Ethernet. No se obtiene con facilidad
un aumento de rendimiento utilizando placas de red y switch Gigabit Ethernet. Esto se debe en gran parte a la arquitectura del bus PCI (Peripheral
Component Interconnect) que poseen los motherboards que en general se encuentran en uso y que poseen placas de red fast ethernet. Otra posible fuente
de dificultad son los potenciales cuellos de botella asociados a la gestión del
FSB [31] como ası́ también la configuración de los parámetros TCP/IP.
El bus PCI es compartido entre varios dispositivos, por su naturaleza paralela. Aquellos dispositivos que se encuentren conectados al bus harán uso
del mismo rotando cı́clicamente. No solo comparten el bus sino que la frecuencia quedará definida en base al dispositivo de menor frecuencia, disminuyendo
ası́ la performance de los dispositivos más rápidos [41]. Por ejemplo, el bus
PCI está compartido por el CPU, la memoria, la placa de video, las placas
de red, etc.
En particular, las placas de red negocian la velocidad con el bus PCI. Para
una placa con un bus PCI 32 bits/33 Mhz, ver Cuadro 2.1, se observa que
nominalmente soporta 1 Gbps, pero no es recomendable. En el caso del cluster
Speedy, éste posee motherboards PC-Chip M810 con PCI 2.2 y placas de red
3Com 3c2000 que negocian a 32-bit/66 MHz, alcanzando un ancho de banda
teórico de 2 Gbps. Existe una arquitectura más moderna para bus PCI [41]
que consiste en no compartir el bus con muchos dispositivos a través de un
bridge PCI, sino que se conectan directamente con el Memory I/O Control,
MIOC alcanzando ası́ mayor throughput para las placas Gigabit. Este es el
caso del Cluster Mercurio, ver Apéndice A.3.
No solo el bus PCI puede ser responsable de los inconvenientes para alcanzar el throughput que ofrece gigabit ethernet, las ineficiencias del sistema
pueden ocurrir en varios niveles entre la capa de aplicación y el hardware.
14
Cuadro 2.1: Caracterı́sticas del throughput nominal del Bus PCI/PCI-X [41].
Se puede perder hasta el 50 % en la capa de pasaje de mensajes. El sistema operativo y los drivers usualmente aumentan la latencia y disminuyen
el ancho de banda debido a que realizan muchas copias de dato memoria a
memoria al empaquetar los datos para su transmisión. Estos movimientos
extras de datos saturan el bus de memoria, tı́picamente antes de saturar el
bus PCI [31]. Por otro lado, también se debe tener en cuenta que los sistemas
operativos actualmente calculan los parámetros TCP/IP suponiendo el uso
de placas fast ethernet. Con lo cual, se deben configurar los parámetros por
defecto de las ventanas TCP/IP como ası́ también los buffers para pasaje de
mensajes de MPICH.
2.4.
Sistema de archivos
Dada la arquitectura, diseño y composición del hardware de Speedy se
tiene la necesidad de utilizar la capacidad de disco de cada uno de los nodos en
forma global. Se quiere aplicar un sistema de archivos que soporte el acceso
a los mismos en forma paralela. Cada sistema de archivos será evaluado
con respecto a su velocidad de acceso de entrada/salida y su escalabilidad.
También se tendrá en cuenta el tipo de aplicaciones que se quiere ejecutar en
el cluster Speedy, aquellas con gran cantidad de operaciones de entrada/salida
y las que tienen poca cantidad de operaciones de entrada/salida
Se evaluarán los siguientes sistemas de archivos:
local (ext3) tipo de fichero utilizado en Linux
NFS - Network File System
PVFS - Parallel Virtual File System
MFS - Mosisx File System
GFS - Global File System
La Figura 2.3 ilustra cómo están embebidos los distintos sistemas de
archivos con el sistema operativo (SO). Cuando se ejecuta una operación
ésta llama al SO para abrir, cargar o tomar los datos de un archivo. El
mecanismo de acceso a un archivo acepta el pedido automáticamente lo pasa
al software de su sistema de archivos local, al cliente NFS, al cliente PVFS
15
o al que corresponda dependiendo si el archivo está en el disco local, en una
máquina remota o en varias.
Cuando recibe un pedido, el software del cliente utiliza el protocolo correspondiente para conectarse al/los servidor/es remotos apropiados y lleva a
cabo la operación requerida. Cuando el servidor remoto contesta, el software
del cliente devuelve los resultados a la aplicación que inicio el pedido.
2.4.1.
Sistema de archivo local - ext3
El tipo de fichero local ext3 [24], utilizado actualmente en Linux, posee la
ventaja de tener journaling (registros de eventos periódicos), esto garantiza
disponibilidad e integridad de los datos y velocidad de acceso.
disponibilidad pues luego de una caı́da del sistema inesperada ext3 no
requiere un chequeo total del sistema de archivos gracias al journal.
integridad garantiza integridad de los datos luego de una caı́da abrupta del
sistema.
velocidad a pesar de escribir los datos mas de una vez, es más rápido que
ext2, su predecesor, pues el journaling optimiza el movimiento de las
cabezas del disco.
Posee distintas opciones de journal : registrar periódicamente todos los
archivos y los metadata, o bien, registrar sólo los metadata. En el último
caso se puede optar por escribir los datos en el sistema de archivos antes que
el metadata lo que garantiza que todos los metadata apunten a datos válidos
o escribir el metadata antes que el dato en este caso el sistema de archivos
será consistente pero luego de una caı́da del sistema podrı́an aparecer datos
viejos. Esto permite al administrador decidir si se quiere mayor rapidez o
mayor consistencia de datos.
2.4.2.
Network File System - NFS
NFS es un protocolo desarrollado por Sun Microsystems, Incorporated.
Permite que un conjunto de máquinas accedan a sistemas de archivos remotos
en forma transparente.
Cuando un cliente monta un sistema de archivos, el servidor de NFS le
devuelve un file handle (FH) que contiene el tipo de archivo, el disco, el
i-nodo e información de seguridad. La implementación de NFS, ver Figura
2.3 [14], independiente del protocolo, consiste en tres capas. La primer capa de
llamadas al SO (OPEN, READ, CLOSE) luego de examinar el pedido invoca
a la segunda capa, el sistema de archivos virtual (VFS). Ésta se encarga de
mantener una tabla con una entrada por archivo abierto llamado v-nodo. Si
el archivo es local, la entrada contendrá un i-nodo y la tercer capa será la que
manipula archivos locales y si el archivo es remoto, la tercer capa estará a
cargo del cliente NFS. Analizaremos las llamadas al sistema: MOUNT, OPEN
y READ.
16
Figura 2.3: Estructura de capas de NFS [14]
MOUNT Para montar un fichero remoto se utiliza el comando mount, se
especifica el directorio remoto y el directorio local donde será montado, entre otra información. El programa mount analiza el nombre del
directorio remoto, descubre la máquina a la cual pertenece, la contacta
y le pide el FH. Si el directorio existe y está disponible para su acceso
remoto, el servidor le da el FH. Finalmente, el programa realiza una llamada al sistema MOUNT y le pasa el FH al kernel. El kernel construye
el v-nodo y le pide al cliente NFS que cree el r-nodo (i-nodo remoto) en
su tabla interna para guardar el FH. Luego el v-nodo apunta al r-nodo.
Cada v-nodo de la capa VFS contendrá un puntero o un r-nodo en el
código del cliente NFS o bien, un puntero a un i-nodo del SO local.
Luego desde la capa VFS se puede saber si el directorio o archivo es
remoto o local y si es remoto, se puede encontrar el FH.
OPEN Durante la examinación del ’path’ del archivo, el kernel descubre
que el directorio en el cual está montado el fichero es remoto. Busca en
la tabla de v-nodos el puntero al r-nodo. Luego pide al cliente NFS que
abra el archivo. El cliente NFS busca el resto del ’path’ en el servidor
remoto asociado con el directorio montado y devuelve el FH. Crea un
r-nodo para el archivo remoto en sus tablas y reporta a la capa VFS,
la cual pone en sus tablas el v-nodo que tendrá un puntero al r-nodo.
Entonces vemos que todo archivo o directorio abierto tiene un v-nodo
que apunta a un r-nodo o i-nodo.
Notemos que el que guarda la información del FH es el cliente, el servidor no guarda ningún tipo de información sobre el archivo. El servidor
provee los FH ante un pedido, pero no lleva ningún registro de los
FH entregados. Cuando un cliente le envı́a un FH para acceder a un
archivo, el servidor verifica que el mismo exista y lo usa.
READ Cuando el FH es utilizado en llamadas posteriores al sistema, por
ejemplo para una lectura, la capa VFS localiza el v-nodo correspondiente y a partir de el determinara si es local o remoto y también que
i-nodo o r-nodo lo describe.
17
Se utilizan distintas técnicas para mejorar la eficiencia del protocolo. Las
transferencias entre el cliente y el servidor se realizan en bloques de 4096
bytes, incluso en el caso en que se pidan menos bytes. Una vez que el cliente
recibe el bloque de 4 KB, pide el siguiente, este procedimiento se llama look
ahead e incrementa la performance de NFS. Para las escrituras se procede
del mismo modo, sólo se envı́a la escritura al servidor cuando el cliente junta
un bloque de 4 KB. Se recomienda elevar el tamaño del bloque a 8192 bytes
para lograr mayor performance.
Otra técnica utilizada para mejorar la performance es el uso de cache, los
servidores guardan datos en cache para evitar accesos al disco. Los clientes,
mantienen dos caches, una para los atributos del archivo (i-nodos) y otra para
los datos. Cuando se necesita un i-nodo o un bloque de archivo, se verifica
primero si está en cache, si es ası́ se evita el tráfico de red.
Mientras que la cache en el cliente ayuda a mejorar la performance, introduce problemas de consistencia. Si dos clientes tienen en cache la misma
porción de un mismo archivo, y uno de ellos la modifica, cuando el otro lea
el bloque leerá información vieja. La cache no es coherente. NFS trata de
evitar este problema del siguiente modo:
asocia a cada bloque en cache un contador de tiempo, cuando el mismo
expira (normalmente 3 segundos para bloques de datos y 30 segundos
para directorios) se descarta la entrada;
cuando se abre un archivo que esta en cache envı́a un mensaje al servidor para averiguar cuándo fue modificado el archivo por última vez, si
la misma ocurrió luego de la copia en cache la misma se descarta y se
trae la nueva información;
cada 30 segundos expiran los datos de la cache y todos los bloques que
han sido modificados se envı́an al servidor.
En resumen, NFS ha sido muy criticado pues mientras que un cliente
escribe un archivo puede o no ser visto por otro que lo está leyendo, dependiendo del tiempo. Cuando se crea un archivo puede no ser visto por el resto
de los clientes hasta pasados 30 segundos. La semántica del acceso a archivos
no está bien definida, si un conjunto de programas cooperativos se ejecutan
varias veces podrı́an dar distintos resultados dependiendo del tiempo.
2.4.3.
Parallel Virtual File System - PVFS
PVFS es un sistema de archivos paralelo cliente/servidor en el cual los
archivos se distribuyen en forma transparente en discos de múltiples servidores. Su caracterı́stica principal es que a través de él las aplicaciones paralelas pueden acceder velozmente a los datos. Provee tres servicios básicos
a los usuarios:
un espacio de nombres consistente entre los nodos del cluster que permite a los programadores acceder a los archivos desde múltiples nodos;
distribución fı́sica de los datos entre los discos de los nodos que permite
evitar cuellos de botella tanto en la interface del disco como ası́ también en la red proveyendo mayor ancho de banda a los recursos de
entrada/salida (E/S);
18
interface de E/S que permite que los usuarios controlen cómo serán
distribuidos los datos y habilitar modos de acceso.
Figura 2.4: Diagrama del sistema PVFS [17].
Como se observa en la Figura 2.4 las máquinas que integran el sistema PVFS
pueden tomar uno o más de los siguientes roles:
Servidor Metadata. Existe un único servidor metadata por sistema de
archivos PVFS en el cual corre el demonio MGR. Contiene información correspondiente a los archivos y directorios que posee como ser
permisos, dueño, ubicación de los datos distribuidos en los servidores
de E/S. Es contactado por los clientes cuando necesitan leer un directorio o bien crear, eliminar, abrir o cerrar un archivo.
Servidor de E/S. Puede haber uno o más. Cada servidor de E/S (IOD)
aporta una porción de su disco local para integrar la partición PVFS.
Lleva a cabo las operaciones de acceso a los archivos sin intervención
del servidor metadata.
Cliente. Puede haber uno o más clientes. En ellos se corren las aplicaciones
que acceden a los archivos y directorios de la partición PVFS. Cuando
una aplicación desea abrir, cerrar, crear o eliminar un archivo se comunica directamente con el MGR a través de la biblioteca libpvfs. Una vez
que el servidor metadata localiza el archivo, le devuelve la ubicación a
la aplicación. Luego ésta puede utilizar la biblioteca para acceder directamente al servidor de E/S correspondiente para leer o escribir sin
necesidad de comunicarse con el MGR (ver Figura 2.5).
PVFS utiliza el protocolo TCP/IP para transmitir los datos. Las particiones PVFS pueden ser directamente accedidas por las aplicaciones a través
de la bibliotecas libpvfs.a, archivos de include y el archivo de configuración
pvfstab que indica cómo acceder a los ficheros PVFS. También se pueden utilizar las funciones ROMIO [36] como interface de E/S de MPICH las cuales
19
Figura 2.5: Flujo de metadata y datos en PVFS [17].
utilizan las bibliotecas mencionadas. Por otro lado, se puede acceder indirectamente a través del kernel, ver Figura 2.6. En este caso los clientes deben
utilizar:
el demonio pvfsd que se encarga de las transferencias a través de la red,
comunicación entre clientes;
el módulo del kernel pvfs.o registra en el kernel este tipo de fichero
PVFS permitiendo que los archivos PVFS sean accedidos a través de
las clásicas llamadas al SO. Este módulo es el que permite que los
programas comunes accedan a particiones PVFS que estén previamente
montadas;
el dispositivo /dev/pvfsd es utilizado como punto de comunicación entre
el módulo pvfs.o y el demonio pvfsd;
el ejecutable mount.pvfs es utilizado por el comando mount para llevar
a cabo el proceso especı́fico de montar un fichero PVFS.
Figura 2.6: Flujo de datos a través del kernel [17].
Los clientes hacen uso transparente de la partición PVFS a cambio de
pérdida de performance debido al movimiento de datos entre el kernel y el
demonio pvfsd. Por eso existe la opción de utilizar directamente las bibliotecas PVFS, o a través de las funciones ROMIO, para que el programador
pueda especificar la distribución fı́sica del archivo y configurar particiones
20
lógicas, logrando ası́ mayor performance sobre todo en aplicaciones paralelas
que posean operaciones colectivas.
Los programas que estén desarrollados para utilizar funciones de entrada
y salida propias de UNIX (read, write), correrán también sobre una partición
PVFS sin necesidad de hacerles ningún cambio. Si se crea un archivo de este
modo será distribuido entre todos los servidores de E/S con las variables
default, porciones de 64 KB. Notar que en este caso, cada escritura o lectura
que se quiera realizar sobre dicho archivo involucrará a todos los servidores de
E/S. Con muchos accesos a pequeñas porciones no dará un buen resultado.
Por eso es conveniente utilizar las funciones de la biblioteca estándar (fread,
fwrite) que permiten definir el tamaño del buffer a utilizar. Generalmente el
PVFS tendrá mayor performance con tamaños de buffers grandes.
En la Figura 2.7 se presenta un ejemplo de cómo se distribuye un archivo
en una partición PVFS. Se puede definir en qué nodo se comienza a guardar el
archivo (base=1), cuántos servidores de E/S utilizará (pcount=4) y cuantos
chunks (grupos de igual cantidad de bytes) habrá contiguos en cada servidor
de E/S, strip size (ssize).
Figura 2.7: Ejemplo de distribución de un archivo en una partición PVFS [16]
Si el programador define particiones lógicas en un archivo, los accesos
subsiguientes a dichas regiones se harán en forma más eficiente. Dichas particiones, son útiles para programación paralela pues simplifican el acceso a
datos compartidos por un conjunto de tareas de una aplicación. Cada proceso
puede definir su propia partición lógica y una vez definida todas las operaciones de E/S verán únicamente los datos correspondientes a dicha tarea. Las
particiones se definen con tres parámetros: offset, distancia en bytes desde
el inicio del archivo hasta el primer byte de la partición; group size (gsize)
número de bytes continuos de una partición y stride distancia desde el inicio
de un grupo de bytes al siguiente. En la Figura 2.8 se muestran dos ejemplos
de particiones lógicas, en el caso (A) se desea que 4 procesos paralelos procesen un archivo de 40.000.000 registros de 1.000 bytes cada uno, entonces
cada proceso (0..3) configurará su offset de modo tal de particionar al archivo
en regiones disjuntas, 10.000.000 registros para cada uno, (B) otra opción de
particionamiento del archivo es repartir en forma cı́clica los registros (roundrobin), en este caso el group size será 1.000 bytes y la cantidad de registros
a saltear hasta el próximo perteneciente a la misma tareas es de 4.000 bytes
(stride size). También se pueden definir particiones lógicas para acceder a un
21
archivo en forma matricial.
Figura 2.8: Ejemplos de particiones Lógicas PVFS [16]
2.4.4.
Mosix File System con Direct File System Access - MFS con DFSA
MFS es un sistema de archivos para clusters que optimiza el uso de la
red migrando los procesos hacia el lugar donde se encuentran los datos en
vez de buscar los datos y traerlos hacia el proceso. Esto permite mejorar la
performance de entrada/salida y reduce la congestión de la red evitando el
uso de protocolos como ser NFS y PVFS entre otros. DFSA permite operaciones paralelas consistentes en diferentes sistemas de archivos. Este tipo de
sistema de archivos no se probará en este trabajo, solo se menciona a modo
informativo.
2.4.5.
Global File System - GFS
GFS [23] es un sistema de archivos compartido apropiado para clusters
con share storage (almacenamiento compartido de datos) que permite a los
clientes acceder a los mismos mientras que mantiene la consistencia de los
datos. Los nodos comparten espacio de almacenamiento, cache de datos y
control. El problema de este tipo de sistema de archivo es el alto costo del
hardware por lo tanto en este trabajo tampoco será probado. Su escalabilidad
aún no se conoce.
2.5.
Administración de Procesos
El cluster es utilizado por un grupo de usuarios heterogéneo, alumnos y
profesores de diversas áreas. Esto implica que el tipo de problemas que se
ejecutan en el cluster es variado y por lo tanto se necesita un método que
permita balancear la carga de procesos que se genera a partir de un conjunto
de usuarios con distintos requerimientos:
mucha memoria
22
poca memoria
mucho uso de CPU
poco uso de CPU
muchas horas de procesamiento
pocas horas de procesamiento
gran cantidad de pasaje de mensajes
poca cantidad de pasaje de mensajes
Es necesario aplicar polı́ticas de administración de procesos para optimizar el ’throughput’ de procesos y ası́ utilizar el cluster en forma óptima aumentando la disponibilidad de una máquina de alta performance para
un mayor número de investigadores. Para esto se utilizaron las aplicaciones
’Portable Batch System’ (PBS) como administrador de procesos y ’MAUI
Scheduler’ que permite definir polı́ticas para decidir qué proceso de la cola
se ejecutará y en qué momento.
2.5.1.
Portable Batch System - PBS
PBS [10] es un sistema de control de ejecución de procesos y de asignación
de recursos a los mismos (cpu, memoria, cantidad de procesadores, tiempo
de ejecución de CPU, tiempo total de ejecución de un proceso ’walltime’).
Como tal, aceptará procesos ’batch’, un script escrito en shell, atributos de
control y se encargará de preservar y proteger el proceso hasta que el mismo
comience su ejecución, se ejecute y devuelva la salida a quien le solicitó la
ejecución del proceso. PBS consiste básicamente en cuatro componentes:
1. Comandos de:
usuario permiten enviar a ejecutar procesos, monitorearlos, modificarlos y borrarlos (qsub, qstat, qalter y qdel)
operador este tipo de usuario tiene más privilegios que los usuarios
comunes, puede encender y apagar colas, bajar y levantar el servidor, modificar o borrar procesos de usuarios (qdisable, qenable,
qrun, qstart, qstop, qterm, pbs_mom, pbs_server y pbsnodes)
administrador posee el máximo nivel de privilegios, puede realizar
todas las operaciones anteriores y además puede modificar la configuración de las colas y del servidor (qmgr, qenable, qrun)
2. ’Job Server’ (demonio pbs server) corre en el nodo ’master’, su función
principal es proveer los servicios básicos como ser recibir/crear un proceso ’batch’, modificarlo, protegerlo de ’system crashes’ y ejecutar el
proceso.
3. ’Job Executor’ (demonio pbs mom) este demonio es quien realmente se
encarga de poner el proceso en ejecución cuando recibe una copia del
mismo enviada por el pbs server. También tiene la responsabilidad de
devolver la salida del proceso al usuario cuando el servidor se lo indica.
23
4. ’Job Scheduler’ (MAUI scheduler) Es quien controla, según las polı́ticas
definidas, qué proceso corre, cuándo y dónde. PBS tiene tres posibles ’schedulers’ para habilitar pero son básicos y no permiten definir
polı́ticas precisas como el MAUI.
2.5.2.
MAUI Scheduler
El encolador MAUI [11] es un sistema avanzado de encolamiento de procesos por lotes, adecuado para la computación cientı́fica en gran escala o,
en su versión actual, computación de alta performance (High Performance
Computing - HPC). Fue diseñado para correr sobre plataformas Alpha e Intel, con sistemas operativos IBM SP y Unix/Linux y puede utilizar distintos
administradores de recursos entre ellos PBS (Portable Batch System).
’MAUI Scheduler’ provee un mecanismo para enviar a ejecutar procesos,
ejecutarlos y hacer un seguimiento del estado del mismo en un sistema con
recursos compartidos. Esta tarea es muy importante en un ’batch system’
que provee acceso centralizado a recursos distribuidos. Además de proveer
una visión global de los recursos del cluster, MAUI puede administrar dichos
recursos de manera justa y efectiva. Permite definir polı́ticas de asignación
de los recursos, qué proceso corre, dónde y cuándo maximizando el ’throughput’ del sistema. MAUI soporta un sistema de reserva de recursos avanzada,
niveles de calidad de servicio (QOS), métodos para optimizar la distribución
de procesos en la arquitectura del sistema (’backfill’) y administración de
asignación de los recursos en general (’allocation management’). Su esquema
de ’scheduling’ está basado en un concepto avanzado de reserva de tiempo
(’walltime’) combinada con ’backfill’. La principal diferencia con respecto a
otros encoladores (e.g. NQS, DQS) es que MAUI permite que algunos procesos de menor prioridad se ejecuten antes que otros de mayor prioridad si y
solo si no se produce un retraso la ejecución de mayor prioridad.
Los comandos disponibles para todos los usuarios son:
showq muestra información sobre procesos: en ejecución, ociosos, no encolados (son aquellos enviados al sistema pero que están considerados no
elegibles, no pueden ganar prioridad)
showbf muestra los recursos disponibles
showstart jobid muestra el tiempo aproximado de iniciación del proceso
checkjob jobid muestra detalles sobre los procesos encolados. Los usuarios
pueden ver solamente el estado de sus propios procesos.
2.5.3.
Interacción entre PBS y MAUI
MAUI Scheduler es un conjunto de funciones que permiten un ’schedule’
racional y capacidades de ’backfill’ utilizando un administrador de recursos
del sistema, PBS. PBS es un sistema de administración de procesos que
provee información de los recursos de la máquina al MAUI y se encarga de
ejecutar los procesos según las indicaciones del mismo. La Figura 2.9 muestra
un esquema que explica en forma sintética la interacción entre PBS y MAUI.
24
Figura 2.9: Interacción entre PBS y MAUI
En sı́ntesis:
el usuario envı́a a encolar un proceso con el comando qsub al PBS server
MAUI consulta al PBS server en forma periódica acerca de los procesos
encolados
MAUI consulta a los PBS moms para saber el estado de los recursos
del sistema
MAUI en base a los requerimientos de los usuarios y a sus reglas predefinidas, asigna prioridades y ordena la ejecución de los procesos.
2.6.
Herramientas de programación
2.6.1.
MPICH
El paradigma de pasaje de mensajes Message Passing Interface - MPI [26],
es utilizado usualmente en distintas clases de computadoras paralelas, especialmente en aquellas que poseen memoria distribuida. Es un estándar de
funciones para llevar a cabo el pasaje de mensajes en la programación paralela. Puede invocarse desde C y Fortran. Una función de pasaje de mensajes
se encarga simplemente de transmitir datos de un proceso a otro a través de
la red. MPICH [26] es una de las tantas implementaciones de MPI que actualmente se encuentran disponibles y la que está instalada en el cluster Speedy.
Provee los siguientes tipos de operaciones descriptas en detalle en [25]:
Combinación de contexto y grupos de mensajes a través de un comunicador
Comunicación punto a punto
• estructuras de buffers y tipos de datos
• modos de comunicación: normal (bloqueante y no bloqueante),
sincrónica, buffered
25
Comunicación Colectiva
• gran variedad de rutinas para pasar datos entre procesos
• definición de grupos
Control de errores
En los sistemas UNIX, MPICH utiliza la biblioteca llamada p4 [27, 28]
como interface sobre la capa TCP. Las transferencias de datos sólo se llevan a cabo durante las llamadas a las funciones de la biblioteca MPICH.
Se puede optimizar el uso de la biblioteca p4 mediante la configuración
de diversas variables en el entorno del usuario. Por ejemplo, la variable
P4 SOCKBUFSIZE se utiliza para definir el tamaño del buffer para el socket,
se define en bytes. Se recomienda actualizar el valor por defecto que tiene la
variable P4 SOCKBUFSIZE de 32 KB por 128 KB, esto permite aumentar
el throughput de MPI [30].
Por otro lado, se puede optimizar el uso del protocolo TCP utilizando
la opción -p4sctrl al ejecutar un trabajo por lı́nea de comandos. Dicha opción permite definir distintas caracterı́sticas del socket TCP, pero sólo se
recomienda modificar el bufsize, en este caso se define en KB [30, 31]. Por
ejemplo, si se quiere definir el buffer del socket en 64 KB (por defecto es de
16 KB), se debe ejecutar:
# mpirun -np 2 mpptest -p4sctrl bufsize=64
Es importante mencionar que la biblioteca p4 utiliza tres protocolos de
pasaje de mensaje dependiendo del tamaño del paquete a transmitir [29].
Ellos son: Short los datos son enviados junto con la información de control
(menor o igual a 16 KB), Eager los datos son enviados sin esperar que el
receptor los pida (entre 16 y 128 KB) y Rendezvous los datos no serán
enviados hasta que el receptor los pida (mayor a 128 KB). Esta estrategia en
el tratamiento de los paquetes se realiza con el fin de optimizar la latencia en
el envı́o de mensajes cortos y alcanzar mayor ancho de banda para los largos.
2.6.2.
ROMIO
ROMIO [36] es una implementación de funciones para manejo de E/S de
alta performance portable a MPI-IO. Estas funciones pueden ser utilizadas
sobre distintos tipos de sistemas de archivos (NFS, PVFS, ufs - Unix file
system, linux ext3, etc.) Se caracteriza por la utilización de dos técnicas
novedosas para el manejo de datos:
data sieving Técnica para acceder eficientemente a bloques de datos no
contiguos cuando las funciones primitivas del fichero utilizado no pueden
hacerlo. Consiste en acceder a las regiones de datos no contiguas leyendo
un bloque de datos que contiene todas las regiones deseadas incluyendo
los datos que están superfluos y que no se necesitan. Las regiones de
interés serán extraı́das en el cliente. Esta técnica tiene la ventaja de
realizar una única transferencia de datos pero lee más datos de disco
que los requeridos y transfiere más datos por la red.
two phase I/O También llamada collective buffering, es una optimización
para operaciones colectivas de E/S. El conjunto de E/S independientes
26
que componen la operación colectiva, es analizado para determinar
que regiones deben ser transferidas (leı́das o escritas). Dichas regiones
serán distribuidas entre los procesos que finalmente interactuarán con
el fichero. Por ejemplo, en el caso de una lectura, los procesos encargados de recolectar los datos leerán sus regiones de disco y redistribuirán
los datos a sus ubicaciones finales. Mientras que en el caso de una escritura, los datos son recolectados primero por el proceso que pide la
escritura y luego son tomados por los procesos encargados de realizar
efectivamente la escritura a disco.
27
Capı́tulo 3
Experimentos y optimización
3.1.
Performance de Red
El diseño, construcción y utilización de un sistema de alta performance
requiere de la medición y optimización de la configuración de la red. En esta
sección se evaluará y optimizará la performance de red de Speedy mediante
la ejecución del benchmark de red NetPIPE descripto en el Apéndice B.1.
Además se compararán algunos de los resultados obtenidos en Speedy con los
clusters externos Meteoro y Mercurio descriptos en el Apéndice A.2 y A.3
respectivamente.
En el punto 3.1.1 se discute el throughput de TCP y en el 3.1.2 se plantea
el mismo análisis para el caso de MPICH. La influencia del tamaño de las
ventanas de congestión de TCP y el rendimiento de Speedy se analizan en el
punto 3.1.3. Finalmente, en el apartado 3.1.4 se compara la performance de
los diferentes clusters utilizados en este trabajo.
Para llevar a cabo estos experimentos se realizaron las pruebas con las
siguientes configuraciones:
una placa de 100 Mbps Fast Ethernet por nodo conectadas mediante
un switch Fast Ethernet
dos placas de 100 Mbps Fast Ethernet por nodo configuradas en bonding
interconectadas mediante un switch Fast Ethernet
una placa de 1000 Mbps Gigabit Ethernet por nodo conectadas con un
switch Gigabit Ethernet
una placa de 1000 Mbps Gigabit Ethernet por nodo conectados espalda
contra espalda.
Para materializar los cuatro escenarios en el cluster Speedy cuyo hardware
es heterogéneo, se tomaron los nodos 12 y 13 de iguales caracterı́sticas, ver
Apéndice A.1, Cuadro A.1. En los clusters externos Meteoro y Mercurio sólo
se probó Bonding y Gigabit respectivamente y se tomaron un par de nodos
al azar debido a que son clusters homogéneos a nivel de hardware.
3.1.1.
Mediciones de Throughput de TCP
Se desea evaluar el throughput de la red del cluster Speedy a nivel de
protocolo TCP. Para esto se utilizó el módulo tcp del benchmark NetPIPE.
28
Con los resultados obtenidos se realizaron los gráficos de throughput según
el tamaño de bloque transferido, de saturación de la red y de firma ethernet
(definidos más adelante). Éstos últimos permiten analizar el máximo tamaño
de paquete para el cual se logra un incremento en el throughput y la latencia
de la red respectivamente.
Se tomó la siguiente configuración para las ventanas de congestión de
TCP:
Fast Ethernet (FE) y Bonding (FEB) buffer de envı́o 16 KB,
Gigabit Ethernet (GE) buffer de envı́o 64 KB,
en ambos casos el buffer de recepción es de 85 KB. El buffer de envı́o para GE
se configuró modificando las variables de configuración del socket TCP del
sistema operativo Linux, descriptas en el Apéndice C, según el Cuadro C.1.
Por otro lado, en el caso en que se conectan las máquinas espalda contra
espalda, se realizaron mediciones para MTU de 3000 y 9000 bytes. Esto
pudo llevarse a cabo pues las placas de red permitı́an el uso de jumbo frames,
tamaño de datagramas mayores a 1500 bytes. Se tomó un cable cruzado y
se conectaron las dos máquinas espalda contra espalda. Con el comando de
linux ifconfig se configuraron los distintos tamaños de MTU, por ejemplo
para 3000 bytes se ejecutó:
# ifconfig eth0 mtu 3000
La Figura 3.1 muestra el throughput en función del tamaño de
bloque transferido. A simple vista, se pueden observar las mejoras resultantes al incrementar la capacidad del medio de comunicación entre los
nodos. Sin embargo, pese a utilizar placas y switch GE el mejor resultado no
alcanza los 350 Mbps.
Con respecto a GE y a la variación en el tamaño del MTU, si se aumenta a 3000 bytes se logra una mejora pareja de 20 Mbps comparada con
1500 bytes. También se logra una mejora similar con 9000 bytes, pero su
comportamiento es un poco inestable y por debajo del caso de 3000 bytes.
Es posible que el procesador no sea lo suficientemente rápido para realizar
los cálculos que requiere TCP/IP para poder utilizar la capacidad de ancho
de banda que provee GE. Al utilizar jumbo frames, se realiza menor cantidad
de cálculo TCP/IP para enviar o recibir la misma cantidad de datos. Esto
permite que el procesador pueda enviar más datos con la misma cantidad de
cálculo obteniendo un throughput mayor al utilizar jumbo frames. Por otro
lado, también se probó el MTU por defecto, 1500 bytes, con las máquinas
conectadas espalda contra espalda obteniendo el mismo resultado que cuando
se utiliza el switch Gigabit Ethernet. De aquı́ se concluye que la limitación
en el throughput no depende de él.
Todos los casos están prácticamente superpuestos para paquetes de tamaño
menor o igual a 8 bytes, esto se debe a que para paquetes tan pequeños el
benchmark envı́a un sólo paquete TCP muchas veces y devuelve el promedio
de la latencia obtenida. Estos casos no son útiles para analizar el throughput. También se observa que para cada caso la función crece abruptamente
en cierto intervalo de tiempo, es allı́ donde se obtiene un throughput sustancialmente mayor al incrementar el tamaño del bloque. Luego de dichos
29
intervalos, no se logra mayor beneficio al incrementar el tamaño del paquete.
Esta última observación se puede ver gráficamente realizando un gráfico de
saturación de la red.
El gráfico de saturación de la red [32], Figura 3.2, se obtiene de graficar
el tamaño de bloque versus el tiempo ambos en escala logarı́tmica. Se define
como punto de saturación aquel a partir del cual al incrementar el tamaño del
bloque el tiempo crece linealmente. El punto de saturación para FEB y GE,
en todos los tamaños de MTU presentados, es cuando el paquete es de 4 KB
mientras que para FE es de 2 KB. El intervalo de tiempo luego del punto de
saturación se determina intervalo de saturación. En este intervalo el gráfico
crece a velocidad constante, por lo tanto a partir de allı́, el throughput de la
red no puede mejorarse incrementando el tamaño del bloque.
Finalmente, se observa la latencia de la red mediante el gráfico de
firma ethernet [32], Figura 3.3. Se grafica el throughput versus el tiempo de
transferencia en escala logarı́tmica obteniendo ası́ un gráfico de aceleración
de la red. La latencia de la red coincide con el primer punto de tiempo. Se
observa mayor latencia para el caso de FE y FEB con 47 µs, luego sigue el
caso de GE con MTU igual a 1500 bytes con 30 µs siendo el mejor caso para
GE con MTU de 3000 y 9000 bytes con 26 µs cada uno.
Figura 3.1: Throughput de Speedy para tamaño de buffers default de sockets
TCP. Referencias: (F)ast, (E)thernet, (B)onding, M(PICH), (G)igabit.
30
Figura 3.2: Gráfico de Saturación Ethernet del cluster Speedy.
Figura 3.3: Gráfico de Firma Ethernet del cluster Speedy.
31
3.1.2.
Mediciones de Throughput de MPICH
En esta sección se desea evaluar el throughput de red de las funciones de
envı́o y recepción de mensajes de MPICH en el cluster Speedy. Para esto se
utilizó el módulo mpi del benchmark NetPIPE. Los resultados obtenidos se
analizan a partir de los gráficos de throughput según el tamaño de bloque
transferido, de saturación de la red y de firma ethernet presentados en la
sección anterior.
La Figura 3.1 muestra el throughput versus el tamaño de bloque
transferido. Se graficaron los resultados para MPICH en Fast Ethernet
(FE), Bonding (FEB) y Gigabit (GE) con MTU=1500 bytes. En el último
caso, se modificó la variable P4 SOCKBUFSIZE, explicada en el Capı́tulo 2.6.1 y se ejecutó el benchmark para buffers de 32 KB y 128 KB. Para las
pruebas de las funciones de MPICH a primera vista se observa que la performance se degrada en comparación con los resultados obtenidos para TCP.
Esto se debe al overhead que se agrega sobre el protocolo TCP al implementar
funciones de pasajes de mensajes más simples para uso del programador.
En las pruebas de MPICH con su configuración de buffers de envı́o y
recepción de mensajes por defecto (32 KB), el throughput disminuye en
promedio: 18 % para GE, 13 % para FEB y 11 % para FE. Para GE también se evaluó la performance de MPICH incrementando el buffer mediante
la variable P4 SOCKBUFSIZE a 128 KB. Se logró en promedio una mejora
del 10 % sobre el caso por defecto para paquetes mayores o iguales a 16 KB.
Notar que el pico más alto se alcanza para paquetes mayores o iguales a
128 KB. Esto se debe al protocolo que utiliza la interface P4 para envı́o de
mensajes descripto en el Capı́tulo 2.6.1. Es en ese punto donde comienza a
utilizar el protocolo Rendezvous. A pesar que el que envı́a el paquete tiene que
esperar a que el receptor los pida, se logra un incremento en el throughput
gracias al gran tamaño de los mensajes transmitidos. Para paquetes menores
a 16 KB utiliza el protocolo Short, entre 16 y 128 KB el Eager. Finalmente,
se decide dejar configurada la variable P4 SOCKBUFSIZE en 128 KB para
todos los usuarios del sistema.
En el gráfico de saturación de la red [32], Figura 3.2, se observa que los
puntos de saturación de MPICH coinciden con los de TCP. Siendo de 4 KB
para FEB y GE, mientras que para FE es de 2 KB. Aquı́ nuevamente en el
intervalo de saturación el gráfico crece a velocidad constante, por lo tanto
a partir de allı́, el throughput de MPICH no puede mejorarse considerablemente incrementando el tamaño del bloque.
Finalmente, se observa la latencia de MPICH mediante el gráfico de
firma ethernet [32], Figura 3.3. Se observa mayor latencia para el caso de FE
y FEB con 70 µs, luego sigue el caso de GE con MTU igual a 1500 bytes con
47 µs. Notar que la latencia de un mensaje de MPICH en GE es tan grande
como la latencia TCP en FE y FEB y la latencia para FE y FEB de MPICH
siguen siendo iguales entre si.
32
3.1.3.
Influencia del tamaño de las ventanas de TCP
Se realizaron mediciones variando el tamaño de las ventanas TCP. No
se obtuvieron grandes diferencias para FE y FEB pero sı́ para GE. En la
Figura 3.4 se muestran los datos obtenidos para GE para cada uno de los
tamaños de MTU evaluados (1500, 3000 y 9000 bytes). La configuración por
defecto corresponde a tamaños de 16 KB y 85 Kb para los buffers de envı́o
y recepción respectivamente y def2 cambia el tamaño del buffer de envı́o por
64KB, el resto tienen el mismo tamaño para ambos buffers. El throughput
de MPICH se muestra para buffers de 32 KB y se evaluaron las operaciones
de envı́o y recepción de mensajes sincrónicas. En los tres gráficos podemos
agrupar las pruebas en casos según su comportamiento:
1. buffers de 256, 512 y 1024 KB
2. buffers default y 128 KB
3. buffers de 64 KB
4. buffers def2
5. MPICH
Si se compara el gráfico de MTU igual a 1500 bytes con el de 3000, se
observa que cada uno de los casos se comportan proporcionalmente igual,
ganando entre 20 y 25 Mbps para MTU de 3000 bytes. Sin embargo para
MTU igual a 9000, MPICH se comporta muy irregular y los casos 2, 3 y 4
se unen sin alcanzar la performance del caso def2 de la Figura 3.4 (b). Sólo
para el caso 1, MTU igual a 9000 muestra mayor performance para tamaños
de paquetes mayores a 128 KB pero a pesar de ello, en el recorrido hasta
allı́ presenta escalones irregulares.
Del análisis de estos tres gráficos surge que la configuración con MTU=3000
bytes es óptima y estable, sin embargo no es posible llevarla a la práctica debido a que la norma IEEE 802.3 impone una MTU máxima de 1500 bytes
de carga útil que respetan los switches comerciales. Solo unos muy pocos
equipos permiten el empleo de MTU mayores. Una última observación respecto a esta figura es que al ampliar la ventana de escritura por defecto de
16 KB a 64 KB, según las recomendaciones del documento [35], se obtuvo
una mejora de un 5 % para paquetes mayores a 128 KB. El cluster Speedy
quedó con esta última configuración.
3.1.4.
Comparación entre diferentes clusters
Por último, se comparan los resultados obtenidos en el cluster Speedy con
los extraı́dos de los clusters Meteoro y Mercurio de tecnologı́as más modernas, ver Apéndice A. El cluster Meteoro, está configurado en bonding y no
presentó diferencias para TCP, sin embargo mostró mejor performance que
Speedy en MPICH. Esto puede ocurrir debido a que el sistema necesita mayor
poder de procesamiento y memoria para manejar el bonding y ejecutar un
programa paralelo, caracterı́sticas que posee el cluster Meteoro. El cluster
Mercurio posee una red gigabit ethernet y máquinas aún más potentes que
los dos clusters anteriores, procesador de 2.8 GHz, memoria cache de nivel
33
Figura 3.4: Throughput de red para distintos tamaños de ventanas de congestión
TCP (A) MTU=1500, (B) MTU=3000 y (C) MTU=9000.
34
3 de 2 MB, FSB de 800 MHz, 4 GB de RAM y un bus PCI (sin bridge
PCI) de 64 bits/100 MHz, la placa de red negocia a 66 MHz. Se observa una
performance de un 64 % superior al cluster Speedy. Puede observarse que el
throughput alcanzado en el cluster Mercurio es del orden de 900 Mbps. Según
el bus PCI que posee, resulta en un máximo ancho de banda teórico de:
PCIb = 64 bits × 66 MHz = 4224 Mbps
En este caso, la placa de red sólo utiliza el 21 % del ancho de banda
disponible. En el caso de Speedy, se utiliza un 16 % del mismo. Comparando
el máximo throughput del cluster Speedy con Mercurio, este último es 2,5
veces mayor, se debe tener en cuenta que no solo el bus PCI tiene el doble de
capacidad sino también posee un FSB 3 veces mayor, tres niveles de cache
en vez de dos y 8 veces el tamaño de la cache.
Figura 3.5: Comparación del throughput entre los clusters Meteoro, Mercurio y
Speedy. Referencias: (F)ast, (E)thernet, (B)onding, M(PICH), (G)igabit.
3.2.
Performance de Sistemas de Archivos
Se quiere probar la performance de los distintos tipos de sistemas de
archivos configurados en el cluster Speedy Gonzalez. El análisis de los mismos servirá para que los usuarios puedan mejorar la performance de sus
procesos utilizando eficientemente las funciones de E/S disponibles. Se utilizarán los benchmarks: Bonnie [39], Babieca [40], perf y coll perf [36] para
evaluar distintos aspectos, ver Apéndice B.2.
En las pruebas básicamente se compara la velocidad de acceso (MBps)
a los distintos sistemas de archivos local de Unix ext3, NFS (versión 3) y
PVFS (versión 1.6.2). Los sistemas Mosix y GFS no se implementaron en
35
el cluster Speedy González, el primero debido a que para implementarlo se
debe recompilar el kernel para que éste aplique balance de carga en forma
automática y transparente para el usuario y ese no era el objetivo de nuestro
trabajo, el segundo por ser un tipo de sistema de archivo implementado en
mainframes.
Para poder utilizar ROMIO sobre NFS, la función fcntl debe funcionar
correctamente sobre NFS. En algunas instalaciones, dicha función no funciona. Para asegurase que no exista este problema, se debe utilizar la versión
3 de NFS y montar el sistema de archivos con la opción noac (no attribute
caching). La misma quita la opción de ’caching’ del NFS lo cual puede reducir la performance, pero es necesario para un comportamiento adecuado
[37]. Todas las pruebas de acceso a archivos se realizaron con el switch de
gigabit ethernet y con la configuración TCP actualizada según el Cuadro C.1.
3.2.1.
Benchmark Bonnie
El benchmark Bonnie, descripto en el Apéndice B.2.2, se utiliza para
medir la performance de operaciones de acceso a los sistema de archivos Unix.
Fue diseñado para hallar cuellos de botella en los servidores de aplicaciones.
Aquı́ se ejecutó en todas las máquinas del cluster, para cada tipo de fichero
disponible y con distintos tamaños de archivo en MB: 32, 64, 128, 256, 512
y 1024. Sin embargo, de todos los resultados obtenidos, se seleccionó como
tamaño de archivo 1 GB para el mejor caso correspondiente a speedy12,
Athlon 1200 MHz con 512 MB de RAM. El resto de las máquinas en los
distintos tamaños de archivo se comportaba igual que ésta para cada tipo
de fichero, pero su performance se mantenı́a o disminuı́a en proporción a los
Hzs del CPU.
Cuadro 3.1: Throughput de accesos al sistema de archivos. Las búsquedas aleatorias están dadas en cantidad de búsquedas por segundo. Benchmark Bonnie.
En la Figura 3.6 se pueden observar los resultados obtenidos en un gráfico
de barras. En todos los casos, la mejora alcanzada por PVFS se debe a la
metodologı́a que utiliza para realizar el acceso a los datos explicada en la
Figura 2.5. El archivo será distribuido en la partición PVFS como se muestra
en la Figura 2.7 con base aleatoria entre 1 y 15, pcount=15 y ssize=64 KB.
Las escrituras y lecturas a caracter realizadas en el fichero NFS con
bloques de 4 KB son 1,9 % y 3,3 % respectivamente más veloces que las
realizadas con bloques de 8 KB. Sin embargo, para la re-escritura, escritura
y lectura por bloques, esta relación se invierte. En el caso de la escritura
a caracter, Bonnie escribe el archivo invocando 1024 millones de veces a
36
la macro putc(). En NFS con bloques de 4 KB alcanza una velocidad de
5799 KBps, con lo cual, se escribirá el primer bloque NFS aproximadamente a
los 0,71 segundos después de realizada la primer llamada a la macro. Además,
mientras se realiza la escritura a través de NFS, paralelamente el benchmark
sigue escribiendo caracteres en cache. En cambio, cuando el bloque NFS
está configurado en 8 KB, la función putc() se invoca a una velocidad menor
de 5686 KBps realizando la primer escritura del primer bloque 1,44 segundos
después de realizada la primer llamada a la macro. Esta diferencia de tiempos
sumado al paralelismo entre operaciones NFS y el loop del benchmark Bonnie
para realizar las escrituras en cache, es la que hace la diferencia final. En el
caso de PVFS, por cada loop en cache se escribirá un bloque de 64 KB
en el nodo de E/S que corresponda siguiendo la estructura definida. Al ser
distintos nodos los que se encargan de la escritura se logra una mejora del
35 % sobre NFS. Se debe resaltar que las operaciones por caracter consumen
mucho trabajo de CPU lo cual no es bueno, ver Cuadro 3.1. Esto puede
ocurrir debido a que el procesador es lento o bien por una implementación
ineficiente de la interface stdio. Para la lectura a caracter el análisis es
análogo al anterior.
Con respecto a las escrituras por bloques, se debe recordar que el
benchmark Bonnie las realiza en bloques de 16 KB, con lo cual para escribir
un archivo de 1024 KB escribirá 64 bloques. A nivel de NFS, para la configuración de 4 KB se transmitirán 256 bloques al servidor y para la de 8 KB
128 bloques. Como el protocolo no envı́a el siguiente bloque si no recibió el
ACK del anterior, es más eficiente enviar menor cantidad de bloques de mayor tamaño. Por otro lado, PVFS es un 55 % mejor que NFS, esto se debe a
que realiza las escrituras en bloques de 64 KB rotando cı́clicamente entre
los 15 servidores de E/S que tiene configurados la partición, escribirá dos
bloques de 16 KB por servidor. El fichero local es sólo un 12 % mejor que
PVFS.
En las operaciones de re-escritura y lectura por bloque PVFS alcanzó el máximo throughput, incluso supera al fichero local. En el caso de
Figura 3.6: Throughput de accesos al sistema de archivos. Benchmark Bonnie.
37
re-escritura el benchmark lee, modifica y re-escribe bloques de 16 KB, tareas que serán llevadas a cabo por el nodo de E/S que contenga el bloque.
Ocurre lo mismo para las lecturas. La menor carga de CPU, ver Cuadro 3.1,
corresponde a PVFS pues el servidor solamente busca el archivo en su metadata, pero los que realmente leen son los nodos de E/S, cada uno el sector
de archivo que contiene.
Para la prueba de búsquedas aleatorias, como se observa en la Figura 3.7, sin duda el mejor caso es PVFS. Realiza una cantidad de búsquedas
72 % mayor a los otros tres casos. Esto se debe a que la partición PVFS
está compuesta por una porción de disco de cada nodo, y aquı́ también como
vimos en la Figura 2.5, una vez que se localiza la distribución del archivo en
cuestión, es cada demonio de E/S quien se encarga de realizar la búsqueda
en su sector del archivo. Al ser éstas porciones más pequeñas que el archivo
completo, el resultado final es óptimo.
Figura 3.7: Cantidad de búsquedas por segundo. Benchmark Bonnie.
En base a éstas pruebas y a no haber observado grandes diferencias con
respecto a NFS con bloques de 4 KB y de 8 KB se siguieron las recomendaciones del documento NFS Linux Howto [9] para optimizar la configuración
de NFS, dejándolo configurado en el cluster Speedy con bloques de 8 KB.
3.2.2.
Benchmark Babieca
Se creo el benchmark llamado Babieca [40], descripto en el Apéndice B.2.1,
para tomar los tiempos de acceso de los distintos comandos UNIX. Se miden
los tiempos en los siguientes casos:
lectura local (ext3)
lectura remota (NFS/PVFS)
lectura local escritura local
lectura local escritura remota
lectura remota escritura local
lectura y escritura remotas
Se utilizó como archivo base el .tar.gz de los fuentes del kernel linux-2.4.26,
comprimido tiene un tamaño de 36,7 MB, descomprimido 164 MB y desagrupado 191,5 MB. Se seleccionaron para realizar las pruebas los nodos speedy12
38
y 13, Athlon 1200 MHz, ver Cuadro A.1. Para analizar los gráficos se debe
tener en cuenta la influencia del tamaño de bloque de cada comando y del
fichero en cuestión, 8 KB para NFS y para PVFS bloques de 64 KB por
nodo repartidos en round-robin entre los 15 servidores de E/S. El archivo
será distribuido en la partición PVFS como se muestra en la Figura 2.7, con
base aleatoria entre 1 y 15, pcount=15 y ssize=64 KB.
En la Figura 3.8, se muestra el tiempo de ejecución de los comandos de
lectura rm -f, du -sk, ls -R, grep -r y find -name. Se ve claramente que en
casi todos los casos, salvo rm, PVFS es el que tarda más tiempo en llevar a
cabo las distintas tareas. Esto se debe a que para que sea transparente el uso
de aplicaciones UNIX sobre un fichero de este tipo, se deben mover muchos
datos entre el demonio pvfsd y el kernel como se explicó en el Capı́tulo 2.4.3,
Figura 2.6. El primer comando es muy rápido en los tres casos pues consiste
solamente en borrar la entrada correspondiente a dicho archivo en la tabla
de i-nodos para archivo el local, en la tabla VFS para NFS y en el metadata
server para PVFS. Los comandos du -sk y ls -R acceden solamente a los
meta-data, lo que implica que se pasen pocos datos entre el servidor y el
cliente, sin embargo PVFS da un tiempo muy grande. El comando grep -r
utiliza bloques de 32 KB y lee los archivos uno a uno buscando lo que se le pida. PVFS guarda los archivos repartidos en bloques de 64 KB entre todos los
servidores de E/S. Luego, si el total de los fuentes del kernel pesa 196096 KB
y el comando accede de a 32 KB tendrá que hacer aproximadamente 6128
conexiones a través del kernel y el demonio pvfsd para leer todos los archivo
siendo un 99,5 % peor que el caso del local. El find -name es relativamente
mejor, porque sólo busca en la lista de nombres de los archivos de la estructura. Aparentemente es comparable con el du -sk que recorrerá todos los
archivos para calcular el espacio que ocupan.
Figura 3.8: Performance de sistemas de archivos ext3, NFS, PVFS. Comandos de
lectura Unix. Benchmark Babieca.
39
La Figura 3.9 muestra los resultados obtenidos en la ejecución de comandos de lectura/escritura en las distintas combinaciones posibles según la
ubicación de los archivos. El comando cp copia el archivo del kernel comprimido, utiliza bloques de 4 KB. El caso más ineficiente es la copia desde el
fichero PVFS al local debido a que tiene que realizar 9395 conexiones a través
del kernel y el demonio pvfsd para leer los 36,7 MB del kernel comprimido.
El mejor caso para PVFS es cuando se realiza una copia en su misma partición, esto se debe a que en realidad no sigue el procedimiento habitual de
copiado sino que replica el archivo en su servidor metadata y en cada uno de
los servidores de E/S en forma paralela.
El comando gunzip implica más escrituras que lecturas en bloques de
32 KB (4,47 escrituras cada 1 lectura). Leerá 36,7 MB y escribirá 164 MB.
Otra vez se puede observar que PVFS tarda prácticamente lo mismo que en
la operación de cp desde el fichero PVFS al local. PVFS es un 30 % más
lento que NFS. El comando gzip implica más lecturas que escrituras (4,47
a 1) en bloques de 32 KB. Es interesante notar que el comando gunzip tiene
mejor performance que le gzip, esto se debe a que el comando gzip realiza
más cálculos y luego escribe su salida más lento.
Figura 3.9: Performance de sistemas de archivos ext3, NFS, PVFS. Comandos de
lectura/escritura Unix. Benchmark Babieca.
El comando tar -xf desagrupa el archivo linux-2.4.26.tar de 167936 KB,
este comando escribe un 16 % más de lo que lee. Por defecto lee y escribe de
a bloques de 10 KB. Al leer de la partición PVFS, más allá de donde vaya a
escribir, tendrá que hacer 16793 accesos a través del kernel y el demonio pvfsd.
Comparando con el comando grep -r que sólo lee los archivos, se puede inferir
que de los 900 segundos que utiliza para resolver el comando completo, 753
corresponden solamente a lecturas y el resto a escrituras. Como lee y escribe
paralelamente, se completa en un total de 900 segundos.
Un caso interesante es el comando tar ch -b X que permite definir el
tamaño del bloque de escritura, X × 512 bytes, aquı́ se ejecutó para 8, 16,
40
32 y 64 KB. Este comando realiza más lecturas que escritura, la tasa de
lectura/escritura es de 1.7. El mejor caso es cuando el origen y el destino se
encuentran en un fichero local sin importar el tamaño del bloque de escritura.
Le sigue el caso en que el origen es local y el destino es un fichero NFS.
Para bloques de 8 KB tarda 23 seg, mientras que para los otros 3 casos
(16, 32 y 64 KB) tarda 19 seg. NFS escribe de a bloques de 8 KB no se
nota prácticamente diferencias con los distintos tamaños. Sin embargo, PVFS
muestra una leve mejora al ir aumentando el tamaño del bloque de escritura,
pero su performance dista mucho de NFS y del fichero local.
Las deficiencias en tiempo obtenidas al ejecutar comandos del sistema sobre el fichero PVFS no desalientan su uso. Sirven para verificar que realmente
es transparente el acceso a los datos de dichas particiones. En la siguiente
sección probaremos si realmente cumple las caracterı́sticas de eficiencia para
aplicaciones paralelas.
3.2.3.
MPI I/O: perf y coll perf de ROMIO
Se utilizaron los programas perf y coll perf, descriptos en el Apéndice
2.6.2, para evaluar la performance de algunas de las operaciones de lectura
y escritura de archivos provistas por MPI-IO (ROMIO). Las pruebas se realizaron sobre el cluster Speedy ejecutando corridas paralelas con 1, 2, 4, 8,
12 y 14 procesadores, en el caso de coll perf se excluye la ejecución con un
único procesador debido a que evalúa funciones colectivas. Dichas pruebas
fueron realizadas sobre los sistemas de archivos NFS y PVFS.
El programa perf, como se explica en el Apéndice B.2.3 mide el throughput alcanzado en operaciones de escritura MPI File write() y lectura
MPI File read() con y sin sincronización de escritura MPI File sync() previa a la lectura. Se ejecutó para distintos tamaños de acceso por nodo: 4, 8,
32 y 64 MB. La Figura 3.10 muestra la distribución fı́sica del archivo en la
partición PVFS para la ejecución con 4 procesos y 4 MB por nodo, para los
otros tamaños es análoga.
Figura 3.10: Distribución fı́sica del archivo generado por perf para la ejecución
con 4 nodos de tamaño 4 MB por nodo, en la partición PVFS (base=1, pcount=15
y ssize=64 KB). Programa perf de ROMIO.
41
Al comparar en la Figura 3.11 el comportamiento de las lecturas y escrituras entre NFS y PVFS para 4 MB de acceso por nodo se observa que
PVFS presenta mayor throughput que NFS en todos los casos. En la operación de escritura con sincronización para PVFS, Figura 3.11(B), se
observa un decrecimiento del 50 % en el throughput con respecto al caso sin sincronización. Esto se debe al tiempo que requiere la función
MPI File sync() para realizar efectivamente las escrituras al fichero. Sin
embargo, la lectura luego de dicha sincronización, no muestra una diferencia tan marcada como cuando no se sincroniza. Es interesante observar que
aquı́ PVFS, en general, aumenta su throughput al a incrementar la cantidad
de nodos por corrida.
Figura
3.11:
Throughput de escrituras/lecturas. (A) sin la
MPI File sync(), (B) con dicha función. Programa perf de ROMIO.
42
función
En el caso de NFS, no presenta prácticamente diferencias en las escrituras
y lecturas con o sin sincronización. Esto se debe a que el protocolo NFS
posee su propia forma de escribir/leer a disco y lo hace de a bloques de 8 KB
independientemente de la cantidad de nodos en la corrida o de si se invoca o
no a una función de sincronización.
Figura 3.12: Throughput de (A) escrituras y (B) lecturas SIN la función
MPI File sync(). Programa perf de ROMIO.
En la Figura 3.12 se muestran las escrituras/lecturas sin sincronización
para tamaños de bloque por nodo de 4, 8, 32 y 64 MB. En el caso de PVFS
y escritura para 8 MB se observa un comportamiento interesante, alcanza
un pico en el throughput con 8 nodos de cómputo (124 MBps). Teniendo en
43
cuenta que hay 15 servidores de E/S en la partición PVFS se deduce que al
haber más de 8 nodos de cómputo se satura la capacidad de escritura de los
15 servidores para ese tamaño. Sin embargo para bloques de 4 y 64 MB por
nodo, tener 8 nodos de cómputo no es una buena opción. Con respecto a las
operaciones de lectura se mantienen dentro de un rango de 75 y 100 MBps
para 4, 8, 12 y 14 procesos de cómputo.
NFS en general no presenta buena performance. Acentuándose la ineficiencia en las escrituras y lecturas de bloques de 32 y 64 MB por nodo.
Evidentemente el servidor NFS no puede llevar a cabo eficientemente las lecturas concurrentes de 8, 12 y 14 nodos de cómputo para dichos tamaños.
Para 4 y 8 MB la performance es pareja pero considerablemente más pobre
que el throughput alcanzado por PVFS.
Figura 3.13: Throughput de (A) escrituras y (B) lecturas CON la función
MPI File sync(). Programa perf de ROMIO.
44
En la Figura 3.13 se muestran las escrituras/lecturas con sincronización
para tamaños de bloque por nodo de 4, 8, 32 y 64 MB. En general, para las
escrituras se degrada la performance aproximadamente 1/3 del throughput.
Sin embargo, en el caso de PVFS las lecturas mantienen su throughput y en
algunos casos lo superan.
El programa coll perf se ejecutó para un vector 3D de dimensión 2563 .
coll perf evalúa el throughput de las operaciones de lectura y escritura colectivas MPI File read all() y MPI File write all(). PVFS nuevamente presenta resultados más satisfactorios que NFS. Como se observa en la Figura 3.14 PVFS logró una mejora del throughput de 63,5 % sobre NFS para las
operaciones de escritura colectiva y una mejora de 43 % para las lecturas. Si
se analizan los ficheros en forma independiente, NFS muestra constantemente
mayor performance para las operaciones de lectura mientras que en el caso
de PVFS esta relación varı́a al utilizar distinta cantidad de procesadores.
Figura 3.14: Throughput de Funciones Colectivas de lectura/escritura. Programa
coll perf de ROMIO para cubos de 2563 .
En base a los resultados obtenidos de la ejecución de perf y coll perf
se puede concluir que utilizar la partición PVFS para el almacenamiento de
datos en corridas paralelas puede incrementar el throughput total del programa. Además, PVFS es útil para aprovechar los recursos de disco distribuidos
en los nodos del cluster y efectivamente es transparente para el usuario. Con
sólo utilizar las funciones de acceso a archivos provistas por MPI I/O, el
programa hace uso de los beneficios de PVFS, y ese mismo programa corre
sobre distintos tipos de fichero sin necesidad de modificar el código.
45
3.3.
Throughput de Procesos
En esta sección se analizará el throughput de procesos del cluster Speedy,
esto es la cantidad de procesos por unidad de tiempo que es capaz de resolver.
Además se evaluarán los tipos de procesos que se ejecutan en el cluster para
recomendar una mejora para el sistema que controla los procesos ’batch’.
Eventualmente, se presentará un esquema a seguir en el momento de decidir
actualizar el hardware de Speedy.
La configuración del PBS y MAUI definida es básica, una única cola FIFO
(First In First Out), sin lı́mites en tiempo de uso de procesador, cantidad de
nodos y cantidad de memoria. En un principio fue suficiente para la cantidad
y tipo de usuarios del cluster. A medida que se incrementó el número de
alumnos y docentes, comenzaron a desarrollar problemas más complejos en
forma paralela haciendo uso exhaustivo del cluster. Sobre una muestra de
2054 trabajos ejecutados en el cluster, se pudieron diferenciar los siguientes
grupos de procesos (Figura 3.15):
cortos, menores de 15 minutos
medios, hasta dos horas
largos, entre dos y doce horas
muy largos, más de doce horas
con intenso uso de pasaje de mensajes (por ejemplo, resolución de ecuaciones de derivadas parciales por diferencias o elementos finitos)
con uso intensivo de procesador (por ejemplo, método Monte Carlo)
Figura 3.15: Porcentaje de cantidad de trabajos por tiempo de duración.
En base a los casos diferenciados se detectaron dos problemas recurrentes:
Trabajos encolados con recursos disponibles. Debido a que sólo se ha
definido una cola de trabajo FIFO ocurre que si dados tres usuarios
que solicitan los nodos n1..n4 en el siguiente orden:
usuario1
usuario2
usuario3
n1 n2
n2
n3
n3
n4
A pesar que el trabajo del tercer usuario podrı́a comenzar mientras
se ejecuta el trabajo del primero, no lo hace debido a que el segundo
46
usuario ya tiene reservado el recurso n3. Este problema se soluciona
habilitando la polı́tica backfill de MAUI, la cual permite que el tercer
usuario comience su ejecución siempre y cuando los usuarios especifiquen entre los requerimientos del trabajo el tiempo estimado de uso
de CPU. En el caso en que haya tiempo suficiente para ejecutar el trabajo del usuario3 mientras que el 1 finaliza, se habilitará su ejecución
antes que el proceso 2. Obteniendo como resultado la resolución de
los tres trabajos en menor cantidad de tiempo. Vale resaltar que este
beneficio podrá ser utilizado si y solo si los usuarios puedan estimar el
tiempo de sus corridas.
Trabajos largos que disminuyen el throughput total de procesos. Si
un trabajo largo (duración más de 12 horas) toma los 15 nodos ningún
otro trabajo puede comenzar hasta que el mismo termine. Para solucionar esto se debe configurar algún sistema de checkpointing. Básicamente se puede implementar dentro del código del programa, guardando a intervalos regulares el estado del trabajo teniendo ası́ la posibilidad de interrumpir la corrida del mismo por cierto intervalo de tiempo
para luego continuar desde el punto de ejecución alcanzado. O bien, a
nivel del kernel, es el sistema el que se encarga de guardar el estado de los procesos, re-encolarlo quitándolo del estado de ejecución
para dar curso a otro trabajo encolado. El checkpointing, incrementa
la tolerancia a fallas del sistema global. Este tema es muy amplio y
existen diversas formas para llevarlo a cabo que no serán cubiertas en
este trabajo.
Figura 3.16: Corridas homogéneas vs. heterogéneas.
De la Figura 3.16, se pueden analizar las procesos ejecutados en el cluster
con respecto a la cantidad de nodos involucrados y al tipo de nodos seleccionados por el usuario. Las corridas de un nodo, en general, corresponden
47
a la evaluación de un programa serial que posteriormente será paralelizado, el
usuario querrá conocer la mejora alcanzada al paralelizar su problema. Luego,
se puede observar que en un 55 % de los casos el usuario prefiere llevar a cabo
sus corridas en un conjunto de nodos homogéneo, igual hardware. Esto
se debe a que pueden evaluar sus resultados sin tener que concentrarse en
un balance de carga óptimo, repartiendo el mayor cálculo en los nodos más
potentes para lograr que los más débiles no degraden la performance global.
El cluster posee como máximo 5 nodos de igual hardware. Otro caso de uso
común son las corridas con 3 procesadores, esto se debe a que un usuario
que se inicia en la programación paralela en general comienza con programas
de una dimensión. Los casos a cubrir son el pasaje de mensajes entre los
vecinos y el caso particular de los nodos de los extremos derecho e izquierdo.
Como última observación, se encuentran picos en las corridas que utilizan
2n número de procesadores, esto se debe a que para problemas cuyo dominio de datos es un cubo la forma óptima de paralelizarlo es en potencias
de dos [25].
Esta distribución particular de tipos de procesos que se corren en Speedy
está relacionada con el hardware del cluster. Se debe tener en cuenta que
Speedy se armó en tres etapas. Debido a esto y a la pronta evolución del hardware posee tres grupos de procesadores según su capacidad de procesamiento.
Además, no todos los nodos poseen la misma cantidad de memoria RAM.
Éstas caracterı́sticas obligan que los usuarios optimicen sus implementaciones
teniendo presente el hardware y utilicen las herramientas disponibles. Idealmente los programas deben poseer un balance de carga dinámico. Esto hace
que el código sea un tanto más complejo pero a la vez se generarán programas que alcanzarán un rendimiento óptimo en cualquier cluster en el que
se ejecuten. En base al análisis anterior se puede definir una polı́tica adecuada al momento de actualizar el hardware de Speedy y para optimizar su
configuración. Por ejemplo:
Que todos los nodos posean una cantidad de memoria RAM proporcional a la velocidad del CPU, ya que como se mencionó, una forma de
hacer balance dinámico es distribuir el dominio del problema según la
velocidad del CPU.
Si se desea incrementar la cantidad de nodos hasta ocupar todas las
bocas del switch, hacerlo en pasos de modo tal que siempre se pueda
particionar el conjunto de nodos en potencias de dos. Por ejemplo,
serı́a bueno agregar por lo menos un nodo, para tener 16 (24 ) nodos
de ejecución en vez de 15 y ası́ poder particionar un cubo en mayor
cantidad de procesos, actualmente la mejor distribución para un cubo
es 23 . Además, en caso de tener 16 nodos se podrı́an tener dos corridas
activas con dicha cantidad de nodos o una con una matriz del doble de
tamaño.
Por último, se recomienda definir más colas de procesos. Por ejemplo:
una cola que agrupe los nodos más lentos para uso exclusivo de principiantes que corren trabajos cortos con poca cantidad de procesadores,
otra cola con mayor prioridad para los grupos de investigación, etc.
48
Capı́tulo 4
Conclusiones y lı́neas futuras
4.1.
Conclusiones
Se realizaron experiencias de benchmarking para el estudio de la performance y escalabilidad del sistema y se han establecido recomendaciones y
especificaciones acerca de la instalación, configuración y operación de estos
equipos, con énfasis en el hardware de los nodos y la tecnologı́a de red utilizada. Este trabajo constituye un primer esfuerzo hacia el desarrollo de un
entorno de aprendizaje de gerenciamiento de sistemas paralelos y del uso del
software paralelo.
Como se ha podido comprobar en el transcurso del trabajo, no es trivial alcanzar niveles de performance óptimos en un cluster Beowulf dedicado
a resolver problemas de alta complejidad. Los rápidos avances tecnológicos
hacen que tampoco sea trivial incrementar gradualmente la capacidad de los
componentes de hardware existentes logrando una armonı́a entre el hardware
del nodo y el de comunicación.
No es directo obtener mayor rendimiento con Gigabit Ethernet que frente
a Fast Ethernet. Como se desprende de los experimentos de red realizados
en el Capı́tulo 3.1, se demuestra que para obtener un mayor rendimiento en
gigabit ethernet es necesario tener en cuenta la arquitectura del nodo antes
de migrar de la tecnologı́a Fast Ethernet. El máximo throughput alcanzable
depende fuertemente del bus PCI del nodo como ası́ también la velocidad
del procesador y sus técnicas de ’caching’. También depende de la capacidad
que posean las placas de red para aliviar al resto de los componentes con
sus caracterı́sticas de poder acceder directo a memoria, realizar ’checksums’
de paquetes y poseer su propia cache para el manejo de los sockets TCP
siendo necesario un bus PCI dedicado que le garantice la tasa de transferencia
adecuada. Esto se observó al comparar en la Figura 3.5 al cluster Speedy con
tecnologı́as más modernas.
No solo depende del hardware la performance del sistema sino también del
’tuning’ de parámetros del protocolo de red TCP/IP. De las Figuras 3.1 y 3.4
se desprendió la necesidad de actualizar los parámetros de la configuración
por defecto de los sockets TCP utilizando 64 KB para la ventana de envı́o de
mensajes, 85 KB para la de recepción y dando la posibilidad al usuario de
poder configurar tamaños de buffers de hasta 4 MB para ası́ poder alcanzar
350 Mbps trabajando con paquetes de más de 128 KB. A partir de dichas
49
figuras, también se decidió aumentar el tamaño del buffer de MPICH configurando la variable P4 SOCKBUFSIZE igual a 128 KB para todos los usuarios
del sistema. Por otro lado, a nivel IP, es útil tener en cuenta que agrandar
el MTU permite mejorar el throughput alcanzando un máximo de 400 Mbps
aunque aún no sea posible implementarlo debido a las caracterı́sticas del
switch Gigabit utilizado.
Se debe tener en cuenta que todas las pruebas realizadas con NetPIPE
dan una cota máxima del throughput de Speedy. Y que con el hardware actual
es prácticamente imposible llegar a lograr el 50 % de la capacidad Gigabit.
Con respecto a los sistemas de archivos disponibles en Speedy, se ha podido
comprobar que tener configurados estos tres tipos de ficheros: local (ext3),
NFS y PVFS, en el cluster brinda un abanico de posibilidades al momento
de implementar una solución a un problema dado.
A grandes rasgos, PVFS tiene la ventaja de poder utilizar los recursos
de disco distribuidos entre los nodos del cluster en un espacio de nombres
consistente y en forma transparente para el usuario. Como ası́ también, se
desprende de la Figura 3.6, que PVFS es una buena opción para obtener
mejores tiempos de ejecución en corridas que realicen lecturas y escrituras
por bloques y a caracter. De las Figuras 3.11, 3.13 y 3.14, se desprende que
PVFS es bueno para el uso de funciones colectivas y no colectivas de MPI
I/O.
Por otro lado, PVFS posee la desventaja que si uno de los servidores de
E/S se cae, toda la partición PVFS queda deshabilitada. Y el servidor de
metadata es un único punto de falla pues contiene la información de toda la
partición. Tiene baja tolerancia a fallas. Por esto, se recomienda el uso de
dicha partición sólo para almacenamiento de datos transitorios. Otra observación, es que PVFS se ve limitado por el protocolo TCP pues es utilizado
en todas sus comunicaciones. Luego, como se vio en la Figura 3.1(A), el
throughput se encuentra limitado en un máximo de 350 Mbps. El grupo de
investigación del proyecto PVFS de la Universidad de Clemson [18] está investigando otros métodos de comunicación para este tipo de fichero.
El benchmark Babieca, demostró que las particiones PVFS pueden ser
accedidas mediante los comandos UNIX con la desventaja de sufrir un incremento en el tiempo de ejecución de los mismos. Pero cualquier usuario
puede acceder a este tipo de ficheros en forma transparente. También se pudo comprobar con el comando tar que efectivamente el tamaño del buffer es
importante para incrementar el tiempo de acceso a los archivos de un fichero
PVFS. Esta última observación, se debe tener en cuenta prácticamente en
todos los usos de la partición PVFS, tanto para programación mediante las
funciones de E/S de MPICH como ası́ también cuando se utiliza la API
(Application Programming Interface) propia de PVFS.
NFS no es adecuado para procesamiento paralelo pues no tiene consistencia en cache. Por último, las particiones ext3 locales en cada uno de los
nodos son buenas para corridas seriales en nodos internos del cluster pues
ası́ se evita el uso de la red innecesariamente.
Con respecto al uso del cluster se observó que por lo general los usuarios
ejecutan procesos cortos y seleccionan un grupo homogéneo de nodos. Puede
ocurrir que se encole algún proceso de más de 12 horas y este podrı́a disminuir
50
el throughput total de procesos. Por esto se recomienda implementar algún
método de ’checkpointing’ y definir nuevas colas de procesos para distribuir
en forma óptima el uso de los nodos.
4.2.
Lı́neas Futuras
Con respecto a la relación entre la arquitectura del nodo y el hardware de
comunicación, serı́a bueno la evaluación de benchmarks que permitan medir
el throughput de cada una de las secciones del camino que debe seguir un
dato para llegar a destino. Como ası́ también, analizar en profundidad el
overhead del protocolo TCP/IP y de las funciones de pasaje de mensajes.
Con respecto a los sistemas de archivos, serı́a interesante ahondar en el
tema de acceso a archivos en forma paralela utilizando las funciones de MPI
I/O y ası́ poder optimizar el uso del área de datos global y lograr mayor
performance en los programas con un alto grado de accesos de E/S.
Finalmente, con respecto a la configuración del scheduling de procesos
se podrı́an implementar nuevas colas, habilitar el checkpointing y educar a
los usuarios para que especifiquen lo más detalladamente posible los recursos
requeridos por sus procesos para obtener ası́ mayor throughput global.
51
Apéndice A
Clusters Utilizados
A.1.
Cluster Speedy González
A.1.1.
Hardware
El cluster Speedy pertenece al Laboratorio de Sistemas Complejos del
Departamento de Computación de la Universidad de Buenos Aires. Consta de
16 nodos, cuyo hardware se detalla en el Cuadro A.1. Inicialmente cada nodo
poseı́a una placa de red Fast Ethernet (3Com, 3c905cx PCI) y se conectaban
entre si mediante un switch Fast Ethernet, 100 Mbps (3Com, Office Connect,
dual speed switch, 16 bocas). Luego se migró a un switch Gigabit Ethernet,
1000 Mbps (TRENDnet, TEG-S240TX, 24 bocas) con una placa Gigabit
Ethernet (3Com, 3c2000 PCI, ver detalles Cuadro A.3) por nodo. Todas las
máquinas poseen motherboards PCchip M810, FSB de 200/266 Mhz y bus
PCI 2.2 de 32-bit/66Mhz (264 MBps) además poseen 256 KB de memoria
cache de nivel 2.
El nodo speedy1 se denomina master, cumple la función de consola de
administración y no participa de los cálculos paralelos. Maneja la cola de
procesos, atiende las conexiones externas de los usuarios y posee herramientas de monitoreo del sistema. Los otros 15 nodos son exclusivamente para
cálculo. Todos los nodos poseen floppies como dispositivos de entrada/salida
y discos IDE, ver Cuadro A.2, que contienen una partición para el sistema
operativo, una para datos locales y otra para almacenamiento de datos en
forma paralela [16].
Sólo el nodo master se conecta con el exterior, posee dos placas de red,
una conectada a la red de alumnos del departamento (Fast Ethernet), la otra
hacia el switch interno (Gigabit Ethernet). Posee instalado un firewall que
filtra los paquetes que provienen desde el exterior hacia el interior de cluster.
La Figura A.1 muestra la topologı́a de Speedy.
A.1.2.
Software
Cada uno de los nodos del cluster Speedy posee instalado el sistema operativo Linux Mandrake 9.2 [19], kernel 2.4.22-21mdk [20]. La instalación y
administración del cluster se realiza con el paquete OSCAR 3.0 [3]. Este
paquete contiene las aplicaciones necesarias para instalar, configurar, administrar y utilizar clusters Beowulf. Está compuesto por un conjunto de
52
Hostname
CPU
speedy1
Pentium III
speedy2
Pentium III
speedy3
Pentium III
speedy4
Pentium III
speedy5
AMD Athlon
speedy6 AMD Athlon XP 2000
speedy7
AMD Athlon
speedy8
AMD Athlon
speedy9
AMD Athlon
speedy10
AMD Athlon
speedy11
AMD Athlon
speedy12
AMD Athlon
speedy13
AMD Athlon
speedy14
AMD Athlon
speedy15
AMD Athlon
speedy16
AMD Athlon
Mhz
Disco
RAM (MB)
733 ST3120022A
384
733
ST320423A
192
733
ST320423A
192
733
ST320423A
192
946
SV2042H
192
1666 ST320410A
256
946
SV2042H
192
946
SV2042H
192
946 FIREBALLlct20
192
946 FIREBALLlct20
192
1200 ST320410A
512
1200 ST320423A
512
1200 ST320410A
512
900
ST320410A
192
1200 ST320410A
512
900
ST320410A
192
Cuadro A.1: Caracterı́sticas del hardware de Speedy.
Marca
Modelo
Capacidad Velocidad Seek time
Segate
ST3120022A
120 Gb 7200 RPM 8.9 ms
Segate
ST320423A
20.49 Gb 5400 RPM 8.9 ms
Segate
ST320410A
20 Gb 5400 RPM 8.9 ms
Samsung
SV2042H
20.4 Gb 5400 RPM 9 ms
Quantum FIREBALLlct20 20 Gb 5400 RPM 9 ms
Interface
Ultra ATA/66
Ultra ATA/66
Ultra ATA/100
Ultra ATA/100
Ultra ATA/100
Cuadro A.2: Caracterı́sticas de los discos de Speedy.
Función
Especificaciones
Reloj PCI
Máximo 66 Mhz
Datos/Dirección PCI
32 bit
Índice de transferencia de
132 Mbps 32-bit/33 Mhz
descargas de datos PCI
264 Mbps 32-bit/66 Mhz
Modos PCI
Maestro/esclavo
10/100/1000BASE-T 10/100/1000 Mbps (full-duplex)
Cuadro A.3: Caracterı́sticas de las placas de red 3c2000 [43].
53
Figura A.1: Topologı́a del Cluster Speedy.
aplicaciones de código abierto.
SIS - System Installation Suite [4] Permite instalar clusters Linux a través
de una red. Se basa en la creación de una o más imágenes a partir de
las cuales serán instalados los nodos.
PBS - Portable Batch System [10] Controla la cola de procesos y los
recursos del sistema.
MAUI [11] Permite definir polı́ticas de asignación de recursos, qué proceso
corre, dónde y cuándo.
C3 - Cluster Command Control Permite llevar a cabo las siguientes acciones en los nodos definidos en su configuración:
ejecutar comandos del sistema en forma distribuida
distribuir y buscar archivos
eliminar procesos activos
reiniciar y apagar el cluster en forma remota
generar imágenes para actualizar el cluster
OPIUM - OSCAR Password Installer and User Management Para
sincronizar los usuarios del cluster y configurar el ssh de los mismos.
Pfilter - Packet Filtering Permite configurar las reglas del firewall (iptables) en forma más sensilla.
Switcher Permite que los usuarios modifiquen las variables de su entorno
sin tener que editar sus archivos de configuración evitando ası́ que perjudiquen al sistema.
HDF5 - Hierarchical Data Format [5] Especificación de formatos de datos
y bibliotecas para programación paralela.
54
Programación Bibliotecas que permiten que un conjunto de máquinas heterogéneo (Windows/Unix) colaboren entre si a través de una red para
ser usadas como una única máquina paralela. De este modo se pueden
resolver problemas costosos en menor tiempo. La herramientas que se
pueden instalar con Oscar son:
MPI
LAM MPI
PVM
Por otro lado, se instaló el PVFS [16] versión 1.6.2 para manejo de ficheros
distribuidos. También se instalaron herramientas de compilación como ser:
Fortran 77 (gcc-g77-3.3.1)
C (gcc-3.3.1)
C++ (gcc-c++-3.3.1)
A.2.
Cluster Meteoro
A.2.1.
Hardware
El cluster Meteoro pertenece al Grupo de Modelado de Mesoescala, Dpto. de Ciencias de la Atmósfera y los Océanos, Facultad de Ciencias Exactas y Naturales. Consta de 8 nodos iguales, cuyo hardware se detalla en
el Cuadro A.4. Cada nodo posee dos placas de red Fast Ethernet (3Com,
3c905cx PCI) configuradas en bonding y se conectan entre si mediante un
switch Fast Ethernet, 100 Mbps (3Com, Office Connect, dual speed switch,
16 bocas).
El nodo master participa de los cálculos paralelos y cumple las mismas
funciones que en el cluster anterior. Todos los nodos poseen floppies como
dispositivos de entrada/salida, el master tiene una grabadora de CD. Cada
nodo posee un disco IDE Western Digital de 120 Gb 7200 RPM, que contienen
una partición para el sistema operativo y otra para almacenamiento de datos
en red (NFS).
CPU
GHz FSB
Cache
Pentium 4 2.4 400 Mhz 512 KB
RAM
Motherboard Bus PCI
1.5 GB
Intel
32-bit/66Mhz
DDR 333Mhz D865PERL
PCI 2.2
264 MBps
Cuadro A.4: Caracterı́sticas del hardware de Meteoro.
Sólo el nodo master se conecta con el exterior, posee tres placas de red,
una conectada a la red externa, las otras dos hacia el switch interno. Posee
instalado un firewall que filtra los paquetes que provienen desde el exterior
hacia el interior de cluster. La topologı́a es igual a la de Speedy.
55
A.2.2.
Software
Cada uno de los nodos del cluster Meteoro posee instalado el sistema
operativo Linux RedHat 8 [22], kernel 2.4.22 [20]. Y se instaló utilizando
Oscar 3.0 [3].
A.3.
Cluster Mercurio
A.3.1.
Hardware
El cluster Mercurio consta de 4 nodos Dell PowerEdge 6650, cuyas caracterı́sticas se detalla en el Cuadro A.5. Cada nodo posee una placa de red
Gigabit Ethernet de fibra óptica y se conectan entre si mediante un switch
Gigabit Ethernet Avaya P880, 1000 Mbps.
El nodo master participa de los cálculos paralelos y cumple las mismas
funciones que en el cluster anterior. Todos los nodos poseen CD como dispositivo de entrada/salida y discos SCSI Maxtor, que contienen una partición
para el sistema operativo. Los datos se ubican en un servidor de archivos
Network Appliance 880. La topologı́a es igual a la de Speedy.
CPU
Ghz FSB Cache
Xeon(MP) 2.8 800Mhz 2MB
RAM Motherboard
Bus PCI
4GB
Intel
64-bit/66Mhz
DDR
PCI-X non-bridge
SDRAM
533 MBps
Cuadro A.5: Caracterı́sticas del hardware Cluster Mercurio.
A.3.2.
Software
Cada uno de los nodos del cluster Mercurio posee instalado el sistema
operativo Linux RedHat 7.3 [22], kernel 2.4.26 [20]. Se instaló utilizando
Oscar 2.2.1 [3].
56
Apéndice B
Descripción de Benchmarks
B.1.
Red
B.1.1.
NetPIPE
NetPIPE, Network Protocol Independent Performance Evaluator [31][33] es una herramienta desarrollada para medir la performance tanto a nivel
TCP como MPICH. Se envı́a un mensaje que rebota repetidas veces entre dos
nodos del cluster y ası́ se obtiene el tiempo de transmisión para cada tamaño
de mensaje. El tamaño de los mensajes se elige a intervalos regulares y se
aplican pequeñas perturbaciones para una evaluación completa el hardware
y software de comunicación. Ası́ se obtiene la latencia de pequeños mensajes,
tomada como la mitad del RTT para mensajes de 8 bytes y un gráfico del
throughput de un amplio rango de tamaño de mensajes. El módulo MPICH
permite evaluar el throughput utilizando pasaje de mensajes sincrónico y
asincrónico.
B.2.
Sistema de archivos
B.2.1.
Babieca
Se creo el benchmark llamado Babieca [40], en honor al caballo del Cid
Campeador. Toma los tiempos de acceso a un sistema de archivos para un
conjunto de comandos UNIX. En el mismo se tuvieron en cuenta los distintos
tipos de accesos: lectura (du -sk, grep -r, ls -R, find), lectura/escritura (cp,
gunzip, gzip, tar -xf, tar -ch -b X -f, rm -fr). Se describen brevemente:
du -sk Devuelve el tamaño total en KB del conjunto de datos.
grep -r Busca recursivamente una palabra dentro de todos los archivos del
conjunto de datos.
ls -lR Obtiene el estado de todos los archivos del conjunto de datos (tamaño,
dueño, etc.)
find Busca lo que se pida dentro del conjunto de datos.
cp Copia los datos.
gunzip Descomprime los datos.
57
gzip Comprime los datos.
tar -xf Desagrupa el conjunto de datos.
tar -ch -b X -f Agrupa el conjunto de datos.
El benchmark es un script en shell (bash) que se ejecuta pasándole como
parámetros:
el path completo del archivo .tar.gz sobre el cual se realizarán operaciones seleccionadas,
el path completo directorio destino,
archivo que contendrá los tiempos de acceso obtenidos.
Según el fichero al que pertenezca el archivo tar.gz y el directorio destino
seleccionado, las lecturas/escrituras serán locales, remotas, remota/remota,
local/remota o remota/local.
B.2.2.
Bonnie
El benchmark Bonnie [39] es utilizado para medir la performance de acceso a los discos locales de una máquina. Lleva a cabo una serie de pruebas
sobre un archivo de tamaño conocido, se recomienda que el mismo sea mı́nimamente el doble de tamaño de la memoria RAM disponible. Para cada
prueba informa la cantidad de bytes procesados por unidad de tiempo total,
por segundo de CPU y el porcentaje de CPU utilizado por el usuario y por
el sistema. Mide:
escrituras secuenciales Utiliza la macro putc de la biblioteca stdio. El
loop que realiza las escrituras es lo suficientemente pequeño para asegurarse que entre en cualquier cache razonable. El overhead del CPU
corresponde a la carga del código stdio y al espacio que tiene el sistema
operativo para asignar archivos.
escritura por bloques Utiliza la función write(2) con bloques de tamaño
16384 bytes. Aquı́ la carga de CPU corresponde solamente al espacio
que tiene el sistema operativo para asignar archivos.
reescritura Cada porción del archivo (16 KB) es leı́da con la función read(2),
ensuciada, y reescrita con la función write(2) requiriendo la función
lseek(2). Como no se realizan asignaciones de espacio, y la E/S está bien localizada, esta operación evalúa especı́ficamente la capacidad de
’caching’del fichero y la velocidad de transferencia de datos.
lectura secuencial Utiliza la macro getc de la biblioteca stdio. El loop de
escritura es suficientemente pequeño como en el caso de las escrituras.
La carga del CPU corresponde al código stdio y a la entrada secuencial.
lectura por bloques Utiliza la función read(2). Evalúa la performance de
entradas secuenciales.
búsqueda aleatoria Lanza 4 procesos en paralelo, entre todos realizarán
4000 búsquedas a posiciones aleatorias del archivo. En cada caso el
bloque es leı́do read(2). En el 10 % de dichas búsquedas, los procesos
ensuciarán los datos y re-escribirán el bloque con la función write(2).
Verifica que haya siempre una cola de procesos activa.
58
B.2.3.
perf y coll perf
perf Programa de prueba que es parte del código fuente de ROMIO. Realiza
operaciones de lectura y escritura concurrentes a un mismo archivo.
Para cada proceso MPI, perf asigna un arreglo de datos de tamaño
fijo (4, 8 32 64 MB). El arreglo es escrito a una región disjunta y fija
en el archivo compartido utilizando la función MPI File write() y
luego es leı́da de la misma región MPI File read(). Todos los procesos
MPI utilizan la función MPI Barrier() para sincronismo antes de cada
operación de E/S. perf mide dos tipos de operaciones:
escrituras y posterior lectura del archivo
escrituras con sincronismo con la función MPI File sync() y posterior lectura del archivo
La función MPI File sync() provoca que todas las escrituras realizadas
hasta el momento de su invocación sean transferidas de memoria al
fichero en cuestión. Este programa provee una cota máxima de la performance de operaciones de E/S de MPI según la cantidad nodos por
corrida y del tipo de sistema de archivos utilizado.
coll perf Programa escrito en C, está incluido en la distribución de ROMIO.
Mide el ancho de banda de lecturas y escrituras de un arreglo 3D
distribuido por bloques, a un archivo correspondiente a un arreglo
global en orden según C row-major. La forma de acceder al archivo es no continua. El tamaño del arreglo esté definido en 1283 pero
puede cambiarse su tamaño editando el fuente. Utiliza las funciones
MPI File read all() y MPI File write all().
59
Apéndice C
Configuración TCP en Linux
Linux permite configurar las variables que describen las caracterı́sticas
default de los sockets TCP. Se deben definir los valores deseados dentro
del archivo /etc/sysctl.conf. Para el caso en que se utilizan placas y switch
Gigabit se recomienda configurar las siguientes variables según el Cuadro C.1:
net.core.rmem default Tamaño de ventana receptora default.
net.core.rmem max Tamaño máximo de ventana receptora.
net.core.wmem default Tamaño de ventana de envı́o default.
net.core.wmem max Tamaño máximo de ventana de envı́o.
net.ipv4.tcp wmem Vector de tres enteros: min, default, max. Indica la
cantidad de memoria reservada para el buffer de un socket TCP de
envı́o de paquetes. Los valores default son min: 4K, def: 16K y max:
128K. El valor default sobrescribe al net.core.wmem default utilizado por otros protocolos, usualmente es más pequeño que este último,
el máximo no se sobrescribe.
net.ipv4.tcp rmem Vector de tres enteros: min, default, max. Indica la
cantidad de memoria reservada para el buffer de un socket TCP de
recepción de paquetes. Los valores default son min: 8K, def: 87380
bytes y max: 87380 * 2 bytes. El valor default sobrescribe al net.core.
rmem default utilizado por otros protocolos, usualmente es más pequeño que este último.
net.ipv4.tcp mem Vector de tres enteros: min, presión, max. min: debajo
de esta cantidad de páginas, TCP no se preocupa por su consumo de
memoria. presión: cuando la cantidad de memoria utilizada por TCP
excede esta cantidad de páginas, TCP modera el consumo de memoria
hasta alcanzar nuevamente el mı́nimo. max: cantidad de páginas habilitadas para encolar paquetes utilizada por todos los sockets TCP. Los
valores default de estos tres parámetros son calculados al momento de
boot en función de la cantidad de memoria disponible.
60
A continuación se presenta un cuadro con la configuración utilizada para
dichas variables para Fast Ethernet y Gigabit:
Variable
Fast Ethernet
Gigabit Ethernet
net.core.rmem default
65535
65535
net.core.rmem max
65535
8388608
net.core.wmem default
65535
65535
net.core.wmem max
65535
8388608
net.ipv4.tcp rmem 4096 87380 174760 4096 87380 4194304
net.ipv4.tcp wmem 4096 16384 131072 4096 65536 4194304
Cuadro C.1: Configuración TCP en linux.
61
Bibliografı́a
[1] D. Ridge, D. Becker, P. Merkey and T. Sterling. Beowulf:Harnessing
the power of parallelism in a pile-of-pcs. Proceedings, IEEE Aerospace,
(1997).
[2] Beowulf http://www.beowulf.org
[3] The Open Cluster Group. OSCAR (Open Source Cluster Application
Resource): A packaged Cluster software stack for High Performance computing. (2002). http://oscar.sourceforge.net.
[4] System Installation Suite (SIS). http://sisuite.org/
[5] HDF Group. http://hdf.ncsa.uiuc.edu/HDF5/
[6] A. Barak, O. La’adan y A. Shiloh. Scalable Cluster Computing with
MOSIX (Multi-computer Operating System for UNIX) for Linux. Institute of Computer Science, The Hebrew University of Jerusalem, 1999.
[7] L. Amar, A. Barak y A. Shiloh. The MOSIX Direct File System Access Method for Supporting Scalable Cluster File System. Institute of
Computer Science, The Hebrew University of Jerusalem, (2003).
[8] NFS v3 protocol specification. http://www.faqs.org/rfcs/rfc1813.html
[9] Linux NFS Howto. http://nfs.sf.net/nfs-howto.
[10] Veridian Information Solutions. Portable Batch System Administrator
Guide. (2000).
[11] Supercluster Research and Development Group. MAUI Scheduler Administrator’s Guide. May 2002. http://mauischeduler.sourceforge.net
[12] N. Snyder. IBM @Server - IBM Linux Clusters. November 2003.
[13] A. S. Tanenbaum. Modern operating System. Prentice Hall (1992).
[14] D. E. Comer. Internetworking with TCP/IP. Volume I, Principles, protocols and architecture. Prentice Hall. (1995).
[15] A. S. Tanenbaum. Computer Networks. Prentice Hall. (1996).
[16] R. B. Ross, P. H. Carns, W. B. Ligon III y R. Latham. Using the Parallel Virtual File System (PVFS). Julio 2002.
ftp://ftp.parl.clemson.edu:/pub/pvfs/.
62
[17] M. Kashyap, J. Hsieh, C. Stanton y R. Ali. The Parallel Virtual File
System for High Performance Computing Clusters. 2002.
[18] The
Parallel
Virtual
File
http://parlweb.parl.clemson.edu/pvfs.
System
Project.
[19] Mandrake Linux http://www.mandrakelinux.com
[20] The Linux Kernel Archives http://www.kernel.org
[21] A. P. Foong , T. R. Huff , H. H. Hum , J. P. Patwardhan TCP Performance Re-Visited Department of Computer Science Duke University
Durham, NC 27708
[22] Linux Red Hat http://www.redhat.com
[23] Global File System. http://www.sistina.com
[24] M. Johnson Whitepaper: Red Hat’s New Journaling File System: ext3.
2001.
[25] P. Pacheco Parallel Programming with MPI. Universidad de San Francisco. 1997.
[26] MPI Standard http://www.mcs.anl.gov/mpi/index.html
[27] P4 http://www.mcs.anl.gov/ lusk/p4/
[28] J. Boyle, R. Butler, T. Disz, B. Glickfeld, E. Lusk, R. Overbeek, J.
Patterson, and R. Stevens. Portable Programs for Parallel Processors.
Publicado por Holt, Rinehart y Winston. 1987.
[29] O. Aumage, G. Mercier, R. Namyst. MPICH/Madeleine: a True MultiProtocol MPI for High Performance Networks. LIP, ENS-LYON 46,
All’ee d’Italie 69364 Lyon Cedex 07, France.
[30] W. Gropp y E. Lusk. Installation and User’s Guide to MPICH, a
Portable Implementation of MPI Version 1.2.5. The ch p4 device for
Workstation Networks.
[31] D. Turner y X. Chen. Protocol dependent message passing performance
on linux Clusters. Ames Laboratory - Iowa State University. Septiembre
2002.
[32] Snell, Mikler y Gustafson. NetPIPE: A Network Protocol Independent
Performance Evaluator. Ames Laboratory.
[33] D. Turner, A. Oline, X. Chen y T. Benjegerdes Integrating New Capabilities into NetPIPE. Ames Laboratory - Iowa State University.
[34] B. L. Tierney TCP Tuning Techniques for High-speed Wide Area Networks. Data Intensive Distributed Computing Group. Laurence Berkeley
National Laboratory.
63
[35] B. L. Tierney TCP tuning guide for distributed application on wide
area networks. Data Intensive Distributed Computing Group. Laurence
Berkeley National Laboratory. Febrero 2001.
[36] ROMIO, MPI IO interface http://www.mcs.anl.gov/romio
[37] R. Thakur, R. Ross, E. Lusk, W. Gropp User Guide for ROMIO: A
high-performance portable MPI-IO implementation. Argonne National
Laboratory. Mayo 2002.
[38] N. Srivastava. Parallel I/O. Parallel File System. HPC Expertise Center,
Hewlett-Packard Company.
[39] The Bonnie benchmark http://www.textuality.com/bonnie/
[40] C. León Carri, D. Vadell. Benchmark Babieca. Dpto. de Computación,
Facultad de Ciencias Exactas y Naturales, UBA. 2003. (Informe interno.)
[41] Intel. PCI Express Ethernet Networking. Smoothly Migrate Networking
to the Next-generation, Industry-standard Serial I/O Architecture. 2003.
[42] M. Kashyap, J. Hsieh, C. Stanton y R. Ali. The Parallel Virtual File
System for High-Performance Computing Clusters. Dell Power Solutions
http://www.dell.com/powersolutions. Noviembre 2002.
[43] Manual de usuario. Tarjeta de interfaz de red Gigabit de 3Com 3C2000.
http://www.3com.com/. Abril 2003.
64
Descargar