Content from ¿Por qué utilizar un clúster?
Última actualización: 2025-08-04 | Mejora esta página
Hoja de ruta
Preguntas
- ¿Por qué me interesa la computación de alto rendimiento (HPC)?
- ¿Qué puedo esperar aprender de este curso?
Objetivos
- Describa qué es un sistema HPC
- Identifique cómo podría beneficiarle un sistema HPC.
Con frecuencia, los problemas de investigación que utilizan la computación pueden superar las capacidades del ordenador de sobremesa o portátil en el que comenzaron:
- Un estudiante de estadística quiere validar un modelo de forma cruzada. Para ello, debe ejecutar el modelo 1.000 veces, pero cada ejecución tarda una hora. Ejecutar el modelo en un ordenador portátil llevaría más de un mes En este problema de investigación, los resultados finales se calculan después de ejecutar los 1000 modelos, pero normalmente sólo se ejecuta un modelo a la vez (en serie) en el portátil. Dado que cada una de las 1000 ejecuciones es independiente de las demás, y si se dispone de suficientes ordenadores, en teoría es posible ejecutarlas todas a la vez (en paralelo).
- Un investigador en genómica ha estado utilizando pequeños conjuntos de datos de secuenciación, pero pronto recibirá un nuevo tipo de datos de secuenciación que es 10 veces más grande. Abrir los conjuntos de datos en un ordenador ya supone un reto; analizar estos conjuntos de datos más grandes probablemente lo colapsará. En este problema de investigación, los cálculos necesarios podrían ser imposibles de paralelizar, pero se necesitaría un ordenador con más memoria para analizar el futuro conjunto de datos mucho mayor.
- Un ingeniero está utilizando un paquete de dinámica de fluidos que tiene una opción para ejecutarse en paralelo. Hasta ahora, esta opción no se utilizaba en un ordenador de sobremesa. Al pasar de simulaciones 2D a 3D, el tiempo de simulación se ha más que triplicado. Podría ser útil aprovechar esa opción o característica. En este problema de investigación, los cálculos en cada región de la simulación son en gran medida independientes de los cálculos en otras regiones de la simulación. Es posible ejecutar los cálculos de cada región simultáneamente (en paralelo), comunicar los resultados seleccionados a las regiones adyacentes según sea necesario y repetir los cálculos para converger en un conjunto final de resultados. Al pasar de un modelo 2D a un modelo 3D, tanto la cantidad de datos como la cantidad de cálculos aumentan enormemente, y en teoría es posible distribuir los cálculos entre varios ordenadores que se comunican a través de una red compartida.
En todos estos casos, se necesita acceso a más ordenadores (y más grandes). Esos ordenadores deben poder utilizarse al mismo tiempo, resolviendo en paralelo los problemas de muchos investigadores.
Presentación de Jargon Busting
Abra el HPC Jargon Buster en una nueva
pestaña. Para presentar el contenido, pulse C
para abrir un
clone en una ventana separada, después pulse
P
para cambiar el modo de
presentación.
Nunca he usado un servidor, ¿verdad?
Tómese un minuto y piense cuáles de sus interacciones diarias con un ordenador pueden requerir un servidor remoto o incluso un clúster para proporcionarle resultados.
- Comprobación del correo electrónico: su ordenador (posiblemente en el bolsillo) se pone en contacto con una máquina remota, se autentica y descarga una lista de mensajes nuevos; también carga los cambios en el estado del mensaje, como si lo ha leído, marcado como basura o borrado. Como la suya no es la única cuenta, el servidor de correo es probablemente uno de tantos en un centro de datos.
- Buscar una frase en Internet implica comparar el término de búsqueda con una base de datos masiva de todos los sitios conocidos, en busca de coincidencias. Esta operación de “consulta” puede ser sencilla, pero construir esa base de datos es una tarea monumental Los servidores intervienen en cada paso.
- Buscar direcciones en un sitio web de mapas implica conectar los puntos (A) inicial y (B) final recorriendo un grafo en busca del camino “más corto” por distancia, tiempo, gasto u otra métrica. Convertir un mapa en la forma correcta es relativamente sencillo, pero calcular todas las rutas posibles entre A y B es costoso.
Consultar el correo electrónico podría ser en serie: su máquina se conecta a un servidor e intercambia datos. La búsqueda en la base de datos del término de búsqueda (o puntos finales) también podría ser en serie, ya que una máquina recibe la consulta y devuelve el resultado. Sin embargo, montar y almacenar la base de datos completa supera con creces la capacidad de una sola máquina. Por lo tanto, estas funciones se realizan en paralelo mediante una gran colección de servidores [“hiperescala”][hiperescala] que trabajan juntos.
Puntos Clave
- La computación de alto rendimiento (HPC) suele implicar la conexión a sistemas informáticos muy grandes de otras partes del mundo.
- Estos otros sistemas pueden utilizarse para realizar tareas que serían imposibles o mucho más lentas en sistemas más pequeños.
- Los recursos HPC son compartidos por múltiples usuarios.
- El método estándar de interacción con estos sistemas es a través de una interfaz de línea de comandos.
Content from Conexión a un sistema HPC remoto
Última actualización: 2025-08-04 | Mejora esta página
Hoja de ruta
Preguntas
- ¿Cómo me conecto a un sistema HPC remoto?
Objetivos
- Configure el acceso seguro a un sistema HPC remoto.
- Conéctate a un sistema HPC remoto.
Conexiones seguras
El primer paso para utilizar un cluster es establecer una conexión desde nuestro portátil al cluster. Cuando estamos sentados frente a un ordenador (o de pie, o sosteniéndolo en nuestras manos o en nuestras muñecas), hemos llegado a esperar una pantalla visual con iconos, widgets, y quizás algunas ventanas o aplicaciones: una interfaz gráfica de usuario, o GUI. Dado que los clusters de ordenadores son recursos remotos a los que nos conectamos a través de interfaces lentas o intermitentes (WiFi y VPNs especialmente), es más práctico usar una interfaz de línea de comandos, o CLI, para enviar comandos como texto plano. Si un comando devuelve una salida, también se imprime como texto plano. Los comandos que ejecutaremos hoy no abrirán una ventana para mostrar resultados gráficos.
Si alguna vez has abierto el Símbolo del sistema de Windows o el Terminal de macOS, habrás visto una CLI. Si ya has tomado los cursos de The Carpentries sobre UNIX Shell o Version Control, has usado el CLI en tu máquina local extensivamente. El único salto a dar aquí es abrir un CLI en una máquina remota, tomando algunas precauciones para que otras personas en la red no puedan ver (o cambiar) los comandos que estás ejecutando o los resultados que la máquina remota envía de vuelta. Utilizaremos el protocolo Secure SHell (o SSH) para abrir una conexión de red encriptada entre dos máquinas, permitiéndote enviar y recibir texto y datos sin tener que preocuparte de miradas indiscretas.
Los clientes SSH suelen ser herramientas de línea de comandos en las
que el único argumento necesario es la dirección de la máquina remota.
Si tu nombre de usuario en el sistema remoto difiere del que utilizas
localmente, debes proporcionarlo también. Si tu cliente SSH tiene un
front-end gráfico, como PuTTY o MobaXterm, establecerás estos argumentos
antes de hacer clic en “conectar” Desde el terminal, escribirás algo
como ssh userName@hostname
, donde el argumento es igual que
una dirección de correo electrónico: el símbolo “@” se utiliza para
separar el ID personal de la dirección de la máquina remota.
Al iniciar sesión en un ordenador portátil, tableta u otro
dispositivo personal, normalmente se requiere un nombre de usuario, una
contraseña o un patrón para evitar el acceso no autorizado. En estas
situaciones, la probabilidad de que alguien intercepte tu contraseña es
baja, ya que para registrar tus pulsaciones de teclas se requiere un
exploit malicioso o acceso físico. Para sistemas como
login1
que ejecutan un servidor SSH, cualquiera en la red
puede iniciar sesión, o intentarlo. Dado que los nombres de usuario
suelen ser públicos o fáciles de adivinar, la contraseña suele ser el
eslabón más débil de la cadena de seguridad. Por lo tanto, muchos
clusters prohíben el inicio de sesión basado en contraseña, requiriendo
en su lugar que generes y configures un par de claves pública-privada
con una contraseña mucho más fuerte. Incluso si tu cluster no lo
requiere, la siguiente sección te guiará a través del uso de claves SSH
y un agente SSH para reforzar tu seguridad y hacer más
conveniente el inicio de sesión en sistemas remotos.
Mejor seguridad con claves SSH
La Lesson Setup proporciona instrucciones para instalar una aplicación shell con SSH. Si aún no lo ha hecho, abra esa aplicación shell con una interfaz de línea de comandos tipo Unix en su sistema.
Las claves SSH son un método alternativo de autenticación para obtener acceso a sistemas informáticos remotos. También se pueden utilizar para autenticarse al transferir archivos o para acceder a sistemas remotos de control de versiones (como GitHub). En esta sección crearás un par de claves SSH:
- una clave privada que guardas en tu propio ordenador, y
- una clave pública que puedes colocar en cualquier sistema remoto al que vayas a acceder.
Las claves privadas son tu pasaporte digital seguro
Una clave privada que sea visible para cualquiera excepto para ti debe considerarse comprometida y debe ser destruida. Esto incluye tener permisos inadecuados en el directorio en el que está almacenada (o una copia), atravesar cualquier red que no sea segura (encriptada), adjuntarla en un correo electrónico no encriptado, e incluso mostrar la clave en la ventana de tu terminal.
Protege esta clave como si abriera la puerta de tu casa. En muchos sentidos, lo hace.
Independientemente del software o sistema operativo que utilices, por favor elige una contraseña o frase de contraseña segura que actúe como otra capa de protección para tu clave SSH privada.
Consideraciones sobre las contraseñas de las claves SSH
Cuando se le solicite, introduzca una contraseña segura que pueda recordar. Hay dos enfoques comunes para esto:
- Crea una frase de contraseña memorable con algunos signos de puntuación y sustituciones de números por letras, de 32 caracteres o más. Las direcciones funcionan bien, pero ten cuidado con los ataques de ingeniería social o de registros públicos.
- Utiliza un gestor de contraseñas y su generador de contraseñas integrado con todas las clases de caracteres, de 25 caracteres o más. KeePass y BitWarden son dos buenas opciones.
- Nada es menos seguro que una clave privada sin contraseña. Si se ha saltado la introducción de la contraseña por accidente, vuelva atrás y genere un nuevo par de claves con una contraseña segura.
Claves SSH en Linux, Mac, MobaXterm y Windows Subsistema para Linux
Una vez que haya abierto un terminal, compruebe si existen claves SSH y nombres de archivo, ya que las claves SSH existentes se sobrescriben.
Si ~/.ssh/id_ed25519
ya existe, tendrá que especificar
un nombre diferente para el nuevo par de claves.
Genera un nuevo par de claves pública-privada usando el siguiente
comando, que producirá una clave más fuerte que la
ssh-keygen
por defecto invocando estas banderas:
-
-a
(por defecto es 16): número de rondas de derivación de la frase de contraseña; aumentar para ralentizar los ataques de fuerza bruta. -
-t
(por defecto es rsa): especifica el “tipo” o algoritmo criptográfico.ed25519
especifica EdDSA con una clave de 256 bits; es más rápido que RSA con una fuerza comparable. -
-f
(por defecto es /home/usuario/.ssh/id_algorithm): nombre de archivo para almacenar tu clave privada. El nombre de archivo de la clave pública será idéntico, con una extensión.pub
añadida.
Cuando se le solicite, introduzca una contraseña segura teniendo en cuenta las consideraciones anteriores. Ten en cuenta que el terminal no parecerá cambiar mientras escribes la contraseña: esto es deliberado, por tu seguridad. Se le pedirá que la escriba de nuevo, así que no se preocupe demasiado por los errores tipográficos.
Echa un vistazo en ~/.ssh
(utiliza
ls ~/.ssh
). Debería ver dos archivos nuevos:
- su clave privada (
~/.ssh/id_ed25519
): *no la compartas con nadie - la clave pública compartible (
~/.ssh/id_ed25519.pub
): si un administrador del sistema te pide una clave, ésta es la que debes enviar. También es segura para subir a sitios web como GitHub: está pensada para ser vista.
Usar RSA para sistemas antiguos
Si la generación de claves falló porque ed25519 no está disponible, intenta usar el criptosistema más antiguo (pero aún fuerte y confiable) RSA. De nuevo, primero comprueba si existe una clave:
Si ~/.ssh/id_rsa
ya existe, tendrás que especificar
elegir un nombre diferente para el nuevo par de claves. Genérelo como
arriba, con las siguientes banderas adicionales:
-
-b
establece el número de bits de la clave. El valor predeterminado es 2048. EdDSA utiliza una longitud de clave fija, por lo que esta bandera no tendría ningún efecto. -
-o
(no por defecto): utiliza el formato de clave OpenSSH, en lugar de PEM.
Cuando se le solicite, introduzca una contraseña segura teniendo en cuenta las consideraciones anteriores.
Echa un vistazo en ~/.ssh
(utiliza
ls ~/.ssh
). Debería ver dos archivos nuevos:
- su clave privada (
~/.ssh/id_rsa
): *no la compartas con nadie - la clave pública compartible (
~/.ssh/id_rsa.pub
): si un administrador del sistema te pide una clave, ésta es la que debes enviar. También es segura para subir a sitios web como GitHub: está pensada para ser vista.
Claves SSH en PuTTY
Si utiliza PuTTY en Windows, descargue y utilice
puttygen
para generar el par de claves. Consulte la documentación
de PuTTY para más detalles.
- Selecciona
EdDSA
como tipo de clave. - Seleccione
255
como tamaño o fuerza de la clave. - Haz clic en el botón “Generar”.
- No es necesario introducir un comentario.
- Cuando se le solicite, introduzca una contraseña segura teniendo en cuenta las consideraciones anteriores.
- Guarda las claves en una carpeta que ningún otro usuario del sistema pueda leer.
Echa un vistazo a la carpeta que has especificado. Debería ver dos archivos nuevos:
- su clave privada (
id_ed25519
): *no la compartas con nadie - la clave pública compartible (
id_ed25519.pub
): si un administrador del sistema te pide una clave, ésta es la que debes enviar. También es segura para subir a sitios web como GitHub: está pensada para ser vista.
Agente SSH para facilitar el manejo de claves
Una clave SSH es tan fuerte como la contraseña utilizada para desbloquearla, pero por otro lado, escribir una contraseña compleja cada vez que te conectas a una máquina es tedioso y envejece muy rápido. Aquí es donde entra el Agente SSH.
Usando un Agente SSH, puede escribir su contraseña para la clave privada una vez, y luego hacer que el Agente la recuerde durante un número de horas o hasta que cierre la sesión. A menos que algún actor nefasto tenga acceso físico a su máquina, esto mantiene la contraseña segura, y elimina el tedio de introducir la contraseña varias veces.
Recuerda tu contraseña, porque una vez que caduque en el Agente, tendrás que escribirla de nuevo.
Agentes SSH en Linux, macOS y Windows
Abre tu aplicación de terminal y comprueba si se está ejecutando un agente:
-
Si obtiene un error como el siguiente,
ERROR
Error connecting to agent: No such file or directory
… entonces necesitas lanzar el agente como sigue:
¿Qué hay en
$(...)
?La sintaxis de este comando de Agente SSH es inusual, basado en lo que hemos visto en la lección de UNIX Shell. Esto es porque el comando
ssh-agent
crea abre una conexión a la que sólo usted tiene acceso, e imprime una serie de comandos shell que pueden ser usados para alcanzarla – ¡pero no los ejecuta!SALIDA
SSH_AUTH_SOCK=/tmp/ssh-Zvvga2Y8kQZN/agent.131521; export SSH_AUTH_SOCK; SSH_AGENT_PID=131522; export SSH_AGENT_PID; echo Agent pid 131522;
El comando
eval
interpreta esta salida de texto como comandos y le permite acceder a la conexión del Agente SSH que acaba de crear.Puede ejecutar cada línea de la salida
ssh-agent
usted mismo y obtener el mismo resultado. El uso deeval
facilita las cosas. De lo contrario, su agente ya se está ejecutando: no se meta con él.
Añade tu clave al agente, con expiración de sesión después de 8 horas:
SALIDA
Enter passphrase for .ssh/id_ed25519:
Identity added: .ssh/id_ed25519
Lifetime set to 86400 seconds
Mientras dure (8 horas), siempre que utilices esa clave, el Agente SSH proporcionará la clave en tu nombre sin que tengas que teclear ni una sola tecla.
Agente SSH en PuTTY
Si utiliza PuTTY en Windows, descargue y utilice pageant
como agente SSH. Consulte la documentación
de PuTTY.
Entrar en el Cluster
Abre tu terminal o cliente gráfico SSH, e inicia sesión en el
clúster. Sustituye yourUsername
por tu nombre de usuario o
el suministrado por los instructores.
Es posible que se te pida la contraseña. Atención: los caracteres que
escriba después de la solicitud de contraseña no se mostrarán en
pantalla. La salida normal se reanudará cuando pulse
Enter
.
Puede que haya notado que el prompt cambió cuando se conectó al
sistema remoto usando el terminal (si se conectó usando PuTTY esto no se
aplicará porque no ofrece un terminal local). Este cambio es importante
porque puede ayudarte a distinguir en qué sistema se ejecutarán los
comandos que escribas cuando los pases a la terminal. Este cambio es
también una pequeña complicación que tendremos que sortear a lo largo
del taller. Exactamente lo que se muestra como prompt (que
convencionalmente termina en $
) en la terminal cuando está
conectada al sistema local y al sistema remoto será típicamente
diferente para cada usuario. Aún así, necesitamos indicar en qué sistema
estamos introduciendo comandos, por lo que adoptaremos la siguiente
convención:
-
[you@laptop:~]$
cuando el comando deba introducirse en un terminal conectado a su ordenador local -
[yourUsername@login1 ~]
cuando el comando deba introducirse en un terminal conectado al sistema remoto -
$
cuando realmente no importa a qué sistema está conectado el terminal.
Echando un vistazo a tu home remoto
Muy a menudo, muchos usuarios se ven tentados a pensar que una
instalación de computación de alto rendimiento es una máquina gigante y
mágica. A veces, la gente asume que el ordenador en el que han iniciado
sesión es todo el clúster de computación. Pero, ¿qué ocurre realmente?
¿En qué ordenador hemos iniciado sesión? El nombre del ordenador en el
que hemos iniciado sesión se puede comprobar con el comando
hostname
. (¡También puedes notar que el nombre de host
actual es también parte de nuestro prompt!)
SALIDA
login1
Ya estamos en la máquina remota. A continuación, vamos a averiguar
dónde estamos ejecutando pwd
para printar el directorio de
trabajo (print working directory).
SALIDA
/home/yourUsername
¡Genial, ya sabemos dónde estamos! Veamos qué hay en nuestro directorio actual:
SALIDA
id_ed25519.pub
Es posible que los administradores del sistema hayan configurado tu directorio de inicio con algunos archivos, carpetas y enlaces (accesos directos) útiles al espacio reservado para ti en otros sistemas de archivos. Si no lo han hecho, tu directorio personal puede aparecer vacío. Para volver a comprobarlo, incluya los archivos ocultos en su listado de directorios:
SALIDA
. .bashrc id_ed25519.pub
.. .ssh
En la primera columna, .
es una referencia al directorio
actual y ..
una referencia a su padre (/home
).
Puede que veas o no los otros ficheros, o ficheros como ellos:
.bashrc
es un fichero de configuración del shell, que
puedes editar con tus preferencias; y .ssh
es un directorio
que almacena claves SSH y un registro de conexiones autorizadas.
Instale su clave SSH
Puede haber una manera mejor
Las políticas y prácticas para el manejo de claves SSH varían entre clusters HPC: siga cualquier guía proporcionada por los administradores del cluster o la documentación. En particular, si existe un portal en línea para la gestión de claves SSH, utilícelo en lugar de las instrucciones descritas aquí.
Si transfirió su clave pública SSH con scp
, debería ver
id_ed25519.pub
en su directorio personal. Para “instalar”
esta clave, debe aparecer en un archivo llamado
authorized_keys
en la carpeta .ssh
.
Si la carpeta .ssh
no aparece en la lista anterior, es
que aún no existe: créala.
Ahora, utiliza cat
para imprimir tu clave pública, pero
redirige la salida, añadiéndola al archivo
authorized_keys
:
¡Eso es todo! Desconéctese e intente conectarse de nuevo al remoto: si su clave y agente han sido configurados correctamente, no se le pedirá la contraseña de su clave SSH.
Puntos Clave
- Un sistema HPC es un conjunto de máquinas conectadas en red.
- Los sistemas HPC suelen proporcionar nodos de inicio de sesión y un conjunto de nodos trabajadores.
- Los recursos que se encuentran en los nodos independientes (trabajadores) pueden variar en volumen y tipo (cantidad de RAM, arquitectura del procesador, disponibilidad de sistemas de archivos montados en red, etc.).
- Los archivos guardados en un nodo están disponibles en todos los nodos.
Content from Trabajar en un sistema HPC remoto
Última actualización: 2025-08-04 | Mejora esta página
Hoja de ruta
Preguntas
- “¿Qué es un sistema HPC?”
- “¿Cómo funciona un sistema HPC?”
- “¿Cómo me conecto a un sistema HPC remoto?”
Objetivos
- “Conectarse a un sistema HPC remoto”
- “Comprender la arquitectura general del sistema HPC”
¿Qué es un sistema HPC?
Las palabras “nube”, “clúster”, y la frase “computación de alto rendimiento” o “HPC” se utilizan mucho en diferentes contextos y con varios significados relacionados. ¿Qué significan? Y lo que es más importante, ¿cómo los utilizamos en nuestro trabajo?
La nube es un término genérico comúnmente utilizado para referirse a los recursos informáticos que son a) proporcionados a los usuarios bajo demanda o según sus necesidades y b) representan recursos reales o virtuales que pueden estar localizados en cualquier lugar de la Tierra. Por ejemplo, una gran empresa con recursos informáticos en Brasil, Zimbabue y Japón puede gestionar esos recursos como su propia nube interna y esa misma empresa puede utilizar también recursos comerciales en la nube proporcionados por Amazon o Google. Los recursos en la nube pueden referirse a máquinas que realizan tareas relativamente sencillas como servir sitios web, proporcionar almacenamiento compartido, proporcionar servicios web (como correo electrónico o plataformas de medios sociales), así como tareas más tradicionales de computación intensiva como ejecutar una simulación.
El término sistema HPC, por otro lado, describe un recurso independiente para cargas de trabajo computacionalmente intensivas. Suelen estar compuestos por una multitud de elementos integrados de procesamiento y almacenamiento, diseñados para manejar grandes volúmenes de datos y/o grandes números de operaciones en coma flotante (FLOPS) con el mayor rendimiento posible. Por ejemplo, todas las máquinas de la lista Top-500 son sistemas HPC. Para soportar estas limitaciones, un recurso HPC debe existir en una ubicación específica y fija: los cables de red sólo pueden estirarse hasta cierto punto, y las señales eléctricas y ópticas sólo pueden viajar a cierta velocidad.
La palabra “clúster” se utiliza a menudo para recursos HPC de escala pequeña a moderada menos impresionantes que el Top-500. Los clústeres suelen mantenerse en centros de cálculo que soportan varios sistemas de este tipo, todos ellos compartiendo redes y almacenamiento comunes para soportar tareas comunes de cálculo intensivo.
Inicio de sesión
El primer paso para utilizar un clúster es establecer una conexión entre nuestro portátil y el clúster. Cuando estamos sentados frente a un ordenador (o de pie, o sosteniéndolo en la mano o en la muñeca), esperamos ver una pantalla con iconos, widgets y quizás algunas ventanas o aplicaciones: una interfaz gráfica de usuario o GUI. Dado que los clústeres informáticos son recursos remotos a los que nos conectamos a través de interfaces a menudo lentas o con retardo (WiFi y VPN, especialmente), es más práctico utilizar una interfaz de línea de comandos, o CLI, en la que los comandos y los resultados se transmiten únicamente a través de texto. Todo lo que no sea texto (imágenes, por ejemplo) debe escribirse en disco y abrirse con un programa aparte.
Si alguna vez has abierto el símbolo del sistema de Windows o el terminal de macOS, habrás visto una CLI. Si ya has tomado los cursos de Las Carpinterías sobre la Shell UNIX o el Control de Versiones, has usado la CLI en tu máquina local algo extensamente. El único salto a dar aquí es abrir un CLI en una máquina remota, tomando algunas precauciones para que otras personas en la red no puedan ver (o cambiar) los comandos que estás ejecutando o los resultados que la máquina remota envía de vuelta. Usaremos el protocolo Secure SHell (o SSH) para abrir una conexión de red encriptada entre dos máquinas, permitiéndote enviar y recibir texto y datos sin tener que preocuparte de miradas indiscretas.
Asegúrese de que tiene un cliente SSH instalado en su portátil.
Consulte la sección setup para más detalles.
Los clientes SSH suelen ser herramientas de línea de comandos, donde se
proporciona la dirección de la máquina remota como único argumento
requerido. Si tu nombre de usuario en el sistema remoto difiere del que
usas localmente, debes proporcionarlo también. Si tu cliente SSH tiene
un front-end gráfico, como PuTTY o MobaXterm, establecerás estos
argumentos antes de hacer clic en “conectar” Desde el terminal,
escribirás algo como ssh userName@hostname
, donde el
símbolo “@” se utiliza para separar las dos partes de un único
argumento.
Sigue adelante y abre tu terminal o cliente gráfico SSH, luego inicia sesión en el cluster usando tu nombre de usuario y el ordenador remoto al que puedes acceder desde el mundo exterior, cluster.hpc-carpentry.org.
Recuerda sustituir yourUsername
por tu nombre de usuario
o el que te proporcionen los instructores. Es posible que te pidan tu
contraseña. Atención: los caracteres que escriba después de la solicitud
de contraseña no se mostrarán en pantalla. La salida normal se reanudará
cuando pulse Enter
.
¿Dónde estamos?
Muy a menudo, muchos usuarios se ven tentados a pensar que una
instalación de computación de alto rendimiento es una máquina gigante y
mágica. A veces, la gente asume que el ordenador en el que han iniciado
sesión es todo el clúster de computación. Pero, ¿qué ocurre realmente?
¿En qué ordenador hemos iniciado sesión? El nombre del ordenador en el
que hemos iniciado sesión se puede comprobar con el comando
hostname
. (¡También puedes notar que el nombre de host
actual es también parte de nuestro prompt!)
SALIDA
login1
¿Qué hay en tu directorio de inicio?
Es posible que los administradores del sistema hayan configurado su
directorio personal con algunos archivos, carpetas y enlaces (accesos
directos) útiles a espacios reservados para usted en otros sistemas de
archivos. Eche un vistazo a ver qué encuentra. Sugerencia: Los
comandos del shell pwd
y ls
pueden resultarle
útiles. El contenido de los directorios personales varía de un usuario a
otro. Por favor, comenta cualquier diferencia que encuentres con tus
vecinos.
La capa más profunda debe diferir: yourUsername
es
exclusivamente suya. ¿Hay diferencias en la ruta en los niveles
superiores?
Si ambos tienen directorios vacíos, se verán idénticos. Si tú o tu vecino habéis usado el sistema antes, puede haber diferencias. ¿En qué estás trabajando?
Utilice pwd
para imprimir la ruta del directorio de
trabajo:
Puede ejecutar ls
para
listar el contenido del directorio,
aunque es posible que no aparezca nada (si no se han proporcionado
ficheros). Para estar seguro, utilice también el indicador
-a
para mostrar los archivos ocultos.
Como mínimo, esto mostrará el directorio actual como .
,
y el directorio padre como ..
.
Nodos
Los ordenadores individuales que componen un clúster se suelen llamar nodos (aunque también se les llama servidores, ordenadores y máquinas). En un clúster, hay distintos tipos de nodos para distintos tipos de tareas. El nodo en el que te encuentras en este momento se llama nodo de cabecera, nodo de inicio de sesión, almohadilla de aterrizaje o nodo de envío. Un nodo de inicio de sesión sirve como punto de acceso al clúster.
Como pasarela, es muy adecuada para subir y descargar archivos, configurar software y realizar pruebas rápidas. En general, el nodo de acceso no debe utilizarse para tareas que consuman mucho tiempo o recursos. Deberías estar atento a esto, y comprobar con los operadores o la documentación de tu sitio los detalles de lo que está y no está permitido. En estas lecciones, evitaremos ejecutar trabajos en el nodo principal.
Nodos de transferencia dedicados
Si desea transferir grandes cantidades de datos hacia o desde el clúster, algunos sistemas ofrecen nodos dedicados sólo para transferencias de datos. La motivación de esto radica en el hecho de que las transferencias de datos más grandes no deben obstruir el funcionamiento del nodo de inicio de sesión para nadie más. Comprueba en la documentación de tu clúster o con su equipo de soporte si existe un nodo de transferencia de este tipo. Como regla general, considere todas las transferencias de un volumen superior a 500 MB a 1 GB como grandes. Pero estos números cambian, por ejemplo, en función de la conexión de red propia y de su clúster u otros factores.
El verdadero trabajo en un cluster lo hacen los nodos de trabajo (o computación). Los nodos de trabajo tienen muchas formas y tamaños, pero generalmente se dedican a tareas largas o difíciles que requieren muchos recursos computacionales.
Toda la interacción con los nodos trabajadores es manejada por una pieza especializada de software llamada planificador (el planificador utilizado en esta lección se llama Slurm). Aprenderemos más sobre cómo usar el planificador para enviar trabajos a continuación, pero por ahora, también puede darnos más información sobre los nodos trabajadores.
Por ejemplo, podemos ver todos los nodos trabajadores ejecutando el
comando sinfo
.
SALIDA
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
cpubase_bycore_b1* up infinite 4 idle node[1-2],smnode[1-2]
node up infinite 2 idle node[1-2]
smnode up infinite 2 idle smnode[1-2]
También hay máquinas especializadas que se utilizan para gestionar el almacenamiento en disco, la autenticación de usuarios y otras tareas relacionadas con la infraestructura. Aunque no solemos iniciar sesión o interactuar con estas máquinas directamente, permiten una serie de características clave como asegurar que nuestra cuenta de usuario y archivos están disponibles en todo el sistema HPC.
¿Qué hay en un Nodo?
Todos los nodos de un sistema HPC tienen los mismos componentes que su propio ordenador portátil o de sobremesa: CPUs (a veces también llamados procesadores o cores), memoria (o RAM) y espacio de disco. Las CPU son la herramienta de un ordenador para ejecutar programas y cálculos. La información sobre una tarea en curso se almacena en la memoria del ordenador. Disco se refiere a todo el almacenamiento al que se puede acceder como un sistema de archivos. Por lo general, se trata de un almacenamiento que puede guardar datos de forma permanente, es decir, los datos siguen ahí aunque se reinicie el ordenador. Aunque este almacenamiento puede ser local (un disco duro instalado en su interior), es más común que los nodos se conecten a un servidor de archivos compartido y remoto o a un clúster de servidores.

Explore su ordenador
Hay varias maneras de hacer esto. La mayoría de los sistemas operativos tienen un monitor gráfico del sistema, como el Administrador de tareas de Windows. A veces se puede encontrar información más detallada en la línea de comandos. Por ejemplo, algunos de los comandos utilizados en un sistema Linux son:
Ejecutar utilidades del sistema
Lectura de /proc
Utilizar un monitor del sistema
Explorar el nodo de acceso
Ahora compara los recursos de tu ordenador con los del nodo principal.
BASH
[you@laptop:~]$ ssh yourUsername@cluster.hpc-carpentry.org
[yourUsername@login1 ~] nproc --all
[yourUsername@login1 ~] free -m
Puedes obtener más información sobre los procesadores usando
lscpu
, y muchos detalles sobre la memoria leyendo el
fichero /proc/meminfo
:
También puedes explorar los sistemas de ficheros disponibles usando
df
para mostrar el espacio disk
free. La opción -h
muestra los tamaños en
un formato amigable, es decir, GB en lugar de B. La opción
type -T
muestra qué tipo de sistema de
ficheros es cada recurso.
Discusión
Los sistemas de ficheros locales (ext, tmp, xfs, zfs) dependerán de si estás en el mismo nodo de login (o nodo de computación, más adelante). Los sistemas de ficheros en red (beegfs, cifs, gpfs, nfs, pvfs) serán similares — pero pueden incluir yourUsername, dependiendo de cómo esté montado.
Sistemas de archivos compartidos
Es importante recordar que los archivos guardados en un nodo (ordenador) suelen estar disponibles en cualquier parte del clúster
Compare su ordenador, el nodo de inicio de sesión y el nodo de cálculo
Compara el número de procesadores y memoria de tu portátil con los números que ves en el nodo cabeza del cluster y en el nodo trabajador. Discute las diferencias con tu vecino.
¿Qué implicaciones crees que pueden tener las diferencias a la hora de ejecutar tu trabajo de investigación en los distintos sistemas y nodos?
Diferencias entre nodos
Muchos clusters HPC tienen una variedad de nodos optimizados para cargas de trabajo particulares. Algunos nodos pueden tener una mayor cantidad de memoria, o recursos especializados como Unidades de Procesamiento Gráfico (GPUs).
Con todo esto en mente, ahora veremos cómo hablar con el planificador del clúster y utilizarlo para empezar a ejecutar nuestros scripts y programas
Puntos Clave
- “Un sistema HPC es un conjunto de máquinas conectadas en red”
- “Los sistemas HPC suelen proporcionar nodos de inicio de sesión y un conjunto de nodos trabajadores”
- “Los recursos que se encuentran en nodos independientes (trabajadores) pueden variar en volumen y tipo (cantidad de RAM, arquitectura del procesador, disponibilidad de sistemas de ficheros montados en red, etc.).”
- “Los archivos guardados en un nodo están disponibles en todos los nodos”
Content from Fundamentos del programador
Última actualización: 2025-08-04 | Mejora esta página
Hoja de ruta
Preguntas
- ¿Qué es un planificador y por qué un clúster necesita uno?
- ¿Cómo lanzo un programa para que se ejecute en un nodo de cálculo del clúster?
- ¿Cómo puedo capturar la salida de un programa que se ejecuta en un nodo del clúster?
Objetivos
- Envía un script simple al cluster.
- Supervisar la ejecución de los trabajos mediante herramientas de línea de comandos.
- Inspeccione los archivos de salida y error de sus trabajos.
- Encontrar el lugar adecuado para colocar grandes conjuntos de datos en el clúster.
Programador de trabajos
Un sistema HPC puede tener miles de nodos y miles de usuarios. ¿Cómo decidimos quién recibe qué y cuándo? ¿Cómo nos aseguramos de que una tarea se ejecuta con los recursos que necesita? De esta tarea se encarga un software especial llamado programador. En un sistema HPC, el programador gestiona qué tareas se ejecutan, dónde y cuándo.
La siguiente ilustración compara las tareas de un programador de tareas con las de un camarero en un restaurante. Si puede relacionarlo con un caso en el que tuvo que esperar un rato en una cola para entrar en un restaurante popular, entonces ahora puede entender por qué a veces su trabajo no se inicia instantáneamente como en su ordenador portátil.
El planificador utilizado en esta lección es Slurm. Aunque Slurm no se utiliza en todas partes, la ejecución de trabajos es bastante similar independientemente del software que se utilice. La sintaxis exacta puede cambiar, pero los conceptos siguen siendo los mismos.
Ejecución de un trabajo por lotes
El uso más básico del planificador es ejecutar un comando de forma no interactiva. Cualquier comando (o serie de comandos) que desee ejecutar en el cluster se denomina job, y el proceso de utilizar un planificador para ejecutar el trabajo se denomina sometimiento de trabajo por lotes.
En este caso, el trabajo que queremos ejecutar es un script de shell – esencialmente un archivo de texto que contiene una lista de comandos UNIX para ser ejecutados de manera secuencial. Nuestro script de shell tendrá tres partes:
- En la primera línea, añada
#!/bin/bash
. El#!
(pronunciado “hash-bang” o “shebang”) indica al ordenador qué programa debe procesar el contenido de este fichero. En este caso, le estamos diciendo que los comandos que siguen están escritos para la shell de línea de comandos (en la que hemos estado haciendo todo hasta ahora). - En cualquier lugar debajo de la primera línea, añadiremos un comando
echo
con un saludo amistoso. Cuando se ejecute, el script de shell imprimirá lo que venga después deecho
en el terminal.-
echo -n
imprimirá todo lo que sigue, sin terminar la línea imprimiendo el carácter de nueva línea.
-
- En la última línea, invocaremos el comando
hostname
, que imprimirá el nombre de la máquina en la que se ejecuta el script.
Creación de nuestro trabajo de prueba
Ejecuta el script. ¿Se ejecuta en el clúster o sólo en nuestro nodo de inicio de sesión?
Este script se ejecutó en el nodo de inicio de sesión, pero queremos
aprovechar los nodos de computación: necesitamos que el planificador
ponga en cola example-job.sh
para ejecutarse en un nodo de
computación.
Para enviar esta tarea al planificador, usamos el comando
sbatch
. Esto crea un job que ejecutará el
script cuando sea despachado a un nodo de computación
que el sistema de colas haya identificado como disponible para realizar
el trabajo.
SALIDA
Submitted batch job 7
Y eso es todo lo que tenemos que hacer para enviar un trabajo.
Nuestro trabajo está hecho – ahora el programador toma el relevo e
intenta ejecutar el trabajo por nosotros. Mientras el trabajo espera a
ejecutarse, entra en una lista de trabajos llamada cola. Para
comprobar el estado de nuestro trabajo, comprobamos la cola utilizando
el comando squeue -u yourUsername
.
SALIDA
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
9 cpubase_b example- user01 R 0:05 1 node1
Podemos ver todos los detalles de nuestro trabajo, lo más importante
es que está en el estado R
o RUNNING
. A veces
nuestros trabajos pueden necesitar esperar en una cola
(PENDING
) o tener un error (E
).
¿Dónde está la salida?
En el nodo de inicio de sesión, este script imprimió la salida en el
terminal – pero ahora, cuando squeue
muestra que el trabajo
ha finalizado, no se imprimió nada en el terminal.
La salida del trabajo de cluster se redirige normalmente a un archivo
en el directorio desde el que se lanzó. Utilice ls
para
buscar y cat
para leer el archivo.
Personalización de un trabajo
El trabajo que acabamos de ejecutar utilizaba todas las opciones por defecto del planificador. En un escenario del mundo real, eso no es probablemente lo que queremos. Las opciones por defecto representan un mínimo razonable. Lo más probable es que necesitemos más núcleos, más memoria, más tiempo, entre otras consideraciones especiales. Para tener acceso a estos recursos debemos personalizar nuestro script de trabajo.
Los comentarios en los scripts de shell UNIX (denotados por
#
) son normalmente ignorados, pero hay excepciones. Por
ejemplo, el comentario especial #!
al principio de los
scripts especifica qué programa debe usarse para ejecutarlo (normalmente
verá #!/usr/bin/env bash
). Los programadores como Slurm
también tienen un comentario especial que se utiliza para indicar
opciones específicas del programador. Aunque estos comentarios difieren
de un programador a otro, el comentario especial de Slurm es
#SBATCH
. Todo lo que sigue al comentario
#SBATCH
se interpreta como una instrucción para el
programador.
Vamos a ilustrarlo con un ejemplo. Por defecto, el nombre de un
trabajo es el nombre del script, pero se puede utilizar la opción
-J
para cambiar el nombre de un trabajo. Añade una opción
al script:
Envía el trabajo y supervisa su estado:
SALIDA
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
10 cpubase_b hello-wo user01 R 0:02 1 node1
¡Fantástico, hemos cambiado con éxito el nombre de nuestro trabajo!
Solicitudes de recursos
¿Qué pasa con los cambios más importantes, como el número de núcleos y memoria para nuestros trabajos? Una cosa que es absolutamente crítica cuando se trabaja en un sistema HPC es especificar los recursos necesarios para ejecutar un trabajo. Esto permite al programador encontrar el momento y el lugar adecuados para programar nuestro trabajo. Si no especifica los requisitos (como la cantidad de tiempo que necesita), es probable que se quede con los recursos predeterminados de su sitio, que probablemente no es lo que desea.
A continuación se muestran varias solicitudes de recursos clave:
--ntasks=<ntasks>
o-n <ntasks>
: ¿Cuántos núcleos de CPU necesita su trabajo, en total?--time <days-hours:minutes:seconds>
o-t <days-hours:minutes:seconds>
: ¿Cuánto tiempo real (walltime) tardará en ejecutarse tu tarea? La parte<days>
puede omitirse.--mem=<megabytes>
: ¿Cuánta memoria en un nodo necesita su trabajo en megabytes? También puede especificar gigabytes añadiendo una pequeña “g” después (ejemplo:--mem=5g
)--nodes=<nnodes>
o-N <nnodes>
: ¿En cuántas máquinas distintas debe ejecutarse su trabajo? Tenga en cuenta que si establecentasks
en un número superior al que puede ofrecer una máquina, Slurm establecerá este valor automáticamente.
Tenga en cuenta que el simple hecho de solicitar estos recursos no hace que su trabajo se ejecute más rápido, ni significa necesariamente que vaya a consumir todos estos recursos. Sólo significa que se ponen a su disposición. Tu trabajo puede terminar usando menos memoria, o menos tiempo, o menos nodos de los que has solicitado, y aún así se ejecutará.
Lo mejor es que tus solicitudes reflejen fielmente los requisitos de tu trabajo. Hablaremos más acerca de cómo asegurarse de que está utilizando los recursos de manera efectiva en un episodio posterior de esta lección.
Envío de solicitudes de recursos
Modifique nuestro script hostname
para que se ejecute
durante un minuto y, a continuación, envíe un trabajo para él en el
clúster.
Las solicitudes de recursos suelen ser vinculantes. Si las excedes, tu trabajo será eliminado. Usemos el tiempo de muro como ejemplo. Solicitaremos 1 minuto de tiempo de muro, e intentaremos ejecutar un trabajo durante dos minutos.
BASH
#!/bin/bash
#SBATCH -J long_job
#SBATCH -t 00:01 # timeout in HH:MM
echo "This script is running on ... "
sleep 240 # time in seconds
hostname
Envía el trabajo y espera a que termine. Una vez que haya terminado, compruebe el archivo de registro.
SALIDA
This script is running on ...
slurmstepd: error: *** JOB 12 ON node1 CANCELLED AT 2021-02-19T13:55:57
DUE TO TIME LIMIT ***
Nuestro trabajo ha sido cancelado por exceder la cantidad de recursos solicitados. Aunque esto parece duro, en realidad es una característica. El cumplimiento estricto de las solicitudes de recursos permite al planificador encontrar el mejor lugar posible para sus trabajos. Aún más importante, asegura que otro usuario no pueda usar más recursos de los que se le han dado. Si otro usuario mete la pata y accidentalmente intenta utilizar todos los núcleos o la memoria de un nodo, Slurm restringirá su trabajo a los recursos solicitados o matará el trabajo directamente. Otros trabajos en el nodo no se verán afectados. Esto significa que un usuario no puede estropear la experiencia de los demás, los únicos trabajos afectados por un error en la programación serán los suyos propios.
Cancelación de un trabajo
A veces cometeremos un error y necesitaremos cancelar un trabajo.
Esto se puede hacer con el comando scancel
. Vamos a enviar
un trabajo y luego cancelarlo usando su número de trabajo (¡recuerda
cambiar el tiempo de ejecución para que se ejecute el tiempo suficiente
para que puedas cancelarlo antes de que se mate!)
SALIDA
Submitted batch job 13
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
13 cpubase_b long_job user01 R 0:02 1 node1
Ahora cancele el trabajo con su número de trabajo (impreso en su terminal). Un retorno limpio de su símbolo del sistema indica que la solicitud de cancelación del trabajo se ha realizado correctamente.
BASH
[yourUsername@login1 ~] scancel 38759
# It might take a minute for the job to disappear from the queue...
[yourUsername@login1 ~] squeue -u yourUsername
SALIDA
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
Cancelación de múltiples trabajos
También podemos cancelar todos nuestros trabajos a la vez utilizando
la opción -u
. Esto borrará todos los trabajos de un usuario
específico (en este caso, usted mismo). Tenga en cuenta que sólo puede
eliminar sus propios trabajos.
Pruebe a enviar varios trabajos y luego cancélelos todos.
Otros tipos de trabajos
Hasta ahora, nos hemos centrado en la ejecución de tareas por lotes.
Slurm
también ofrece la posibilidad de iniciar una sesión
interactiva.
Con mucha frecuencia hay tareas que deben realizarse de forma
interactiva. Crear un script de trabajo completo puede ser excesivo,
pero la cantidad de recursos requeridos es demasiado para que un nodo de
inicio de sesión pueda manejarlo. Un buen ejemplo de esto podría ser la
construcción de un índice del genoma para la alineación con una
herramienta como HISAT2.
Afortunadamente, podemos ejecutar este tipo de tareas de una sola vez
con srun
.
srun
ejecuta un único comando en el cluster y luego se
cierra. Demostremos esto ejecutando el comando hostname
con
srun
. (Podemos cancelar un trabajo srun
con
Ctrl-c
)
SALIDA
smnode1
srun
acepta las mismas opciones que sbatch
.
Sin embargo, en lugar de especificarlas en un script, estas opciones se
especifican en la línea de comandos al iniciar un trabajo. Para enviar
un trabajo que utilice 2 CPUs, por ejemplo, podríamos utilizar el
siguiente comando:
SALIDA
This job will use 2 CPUs.
This job will use 2 CPUs.
Normalmente, el entorno de shell resultante será el mismo que el de
sbatch
.
Trabajos interactivos
A veces, necesitaremos muchos recursos para un uso interactivo.
Quizás es la primera vez que ejecutamos un análisis o estamos intentando
depurar algo que salió mal en un trabajo anterior. Afortunadamente,
Slurm facilita el inicio de un trabajo interactivo con
srun
:
Aparecerá un prompt bash. Tenga en cuenta que el prompt probablemente
cambiará para reflejar su nueva ubicación, en este caso el nodo de
computación en el que estamos conectados. También puedes verificarlo con
hostname
.
Creación de gráficos remotos
Para ver la salida gráfica dentro de tus trabajos, necesitas usar X11
forwarding. Para conectarse con esta característica activada, utilice la
opción -Y
cuando se conecte con el comando
ssh
, por ejemplo,
ssh -Y yourUsername@cluster.hpc-carpentry.org
.
Para demostrar lo que ocurre cuando creas una ventana gráfica en el
nodo remoto, utiliza el comando xeyes
. Debería aparecer un
par de ojos relativamente adorables (pulse Ctrl-C
para
parar). Si utiliza un Mac, debe haber instalado XQuartz (y reiniciado su
ordenador) para que esto funcione.
Si su cluster tiene instalado el plugin slurm-spank-x11,
puede asegurar el reenvío X11 dentro de los trabajos interactivos
utilizando la opción --x11
para srun
con el
comando srun --x11 --pty bash
.
Cuando haya terminado con el trabajo interactivo, escriba
exit
para salir de la sesión.
Puntos Clave
- El planificador gestiona cómo se comparten los recursos informáticos entre los usuarios.
- Un trabajo no es más que un script de shell.
- Solicita ligeramente más recursos de los que necesitará.
Content from Variables de entorno
Última actualización: 2025-08-04 | Mejora esta página
Hoja de ruta
Preguntas
- ¿Cómo se establecen y acceden a las variables en el intérprete de comandos Unix?
- ¿Cómo puedo utilizar variables para cambiar la forma en que se ejecuta un programa?
Objetivos
- Comprender cómo se implementan las variables en el shell
- Leer el valor de una variable existente
- Crear nuevas variables y cambiar sus valores
- Cambiar el comportamiento de un programa mediante una variable de entorno
- Explica cómo el shell utiliza la variable
PATH
para buscar ejecutables
Procedencia del episodio
Este episodio ha sido remezclado del episodio Shell Extras sobre Variables del Shell y del episodio HPC Shell sobre scripts.
El shell es sólo un programa, y como otros programas, tiene variables. Esas variables controlan su ejecución, de modo que cambiando sus valores puedes cambiar cómo se comporta el shell (y con un poco más de esfuerzo cómo se comportan otros programas).
Las variables son una buena forma de guardar información bajo un nombre al que puedas acceder más tarde. En lenguajes de programación como Python y R, las variables pueden almacenar prácticamente cualquier cosa que se te ocurra. En el shell, normalmente sólo almacenan texto. La mejor manera de entender cómo funcionan es verlas en acción.
Empecemos ejecutando el comando set
y observando algunas
de las variables en una sesión típica de shell:
SALIDA
COMPUTERNAME=TURING
HOME=/home/vlad
HOSTNAME=TURING
HOSTTYPE=i686
NUMBER_OF_PROCESSORS=4
PATH=/Users/vlad/bin:/usr/local/git/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
PWD=/home/vlad
UID=1000
USERNAME=vlad
...
Como puedes ver, hay bastantes - de hecho, cuatro o cinco veces más
de las que se muestran aquí. Y sí, usar set
para
mostrar cosas puede parecer un poco extraño, incluso para Unix,
pero si no le das ningún argumento, bien podría mostrarte cosas que
podrías configurar.
Cada variable tiene un nombre. Todos los valores de las variables del
shell son cadenas, incluso aquellas (como UID
) que parecen
números. Depende de los programas convertir estas cadenas a otros tipos
cuando sea necesario. Por ejemplo, si un programa quisiera averiguar
cuántos procesadores tiene el ordenador, convertiría el valor de la
variable NUMBER_OF_PROCESSORS
de una cadena a un número
entero.
Mostrar el valor de una variable
Mostremos el valor de la variable HOME
:
SALIDA
HOME
Esto sólo imprime “HOME”, que no es lo que queríamos (aunque es lo que pedimos). Intentemos esto en su lugar:
SALIDA
/home/vlad
El signo de dólar indica al shell que queremos el valor de
la variable en lugar de su nombre. Esto funciona igual que los
comodines: el shell realiza la sustitución antes de ejecutar el
programa que le hemos pedido. Gracias a esta expansión, lo que realmente
ejecutamos es echo /home/vlad
, que muestra lo correcto.
Creación y modificación de variables
Crear una variable es fácil - simplemente asignamos un valor a un
nombre usando “=” (¡sólo tenemos que recordar que la sintaxis requiere
que no haya espacios alrededor de =
!)
SALIDA
Dracula
Para cambiar el valor, basta con asignar uno nuevo:
SALIDA
Camilla
Variables de entorno
Cuando ejecutamos el comando set
vimos que había muchas
variables cuyos nombres estaban en mayúsculas. Esto es porque, por
convención, las variables que también están disponibles para ser usadas
por otros programas reciben nombres en mayúsculas. Tales
variables se llaman variables de entorno ya que son variables
del shell que se definen para el shell actual y son heredadas por
cualquier shell o proceso hijo.
Para crear una variable de entorno necesitas export
una
variable del shell. Por ejemplo, para hacer que nuestra
SECRET_IDENTITY
esté disponible para otros programas que
llamemos desde nuestra shell podemos hacer:
También puede crear y exportar la variable en un solo paso:
Uso de variables de entorno para cambiar el comportamiento del programa
Establece una variable de shell TIME_STYLE
para que
tenga un valor de iso
y comprueba este valor usando el
comando echo
.
Ahora, ejecuta el comando ls
con la opción
-l
(que da un formato largo).
export
la variable y vuelve a ejecutar el comando
ls -l
. ¿Notas alguna diferencia?
La variable TIME_STYLE
no es vista por
ls
hasta que es exportada, momento en el cual es utilizada
por ls
para decidir qué formato de fecha utilizar al
presentar la marca de tiempo de los ficheros.
Puedes ver el conjunto completo de variables de entorno en tu sesión
de shell actual con el comando env
(que devuelve un
subconjunto de lo que nos dio el comando set
). El
conjunto completo de variables de entorno se denomina entorno de
ejecución y puede afectar al comportamiento de los programas que
ejecutas.
Variables de entorno de trabajo
Cuando Slurm
ejecuta un trabajo, establece una serie de
variables de entorno para el trabajo. Una de ellas nos permitirá
comprobar desde qué directorio se envió nuestro script de trabajo. La
variable SLURM_SUBMIT_DIR
se establece en el directorio
desde el que se envió nuestro trabajo. Usando la variable
SLURM_SUBMIT_DIR
, modifica tu tarea para que imprima la
ubicación desde la que se envió la tarea.
Para eliminar una variable o variable de entorno puede utilizar el
comando unset
, por ejemplo:
Variable de entorno PATH
Del mismo modo, algunas variables de entorno (como PATH
)
almacenan listas de valores. En este caso, la convención es utilizar dos
puntos ‘:’ como separador. Si un programa quiere los elementos
individuales de una lista de este tipo, es responsabilidad del programa
dividir el valor de la cadena de la variable en trozos.
Echemos un vistazo más de cerca a la variable PATH
. Su
valor define la ruta de búsqueda de ejecutables del intérprete de
comandos, es decir, la lista de directorios en los que el intérprete de
comandos busca programas ejecutables cuando se escribe el nombre de un
programa sin especificar en qué directorio se encuentra.
Por ejemplo, cuando escribimos un comando como analyze
,
el intérprete de órdenes tiene que decidir si ejecuta
./analyze
o /bin/analyze
. La regla que utiliza
es simple: el intérprete de comandos comprueba cada directorio de la
variable PATH
por turnos, buscando un programa con el
nombre solicitado en ese directorio. En cuanto encuentra una
coincidencia, deja de buscar y ejecuta el programa.
Para mostrar cómo funciona, aquí están los componentes de
PATH
listados uno por línea:
SALIDA
/Users/vlad/bin
/usr/local/git/bin
/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin
En nuestro ordenador, en realidad hay tres programas llamados
analyze
en tres directorios diferentes:
/bin/analyze
, /usr/local/bin/analyze
, y
/users/vlad/analyze
. Como el shell busca en los directorios
en el orden en que están listados en PATH
, encuentra
/bin/analyze
primero y lo ejecuta. Observa que
nunca encontrará el programa /users/vlad/analyze
a
menos que introduzcamos la ruta completa al programa, ya que el
directorio /users/vlad
no está en PATH
.
Esto significa que puedo tener ejecutables en un montón de lugares
diferentes, siempre y cuando recuerde que tengo que actualizar mi
PATH
para que mi shell pueda encontrarlos.
¿Qué pasa si quiero ejecutar dos versiones diferentes del mismo
programa? Como comparten el mismo nombre, si añado ambos a mi
PATH
el primero que encuentre siempre ganará. En el próximo
episodio aprenderemos a utilizar herramientas de ayuda para gestionar
nuestro entorno de ejecución y hacer que esto sea posible sin tener que
hacer un montón de contabilidad sobre cuál es o debería ser el valor de
PATH
(y otras variables de entorno importantes).
Puntos Clave
- Las variables del intérprete de órdenes se tratan por defecto como cadenas de caracteres
- Las variables se asignan utilizando “
=
” y se recuperan utilizando el nombre de la variable precedido por “$
” - Utilice “
export
” para poner una variable a disposición de otros programas - La variable
PATH
define la ruta de búsqueda de la shell
Content from Acceso al software a través de módulos
Última actualización: 2025-08-04 | Mejora esta página
Hoja de ruta
Preguntas
- ¿Cómo se cargan y descargan los paquetes de software?
Objetivos
- Carga y utiliza un paquete de software.
- Explique cómo cambia el entorno del intérprete de órdenes cuando el mecanismo de módulos carga o descarga paquetes.
En un sistema informático de alto rendimiento, rara vez ocurre que el software que queremos utilizar esté disponible cuando nos conectamos. Está instalado, pero tendremos que “cargarlo” antes de que pueda ejecutarse.
Sin embargo, antes de empezar a utilizar paquetes de software individuales, deberíamos entender el razonamiento que hay detrás de este enfoque. Los tres factores más importantes son:
- incompatibilidades de software
- versionado
- dependencias
La incompatibilidad de software es un gran dolor de cabeza para los
programadores. A veces la presencia (o ausencia) de un paquete de
software rompe otros que dependen de él. Dos ejemplos bien conocidos son
las versiones de Python y del compilador de C. Python 3 proporciona un
comando python
que entra en conflicto con el que
proporciona Python 2. El software compilado con una versión más reciente
de las librerías C y ejecutado en una máquina que tiene instaladas
librerías C más antiguas producirá un desagradable error
'GLIBCXX_3.4.20' not found
.
El versionado de software es otro problema común. Un equipo puede depender de una determinada versión de un paquete para su proyecto de investigación - si la versión del software cambiara (por ejemplo, si se actualizara un paquete), podría afectar a sus resultados. Tener acceso a varias versiones de software permite a un conjunto de investigadores evitar que los problemas de versiones de software afecten a sus resultados.
Las dependencias se dan cuando un paquete de software concreto (o incluso una versión concreta) depende de tener acceso a otro paquete de software (o incluso a una versión concreta de otro paquete de software). Por ejemplo, el software de ciencia de materiales VASP puede depender de tener disponible una versión concreta de la biblioteca de software FFTW (Fastest Fourier Transform in the West) para funcionar.
Módulos de entorno
Los módulos de entorno son la solución a estos problemas. Un módulo es una descripción autocontenida de un paquete de software – contiene las configuraciones necesarias para ejecutar un paquete de software y, normalmente, codifica las dependencias necesarias de otros paquetes de software.
Hay un número de implementaciones de módulos de entorno diferentes
comúnmente usadas en sistemas HPC: los dos más comunes son TCL
modules y Lmod. Ambos usan una sintaxis similar y los
conceptos son los mismos, por lo que aprender a usar uno te permitirá
usar el que esté instalado en el sistema que estés usando. En ambas
implementaciones se utiliza el comando module
para
interactuar con los módulos de entorno. Normalmente se añade un
subcomando adicional al comando para especificar lo que se quiere hacer.
Para obtener una lista de subcomandos puede utilizar
module -h
o module help
. Como para todos los
comandos, puede acceder a la ayuda completa en las páginas man
con man module
.
Al iniciar la sesión puede que empiece con un conjunto de módulos cargados por defecto o puede que empiece con un entorno vacío; esto depende de la configuración del sistema que esté utilizando.
Listado de módulos disponibles
Para ver los módulos de software disponibles, utilice
module avail
:
SALIDA
~~~ /cvmfs/pilot.eessi-hpc.org/2020.12/software/x86_64/amd/zen2/modules/all ~~~
Bazel/3.6.0-GCCcore-x.y.z NSS/3.51-GCCcore-x.y.z
Bison/3.5.3-GCCcore-x.y.z Ninja/1.10.0-GCCcore-x.y.z
Boost/1.72.0-gompi-2020a OSU-Micro-Benchmarks/5.6.3-gompi-2020a
CGAL/4.14.3-gompi-2020a-Python-3.x.y OpenBLAS/0.3.9-GCC-x.y.z
CMake/3.16.4-GCCcore-x.y.z OpenFOAM/v2006-foss-2020a
[removed most of the output here for clarity]
Where:
L: Module is loaded
Aliases: Aliases exist: foo/1.2.3 (1.2) means that "module load foo/1.2"
will load foo/1.2.3
D: Default Module
Use "module spider" to find all possible modules and extensions.
Use "module keyword key1 key2 ..." to search for all possible modules matching
any of the "keys".
Carga y descarga de software
Para cargar un módulo de software, utilice module load
.
En este ejemplo utilizaremos Python 3.
Inicialmente, Python 3 no está cargado. Podemos comprobarlo usando el
comando which
. which
busca programas de la
misma forma que lo hace Bash, así que podemos usarlo para que nos diga
dónde está almacenado un software en particular.
Si el comando python3
no estuviera disponible, veríamos
una salida como
SALIDA
/usr/bin/which: no python3 in (/cvmfs/pilot.eessi-hpc.org/2020.12/compat/linux/x86_64/usr/bin:/opt/software/slurm/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/opt/puppetlabs/bin:/home/yourUsername/.local/bin:/home/yourUsername/bin)
Observe que este muro de texto es en realidad una lista, con valores
separados por el carácter :
. La salida nos está diciendo
que el comando which
buscó python3
en los
siguientes directorios, sin éxito:
SALIDA
/cvmfs/pilot.eessi-hpc.org/2020.12/compat/linux/x86_64/usr/bin
/opt/software/slurm/bin
/usr/local/bin
/usr/bin
/usr/local/sbin
/usr/sbin
/opt/puppetlabs/bin
/home/yourUsername/.local/bin
/home/yourUsername/bin
Sin embargo, en nuestro caso tenemos una python3
existente disponible, así que vemos
SALIDA
/cvmfs/pilot.eessi-hpc.org/2020.12/compat/linux/x86_64/usr/bin/python3
Sin embargo, necesitamos un Python diferente al proporcionado por el sistema, así que carguemos un módulo para acceder a él.
Podemos cargar el comando python3
con
module load
:
SALIDA
/cvmfs/pilot.eessi-hpc.org/2020.12/software/x86_64/amd/zen2/software/Python/3.x.y-GCCcore-x.y.z/bin/python3
¿Qué acaba de ocurrir?
Para entender la salida, primero necesitamos entender la naturaleza
de la variable de entorno $PATH
.$PATH
es una
variable de entorno especial que controla dónde busca software un
sistema UNIX. Específicamente $PATH
es una lista de
directorios (separados por :
) en los que el sistema
operativo busca un comando antes de rendirse y decirnos que no puede
encontrarlo. Como con todas las variables de entorno podemos imprimirla
usando echo
.
SALIDA
/cvmfs/pilot.eessi-hpc.org/2020.12/software/x86_64/amd/zen2/software/Python/3.x.y-GCCcore-x.y.z/bin:/cvmfs/pilot.eessi-hpc.org/2020.12/software/x86_64/amd/zen2/software/SQLite/3.31.1-GCCcore-x.y.z/bin:/cvmfs/pilot.eessi-hpc.org/2020.12/software/x86_64/amd/zen2/software/Tcl/8.6.10-GCCcore-x.y.z/bin:/cvmfs/pilot.eessi-hpc.org/2020.12/software/x86_64/amd/zen2/software/GCCcore/x.y.z/bin:/cvmfs/pilot.eessi-hpc.org/2020.12/compat/linux/x86_64/usr/bin:/opt/software/slurm/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/opt/puppetlabs/bin:/home/user01/.local/bin:/home/user01/bin
Notará una similitud con la salida del comando which
. En
este caso, sólo hay una diferencia: el directorio diferente al
principio. Cuando ejecutamos el comando module load
, se
añadió un directorio al principio de nuestro $PATH
.
Examinemos lo que hay allí:
BASH
[yourUsername@login1 ~] ls /cvmfs/pilot.eessi-hpc.org/2020.12/software/x86_64/amd/zen2/software/Python/3.x.y-GCCcore-x.y.z/bin
SALIDA
2to3 nosetests-3.8 python rst2s5.py
2to3-3.8 pasteurize python3 rst2xetex.py
chardetect pbr python3.8 rst2xml.py
cygdb pip python3.8-config rstpep2html.py
cython pip3 python3-config runxlrd.py
cythonize pip3.8 rst2html4.py sphinx-apidoc
easy_install pybabel rst2html5.py sphinx-autogen
easy_install-3.8 __pycache__ rst2html.py sphinx-build
futurize pydoc3 rst2latex.py sphinx-quickstart
idle3 pydoc3.8 rst2man.py tabulate
idle3.8 pygmentize rst2odt_prepstyles.py virtualenv
netaddr pytest rst2odt.py wheel
nosetests py.test rst2pseudoxml.py
Llevando esto a su conclusión, module load
añadirá
software a su $PATH
. Carga” software. Una nota especial
sobre esto - dependiendo de la versión del programa module
que esté instalado en su sitio, module load
también cargará
las dependencias de software necesarias.
Para demostrarlo, utilicemos
module list
.module list
muestra todos los
módulos de software cargados.
SALIDA
Currently Loaded Modules:
1) GCCcore/x.y.z 4) GMP/6.2.0-GCCcore-x.y.z
2) Tcl/8.6.10-GCCcore-x.y.z 5) libffi/3.3-GCCcore-x.y.z
3) SQLite/3.31.1-GCCcore-x.y.z 6) Python/3.x.y-GCCcore-x.y.z
SALIDA
Currently Loaded Modules:
1) GCCcore/x.y.z 14) libfabric/1.11.0-GCCcore-x.y.z
2) Tcl/8.6.10-GCCcore-x.y.z 15) PMIx/3.1.5-GCCcore-x.y.z
3) SQLite/3.31.1-GCCcore-x.y.z 16) OpenMPI/4.0.3-GCC-x.y.z
4) GMP/6.2.0-GCCcore-x.y.z 17) OpenBLAS/0.3.9-GCC-x.y.z
5) libffi/3.3-GCCcore-x.y.z 18) gompi/2020a
6) Python/3.x.y-GCCcore-x.y.z 19) FFTW/3.3.8-gompi-2020a
7) GCC/x.y.z 20) ScaLAPACK/2.1.0-gompi-2020a
8) numactl/2.0.13-GCCcore-x.y.z 21) foss/2020a
9) libxml2/2.9.10-GCCcore-x.y.z 22) pybind11/2.4.3-GCCcore-x.y.z-Pytho...
10) libpciaccess/0.16-GCCcore-x.y.z 23) SciPy-bundle/2020.03-foss-2020a-Py...
11) hwloc/2.2.0-GCCcore-x.y.z 24) networkx/2.4-foss-2020a-Python-3.8...
12) libevent/2.1.11-GCCcore-x.y.z 25) GROMACS/2020.1-foss-2020a-Python-3...
13) UCX/1.8.0-GCCcore-x.y.z
En este caso, al cargar el módulo GROMACS
(un paquete de
software bioinformático), también se han cargado
GMP/6.2.0-GCCcore-x.y.z
y
SciPy-bundle/2020.03-foss-2020a-Python-3.x.y
. Intentemos
descargar el paquete GROMACS
.
SALIDA
Currently Loaded Modules:
1) GCCcore/x.y.z 13) UCX/1.8.0-GCCcore-x.y.z
2) Tcl/8.6.10-GCCcore-x.y.z 14) libfabric/1.11.0-GCCcore-x.y.z
3) SQLite/3.31.1-GCCcore-x.y.z 15) PMIx/3.1.5-GCCcore-x.y.z
4) GMP/6.2.0-GCCcore-x.y.z 16) OpenMPI/4.0.3-GCC-x.y.z
5) libffi/3.3-GCCcore-x.y.z 17) OpenBLAS/0.3.9-GCC-x.y.z
6) Python/3.x.y-GCCcore-x.y.z 18) gompi/2020a
7) GCC/x.y.z 19) FFTW/3.3.8-gompi-2020a
8) numactl/2.0.13-GCCcore-x.y.z 20) ScaLAPACK/2.1.0-gompi-2020a
9) libxml2/2.9.10-GCCcore-x.y.z 21) foss/2020a
10) libpciaccess/0.16-GCCcore-x.y.z 22) pybind11/2.4.3-GCCcore-x.y.z-Pytho...
11) hwloc/2.2.0-GCCcore-x.y.z 23) SciPy-bundle/2020.03-foss-2020a-Py...
12) libevent/2.1.11-GCCcore-x.y.z 24) networkx/2.4-foss-2020a-Python-3.x.y
Así que usar module unload
“descarga” un módulo, y
dependiendo de cómo esté configurado un sitio puede que también
descargue todas las dependencias (en nuestro caso no lo hace). Si
quisiéramos descargar todo a la vez, podríamos ejecutar
module purge
(descarga todo).
SALIDA
No modules loaded
Tenga en cuenta que module purge
es informativa. También
nos permitirá saber si un conjunto predeterminado de paquetes
“pegajosos” no puede ser descargado (y cómo descargarlos si realmente lo
deseamos).
Tenga en cuenta que este proceso de carga de módulos se produce
principalmente a través de la manipulación de variables de entorno como
$PATH
. Normalmente hay poca o ninguna transferencia de
datos implicada.
El proceso de carga de módulos manipula también otras variables de entorno especiales, incluyendo variables que influyen en dónde busca el sistema las bibliotecas de software, y a veces variables que indican a los paquetes de software comercial dónde encontrar los servidores de licencias.
El comando module también restaura estas variables de entorno del shell a su estado anterior cuando se descarga un módulo.
Versiones de software
Hasta ahora, hemos aprendido cómo cargar y descargar paquetes de software. Esto es muy útil. Sin embargo, aún no hemos abordado la cuestión del versionado de software. En un momento u otro, te encontrarás con problemas en los que sólo una versión concreta de algún software será adecuada. Puede que un error clave sólo se haya corregido en una versión determinada, o que la versión X haya roto la compatibilidad con un formato de archivo que utilizas. En cualquiera de estos casos, ayuda ser muy específico sobre el software que se carga.
Examinemos la salida de module avail
más de cerca.
SALIDA
~~~ /cvmfs/pilot.eessi-hpc.org/2020.12/software/x86_64/amd/zen2/modules/all ~~~
Bazel/3.6.0-GCCcore-x.y.z NSS/3.51-GCCcore-x.y.z
Bison/3.5.3-GCCcore-x.y.z Ninja/1.10.0-GCCcore-x.y.z
Boost/1.72.0-gompi-2020a OSU-Micro-Benchmarks/5.6.3-gompi-2020a
CGAL/4.14.3-gompi-2020a-Python-3.x.y OpenBLAS/0.3.9-GCC-x.y.z
CMake/3.16.4-GCCcore-x.y.z OpenFOAM/v2006-foss-2020a
[removed most of the output here for clarity]
Where:
L: Module is loaded
Aliases: Aliases exist: foo/1.2.3 (1.2) means that "module load foo/1.2"
will load foo/1.2.3
D: Default Module
Use "module spider" to find all possible modules and extensions.
Use "module keyword key1 key2 ..." to search for all possible modules matching
any of the "keys".
Uso de módulos de software en scripts
Crea un trabajo capaz de ejecutar python3 --version
.
Recuerde, ¡no se carga ningún software por defecto! Ejecutar un trabajo
es como iniciar sesión en el sistema (no debe asumir que un módulo
cargado en el nodo de inicio de sesión está cargado en un nodo de
computación).
Puntos Clave
- Cargar software con
module load softwareName
. - Descargar software con
module unload
- El sistema de módulos gestiona automáticamente las versiones de software y los conflictos entre paquetes.
Content from Transferencia de archivos con ordenadores remotos
Última actualización: 2025-08-04 | Mejora esta página
Hoja de ruta
Preguntas
- ¿Cómo transfiero archivos a (y desde) el cluster?
Objetivos
- Transfiere archivos hacia y desde un clúster informático.
Realizar trabajo en un ordenador remoto no es muy útil si no podemos obtener ficheros hacia o desde el cluster. Existen varias opciones para transferir datos entre recursos informáticos utilizando utilidades CLI y GUI, algunas de las cuales veremos a continuación.
Descargar archivos de lecciones de Internet
Una de las formas más sencillas de descargar archivos es utilizar
curl
o wget
. Uno de ellos suele estar
instalado en la mayoría de los shells de Linux, en el terminal de Mac OS
y en GitBash. Cualquier archivo que pueda descargarse en su navegador
web a través de un enlace directo puede descargarse utilizando
curl
o wget
. Esta es una forma rápida de
descargar conjuntos de datos o código fuente. La sintaxis de estos
comandos es
wget [-O new_name] https://some/link/to/a/file
curl [-o new_name] https://some/link/to/a/file
Pruébalo descargando algún material que usaremos más adelante, desde un terminal en tu máquina local, usando la URL de la base de código actual:
https://github.com/hpc-carpentry/amdahl/tarball/main
Descarga el “Tarball”
La palabra “tarball” en la URL anterior se refiere a un formato de
archivo comprimido comúnmente utilizado en Linux, que es el sistema
operativo que ejecutan la mayoría de las máquinas de clúster HPC. Un
tarball es muy parecido a un archivo .zip
. La extensión
real del archivo es .tar.gz
, que refleja el proceso en dos
etapas utilizado para crearlo: los archivos o carpetas se fusionan en un
único archivo utilizando tar
, que luego se comprime
utilizando gzip
, por lo que la extensión del archivo es
“tar-dot-g-z” Es un trabalenguas, así que la gente suele decir “el
tarball xyz” en su lugar.
También puede ver la extensión .tgz
, que no es más que
una abreviatura de .tar.gz
.
Por defecto, curl
y wget
descargan los
archivos con el mismo nombre que la URL: en este caso,
main
. Utilice uno de los comandos anteriores para guardar
el tarball como amdahl.tar.gz
.
Después de descargar el archivo, utilice ls
para verlo
en su directorio de trabajo:
Archivar ficheros
Uno de los mayores retos a los que nos enfrentamos a menudo cuando transferimos datos entre sistemas HPC remotos es el de un gran número de archivos. Hay una sobrecarga en la transferencia de cada archivo individual y cuando estamos transfiriendo un gran número de archivos estas sobrecargas se combinan para ralentizar nuestras transferencias en gran medida.
La solución a este problema es archivar múltiples ficheros
en números más pequeños de ficheros más grandes antes de transferir los
datos para mejorar nuestra eficiencia de transferencia. A veces
combinaremos el archivado con la compresión para reducir la
cantidad de datos que tenemos que transferir y así acelerar la
transferencia. El comando de archivado más común en un cluster HPC
(Linux) es tar
.
tar
puede utilizarse para combinar ficheros y carpetas
en un único fichero de archivo y, opcionalmente, comprimir el resultado.
Veamos el archivo que descargamos del sitio de la lección,
amdahl.tar.gz
.
La parte .gz
significa gzip, que es una
biblioteca de compresión. Es común (¡pero no necesario!) que este tipo
de archivo pueda interpretarse leyendo su nombre: parece que alguien
tomó archivos y carpetas relacionados con algo llamado “amdahl”, los
envolvió todos en un único archivo con tar
, y luego
comprimió ese archivo con gzip
para ahorrar espacio.
Veamos si es el caso, sin descomprimir el archivo.
tar
imprime el “table de contenidos” con
la bandera -t
, para el fichero especificado con la bandera
-f
seguido del nombre del fichero. Tenga en cuenta que
puede concatenar las dos banderas: escribir -t -f
es
intercambiable con escribir -tf
juntas. Sin embargo, el
argumento que sigue a -f
debe ser un nombre de fichero, por
lo que escribir -ft
no funcionará.
BASH
[you@laptop:~]$ tar -tf amdahl.tar.gz
hpc-carpentry-amdahl-46c9b4b/
hpc-carpentry-amdahl-46c9b4b/.github/
hpc-carpentry-amdahl-46c9b4b/.github/workflows/
hpc-carpentry-amdahl-46c9b4b/.github/workflows/python-publish.yml
hpc-carpentry-amdahl-46c9b4b/.gitignore
hpc-carpentry-amdahl-46c9b4b/LICENSE
hpc-carpentry-amdahl-46c9b4b/README.md
hpc-carpentry-amdahl-46c9b4b/amdahl/
hpc-carpentry-amdahl-46c9b4b/amdahl/__init__.py
hpc-carpentry-amdahl-46c9b4b/amdahl/__main__.py
hpc-carpentry-amdahl-46c9b4b/amdahl/amdahl.py
hpc-carpentry-amdahl-46c9b4b/requirements.txt
hpc-carpentry-amdahl-46c9b4b/setup.py
Este ejemplo muestra una carpeta que contiene algunos archivos, donde
46c9b4b
es un hash de confirmación git de 8 caracteres
que cambiará cuando se actualice el material fuente.
Ahora vamos a descomprimir el archivo. Ejecutaremos tar
con algunas banderas comunes:
-
-x
para extraer el archivo -
-v
para una salida verbosa -
-z
para compresión gzip -
-f «tarball»
para el fichero a descomprimir
Extraer el archivo
Usando las banderas de arriba, desempaquete el tarball del código
fuente en un nuevo directorio llamado “amdahl” usando
tar
.
SALIDA
hpc-carpentry-amdahl-46c9b4b/
hpc-carpentry-amdahl-46c9b4b/.github/
hpc-carpentry-amdahl-46c9b4b/.github/workflows/
hpc-carpentry-amdahl-46c9b4b/.github/workflows/python-publish.yml
hpc-carpentry-amdahl-46c9b4b/.gitignore
hpc-carpentry-amdahl-46c9b4b/LICENSE
hpc-carpentry-amdahl-46c9b4b/README.md
hpc-carpentry-amdahl-46c9b4b/amdahl/
hpc-carpentry-amdahl-46c9b4b/amdahl/__init__.py
hpc-carpentry-amdahl-46c9b4b/amdahl/__main__.py
hpc-carpentry-amdahl-46c9b4b/amdahl/amdahl.py
hpc-carpentry-amdahl-46c9b4b/requirements.txt
hpc-carpentry-amdahl-46c9b4b/setup.py
Observe que no necesitamos teclear -x -v -z -f
, gracias
a la concatenación de banderas, aunque el comando funciona de forma
idéntica de cualquier forma – siempre que la lista concatenada termine
con f
, porque la siguiente cadena debe especificar el
nombre del fichero a extraer.
La carpeta tiene un nombre desafortunado, así que cambiémoslo por algo más conveniente.
Comprueba el tamaño del directorio extraído y compáralo con el tamaño
del archivo comprimido, utilizando du
para
“disk usage”.
BASH
[you@laptop:~]$ du -sh amdahl.tar.gz
8.0K amdahl.tar.gz
[you@laptop:~]$ du -sh amdahl
48K amdahl
Los archivos de texto (incluido el código fuente de Python) se comprimen muy bien: ¡el “tarball” es una sexta parte del tamaño total de los datos en bruto!
Si desea invertir el proceso – comprimir los datos en bruto en lugar
de extraerlos – establezca una bandera c
en lugar de
x
, establezca el nombre del fichero de archivo, y luego
proporcione un directorio para comprimir:
SALIDA
amdahl/
amdahl/.github/
amdahl/.github/workflows/
amdahl/.github/workflows/python-publish.yml
amdahl/.gitignore
amdahl/LICENSE
amdahl/README.md
amdahl/amdahl/
amdahl/amdahl/__init__.py
amdahl/amdahl/__main__.py
amdahl/amdahl/amdahl.py
amdahl/requirements.txt
amdahl/setup.py
Si das amdahl.tar.gz
como nombre de fichero en el
comando anterior, tar
actualizará el tarball existente con
cualquier cambio que hayas hecho en los ficheros. Eso significaría
añadir la nueva carpeta amdahl
a la carpeta
existente (hpc-carpentry-amdahl-46c9b4b
) dentro
del tarball, ¡duplicando el tamaño del archivo!
Trabajando con Windows
Cuando transfieres ficheros de texto de un sistema Windows a un sistema Unix (Mac, Linux, BSD, Solaris, etc.) esto puede causar problemas. Windows codifica sus ficheros de forma ligeramente diferente a Unix, y añade un carácter extra a cada línea.
En un sistema Unix, cada línea de un archivo termina con una
\n
(nueva línea). En Windows, cada línea de un archivo
termina con \r\n
(retorno de carro + nueva línea). Esto a
veces causa problemas.
Aunque la mayoría de los lenguajes de programación y software
modernos manejan esto correctamente, en algunos casos raros, puede
encontrarse con un problema. La solución es convertir un archivo de
Windows a la codificación Unix con el comando dos2unix
.
Puede identificar si un fichero tiene terminaciones de línea Windows
con cat -A filename
. Un fichero con terminaciones de línea
Windows tendrá ^M$
al final de cada línea. Un fichero con
terminaciones de línea Unix tendrá $
al final de cada
línea.
Para convertir el archivo, basta con ejecutar
dos2unix filename
. (A la inversa, para volver a convertirlo
al formato de Windows, puede ejecutar
unix2dos filename
)
Transferencia de archivos y carpetas con scp
Para copiar un único fichero hacia o desde el cluster, podemos
utilizar scp
(“copia segura”). La sintaxis puede resultar
un poco compleja para los nuevos usuarios, pero vamos a desglosarla. El
comando scp
es un pariente del comando ssh
que
utilizamos para acceder al sistema, y puede utilizar el mismo mecanismo
de autenticación de clave pública.
Para cargar a otro ordenador, el comando de plantilla es
en el que @
y :
son separadores de campo y
remote_destination
es una ruta relativa a su directorio
personal remoto, o un nuevo nombre de fichero si desea cambiarlo, o
ambos una ruta relativa y un nuevo nombre de fichero. Si no
tiene una carpeta específica en mente, puede omitir
remote_destination
y el archivo se copiará a su directorio
personal en el ordenador remoto (con su nombre original). Si incluye
remote_destination
, tenga en cuenta que scp
lo
interpreta de la misma forma que cp
cuando hace copias
locales: si existe y es una carpeta, el fichero se copia dentro de la
carpeta; si existe y es un fichero, el fichero se sobrescribe con el
contenido de local_file
; si no existe, se asume que es un
nombre de fichero de destino para local_file
.
Sube el material de la lección a tu directorio personal remoto de esta forma:
¿Por qué no descargar en HPC Carpentry’s Cloud Cluster directamente?
La mayoría de los clusters de ordenadores están protegidos de la Internet abierta por un firewall. Para mejorar la seguridad, algunos están configurados para permitir el tráfico entrante, pero no saliente. Esto significa que un usuario autentificado puede enviar un fichero a una máquina del cluster, pero una máquina del cluster no puede recuperar ficheros de la máquina de un usuario o de la Internet abierta.
Intente descargar el archivo directamente. Tenga en cuenta que puede fallar, ¡y no pasa nada!
¿Por qué no descargar en HPC Carpentry’s Cloud Cluster directamente? (continued)
¿Funcionó? Si no, ¿qué te dice la salida del terminal sobre lo que ha pasado?
Transferir un directorio
Para transferir un directorio entero, añadimos la bandera
-r
para “recursivo”: copia el elemento
especificado, y cada elemento por debajo de él, y cada elemento por
debajo de esos… hasta que llegue al fondo del árbol de directorios
enraizado en el nombre de carpeta que proporcionaste.
Precaución
Para un directorio grande – ya sea en tamaño o en número de ficheros
– copiar con -r
puede tardar mucho tiempo en
completarse.
Cuando utilice scp
, habrá notado que :
siempre sigue al nombre del ordenador remoto. Una cadena
después de :
especifica el directorio remoto al
que desea transferir el archivo o carpeta, incluyendo un nuevo nombre si
desea renombrar el material remoto. Si deja este campo en blanco,
scp
por defecto será su directorio personal y el nombre del
material local a transferir.
En los ordenadores Linux, /
es el separador en las rutas
de archivos o directorios. Una ruta que comienza con /
se
llama absoluta, ya que no puede haber nada por encima de la
raíz /
. Una ruta que no empieza por /
se llama
relativa, ya que no está anclada a la raíz.
Si quiere subir un fichero a una ubicación dentro de su directorio
personal – lo que suele ser el caso – entonces no necesita un
/
líder. Después de :
, puede escribir
la ruta de destino relativa a su directorio personal. Si su directorio
personal es el destino, puede dejar el campo de destino en
blanco, o escribir ~
– la abreviatura de su directorio
personal – para completar.
Con scp
, una barra al final del directorio de destino es
opcional y no tiene ningún efecto. Una barra al final del directorio de
origen es importante para otros comandos, como rsync
.
Nota sobre rsync
A medida que adquiera experiencia en la transferencia de archivos,
puede que el comando scp
le resulte limitante. La utilidad
rsync proporciona características
avanzadas para la transferencia de archivos y es normalmente más rápida
comparada con scp
y sftp
(ver más abajo). Es
especialmente útil para transferir archivos grandes y/o numerosos y para
sincronizar el contenido de carpetas entre ordenadores.
La sintaxis es similar a scp
. Para transferir a
otro ordenador con opciones de uso común:
Las opciones son:
-
-a
(archivo) para preservar las marcas de tiempo de los archivos, los permisos y las carpetas, entre otras cosas; implica recursión -
-v
(verbose) para obtener una salida detallada que le ayude a monitorizar la transferencia -
-P
(partial/progress) para preservar los archivos parcialmente transferidos en caso de interrupción y también muestra el progreso de la transferencia.
Para copiar recursivamente un directorio, podemos utilizar las mismas opciones:
Tal y como está escrito, esto colocará el directorio local y su contenido bajo tu directorio personal en el sistema remoto. Si se añade una barra al final del origen, no se creará un nuevo directorio correspondiente al directorio transferido, y el contenido del directorio de origen se copiará directamente en el directorio de destino.
Para descargar un archivo, simplemente cambiamos el origen y el destino:
Las transferencias de ficheros utilizando tanto scp
como
rsync
utilizan SSH para encriptar los datos enviados a
través de la red. Por lo tanto, si puede conectarse a través de SSH,
podrá transferir archivos. Por defecto, SSH utiliza el puerto de red 22.
Si se está utilizando un puerto SSH personalizado, tendrá que
especificarlo utilizando la bandera apropiada, a menudo -p
,
-P
, o --port
. Comprueba --help
o
la página man
si no estás seguro.
BASH
[you@laptop:~]$ man rsync
[you@laptop:~]$ rsync --help | grep port
--port=PORT specify double-colon alternate port number
See http://rsync.samba.org/ for updates, bug reports, and answers
[you@laptop:~]$ rsync --port=768 amdahl.tar.gz yourUsername@cluster.hpc-carpentry.org:
(Tenga en cuenta que este comando fallará, ya que el puerto correcto en este caso es el predeterminado: 22.)
Transferencia interactiva de archivos con FileZilla
FileZilla es un cliente multiplataforma para descargar y subir
archivos a y desde un ordenador remoto. Es absolutamente infalible y
siempre funciona bastante bien. Utiliza el protocolo sftp
.
Puede leer más sobre el uso del protocolo sftp
en la línea
de comandos en la discusión de la
lección.
Descargue e instale el cliente FileZilla desde https://filezilla-project.org. Tras instalar y abrir el programa, debería aparecer una ventana con un explorador de archivos de su sistema local en la parte izquierda de la pantalla. Cuando te conectes al cluster, los archivos de tu cluster aparecerán en la parte derecha.
Para conectarnos al cluster, sólo tendremos que introducir nuestras credenciales en la parte superior de la pantalla:
- Host:
sftp://cluster.hpc-carpentry.org
- Usuario: Su nombre de usuario del cluster
- Contraseña: Su contraseña del clúster
- Puerto: (déjelo en blanco para usar el puerto por defecto)
Pulsa “Quickconnect” para conectarte. Deberías ver tus archivos remotos aparecer en la parte derecha de la pantalla. Puedes arrastrar y soltar archivos entre los lados izquierdo (local) y derecho (remoto) de la pantalla para transferir archivos.
Por último, si necesita mover archivos grandes (normalmente de más de
un gigabyte) de un ordenador remoto a otro remoto, acceda mediante SSH
al ordenador que aloja los archivos y utilice scp
o
rsync
para transferirlos al otro. Esto será más eficiente
que usar FileZilla (o aplicaciones relacionadas) que copiarían de la
fuente a su máquina local, y luego a la máquina de destino.
Puntos Clave
-
wget
ycurl -O
descarga un archivo de Internet. -
scp
yrsync
transfieren archivos desde y hacia su ordenador. - Puede utilizar un cliente SFTP como FileZilla para transferir archivos a través de una GUI.
Content from Ejecutar un trabajo paralelo
Última actualización: 2025-08-04 | Mejora esta página
Hoja de ruta
Preguntas
- ¿Cómo se ejecuta una tarea en paralelo?
- ¿Qué ventajas aporta la ejecución en paralelo?
- ¿Cuáles son los límites de las ganancias de la ejecución en paralelo?
Objetivos
- Instale un paquete Python usando
pip
- Prepara un script de envío de trabajos para el ejecutable paralelo.
- Lanzar trabajos con ejecución paralela.
- Registrar y resumir el tiempo y la precisión de los trabajos.
- Describa la relación entre el paralelismo de trabajos y el rendimiento.
Ahora tenemos las herramientas que necesitamos para ejecutar un trabajo multiprocesador. Este es un aspecto muy importante de los sistemas HPC, ya que el paralelismo es una de las principales herramientas que tenemos para mejorar el rendimiento de las tareas computacionales.
Si se desconectó, vuelva a conectarse al clúster.
Instalar el programa Amdahl
Con el código fuente de Amdahl en el cluster, podemos instalarlo, lo
que nos dará acceso al ejecutable amdahl
. Muévete al
directorio extraído, y luego utiliza el Instalador de Paquetes para
Python, o pip
, para instalarlo en tu directorio personal
(“usuario”):
Amdahl es código Python
El programa Amdahl está escrito en Python, e instalarlo o utilizarlo
requiere localizar el ejecutable python3
en el nodo de
inicio de sesión. Si no puede encontrarlo, intente listar los módulos
disponibles usando module avail
, cargue el apropiado, e
intente el comando de nuevo.
MPI para Python
El código Amdahl tiene una dependencia: mpi4py. Si
aún no ha sido instalado en el cluster, pip
intentará
recoger mpi4py de Internet e instalarlo por ti. Si esto falla debido a
un cortafuegos unidireccional, deberás recuperar mpi4py en tu máquina
local y subirlo, tal y como hicimos para Amdahl.
Recuperar y Subir mpi4py
Si la instalación de Amdahl falló porque mpi4py no pudo ser
instalado, recupere el tarball de https://github.com/mpi4py/mpi4py/tarball/master luego
rsync
al cluster, extraiga, e instale:
BASH
[you@laptop:~]$ wget -O mpi4py.tar.gz https://github.com/mpi4py/mpi4py/releases/download/3.1.4/mpi4py-3.1.4.tar.gz
[you@laptop:~]$ scp mpi4py.tar.gz yourUsername@cluster.hpc-carpentry.org:
# or
[you@laptop:~]$ rsync -avP mpi4py.tar.gz yourUsername@cluster.hpc-carpentry.org:
BASH
[you@laptop:~]$ ssh yourUsername@cluster.hpc-carpentry.org
[yourUsername@login1 ~] tar -xvzf mpi4py.tar.gz # extract the archive
[yourUsername@login1 ~] mv mpi4py* mpi4py # rename the directory
[yourUsername@login1 ~] cd mpi4py
[yourUsername@login1 ~] python3 -m pip install --user .
[yourUsername@login1 ~] cd ../amdahl
[yourUsername@login1 ~] python3 -m pip install --user .
If pip
Raises a Warning…
pip
puede advertir que los binarios de su paquete de
usuario no están en su PATH.
ADVERTENCIA
WARNING: The script amdahl is installed in "${HOME}/.local/bin" which is
not on PATH. Consider adding this directory to PATH or, if you prefer to
suppress this warning, use --no-warn-script-location.
Para comprobar si esta advertencia es un problema, utilice
which
para buscar el programa amdahl
:
Si el comando no devuelve ninguna salida, mostrando un nuevo prompt,
significa que no se ha encontrado el fichero amdahl
. Debe
actualizar la variable de entorno llamada PATH
para incluir
la carpeta que falta. Edite el archivo de configuración de su shell de
la siguiente manera, luego cierre la sesión en el cluster y vuelva a
iniciarla para que surta efecto.
SALIDA
export PATH=${PATH}:${HOME}/.local/bin
Después de volver a entrar en cluster.hpc-carpentry.org,
which
debería ser capaz de encontrar amdahl
sin dificultades. Si ha tenido que cargar un módulo de Python, vuelva a
cargarlo.
¡Ayuda!
Muchos programas de línea de comandos incluyen un mensaje de “ayuda”.
Pruébelo con amdahl
:
SALIDA
usage: amdahl [-h] [-p [PARALLEL_PROPORTION]] [-w [WORK_SECONDS]] [-t] [-e] [-j [JITTER_PROPORTION]]
optional arguments:
-h, --help show this help message and exit
-p [PARALLEL_PROPORTION], --parallel-proportion [PARALLEL_PROPORTION]
Parallel proportion: a float between 0 and 1
-w [WORK_SECONDS], --work-seconds [WORK_SECONDS]
Total seconds of workload: an integer greater than 0
-t, --terse Format output as a machine-readable object for easier analysis
-e, --exact Exactly match requested timing by disabling random jitter
-j [JITTER_PROPORTION], --jitter-proportion [JITTER_PROPORTION]
Random jitter: a float between -1 and +1
Este mensaje no nos dice mucho sobre lo que el programa hace, pero sí nos dice las banderas importantes que podríamos querer usar al lanzarlo.
Ejecutando el Trabajo en un Nodo de Computación
Crear un archivo de envío, solicitando una tarea en un único nodo, y luego lanzarla.
BASH
#!/bin/bash
#SBATCH -J solo-job
#SBATCH -p cpubase_bycore_b1
#SBATCH -N 1
#SBATCH -n 1
# Load the computing environment we need
module load Python
# Execute the task
amdahl
Como antes, utilice los comandos de estado Slurm para comprobar si su trabajo se está ejecutando y cuándo finaliza:
Utilice ls
para localizar el fichero de salida. La
bandera -t
ordena en orden cronológico inverso: el más
reciente primero. ¿Cuál fue la salida?
La salida del cluster debe escribirse en un fichero en la carpeta desde la que lanzaste el trabajo. Por ejemplo,
SALIDA
slurm-347087.out serial-job.sh amdahl README.md LICENSE.txt
SALIDA
Doing 30.000 seconds of 'work' on 1 processor,
which should take 30.000 seconds with 0.850 parallel proportion of the workload.
Hello, World! I am process 0 of 1 on smnode1. I will do all the serial 'work' for 4.500 seconds.
Hello, World! I am process 0 of 1 on smnode1. I will do parallel 'work' for 25.500 seconds.
Total execution time (according to rank 0): 30.033 seconds
Como vimos antes, dos de las banderas del programa
amdahl
establecen la cantidad de trabajo y la proporción de
ese trabajo que es de naturaleza paralela. Basándonos en la salida,
podemos ver que el código utiliza por defecto 30 segundos de trabajo que
es 85% paralelo. El programa se ejecutó durante algo más de 30 segundos
en total, y si hacemos números, es cierto que el 15% del mismo se marcó
como ‘serie’ y el 85% como ‘paralelo’.
Como sólo le dimos una CPU al trabajo, este trabajo no fue realmente paralelo: el mismo procesador realizó el trabajo “en serie” durante 4,5 segundos, y luego la parte “paralela” durante 25,5 segundos, y no se ahorró tiempo. El clúster puede hacerlo mejor, si se lo pedimos.
Ejecutando el Trabajo Paralelo
El programa amdahl
utiliza la Interfaz de Paso de
Mensajes (MPI) para el paralelismo - ésta es una herramienta común en
los sistemas HPC.
¿Qué es MPI?
La interfaz de paso de mensajes es un conjunto de herramientas que permiten que varias tareas que se ejecutan simultáneamente se comuniquen entre sí. Normalmente, un único ejecutable se ejecuta varias veces, posiblemente en máquinas diferentes, y las herramientas MPI se utilizan para informar a cada instancia del ejecutable sobre sus procesos hermanos y de qué instancia se trata. MPI también proporciona herramientas que permiten la comunicación entre instancias para coordinar el trabajo, intercambiar información sobre elementos de la tarea o transferir datos. Una instancia MPI suele tener su propia copia de todas las variables locales.
Mientras que los ejecutables compatibles con MPI pueden ejecutarse
generalmente como programas independientes, para que puedan ejecutarse
en paralelo deben utilizar un entorno de ejecución MPI, que es
una implementación específica del estándar MPI. Para activar el
entorno MPI, el programa debe iniciarse mediante una orden como
mpiexec
(o mpirun
, o srun
, etc.
dependiendo del entorno de ejecución MPI que necesite utilizar), que
asegurará que se incluya el soporte de tiempo de ejecución apropiado
para el paralelismo.
Argumentos de ejecución MPI
Por sí solos, comandos como mpiexec
pueden tomar muchos
argumentos que especifican cuántas máquinas participarán en la
ejecución, y puede que los necesite si desea ejecutar un programa MPI
por su cuenta (por ejemplo, en su portátil). En el contexto de un
sistema de colas, sin embargo, es frecuente que el tiempo de ejecución
MPI obtenga los parámetros necesarios del sistema de colas, examinando
las variables de entorno establecidas cuando se lanza el trabajo.
Modifiquemos el script de trabajo para solicitar más núcleos y utilizar el tiempo de ejecución MPI.
BASH
[yourUsername@login1 ~] cp serial-job.sh parallel-job.sh
[yourUsername@login1 ~] nano parallel-job.sh
[yourUsername@login1 ~] cat parallel-job.sh
BASH
#!/bin/bash
#SBATCH -J parallel-job
#SBATCH -p cpubase_bycore_b1
#SBATCH -N 1
#SBATCH -n 4
# Load the computing environment we need
# (mpi4py and numpy are in SciPy-bundle)
module load Python
module load SciPy-bundle
# Execute the task
mpiexec amdahl
A continuación, envíe su trabajo. Tenga en cuenta que el comando de envío no ha cambiado realmente con respecto a cómo enviamos el trabajo serie: todos los ajustes paralelos están en el archivo por lotes en lugar de en la línea de comandos.
Como antes, utiliza los comandos de estado para comprobar cuándo se ejecuta tu trabajo.
SALIDA
slurm-347178.out parallel-job.sh slurm-347087.out serial-job.sh amdahl README.md LICENSE.txt
SALIDA
Doing 30.000 seconds of 'work' on 4 processors,
which should take 10.875 seconds with 0.850 parallel proportion of the workload.
Hello, World! I am process 0 of 4 on smnode1. I will do all the serial 'work' for 4.500 seconds.
Hello, World! I am process 2 of 4 on smnode1. I will do parallel 'work' for 6.375 seconds.
Hello, World! I am process 1 of 4 on smnode1. I will do parallel 'work' for 6.375 seconds.
Hello, World! I am process 3 of 4 on smnode1. I will do parallel 'work' for 6.375 seconds.
Hello, World! I am process 0 of 4 on smnode1. I will do parallel 'work' for 6.375 seconds.
Total execution time (according to rank 0): 10.888 seconds
¿Es 4× más rápido?
El trabajo paralelo recibió 4× más procesadores que el trabajo en serie: ¿significa eso que terminó en ¼ del tiempo?
El trabajo en paralelo tardó menos tiempo: ¡11 segundos es mejor que 30! Pero sólo es una mejora de 2,7×, no de 4×.
Mira la salida del trabajo:
- Mientras el “proceso 0” hacía el trabajo en serie, los procesos del 1 al 3 hacían su trabajo en paralelo.
- Mientras el proceso 0 se ponía al día en su trabajo paralelo, el resto no hacía nada.
El proceso 0 siempre tiene que terminar su tarea en serie antes de poder empezar con el trabajo en paralelo. Esto establece un límite inferior en la cantidad de tiempo que este trabajo va a tomar, no importa cuántos núcleos que lanzar en él.
Este es el principio básico de la Ley de Amdahl, que es una forma de predecir mejoras en el tiempo de ejecución para una carga de trabajo fija que puede subdividirse y ejecutarse en paralelo hasta cierto punto.
¿Cuánto mejora el rendimiento la ejecución en paralelo?
En teoría, dividir un cálculo perfectamente paralelo entre n procesos MPI debería producir una disminución del tiempo total de ejecución en un factor de n. Como acabamos de ver, los programas reales necesitan cierto tiempo para que los procesos MPI se comuniquen y coordinen, y algunos tipos de cálculos no pueden subdividirse: sólo se ejecutan eficazmente en una única CPU.
Además, si los procesos MPI operan en diferentes CPUs físicas en el ordenador, o a través de múltiples nodos de computación, se requiere incluso más tiempo para la comunicación del que se necesita cuando todos los procesos operan en una única CPU.
En la práctica, es habitual evaluar el paralelismo de un programa MPI mediante
- ejecutar el programa en un rango de CPUs,
- registrando el tiempo de ejecución en cada ejecución,
- comparando cada tiempo de ejecución con el tiempo cuando se utiliza una única CPU.
Dado que “más es mejor” (la mejora es más fácil de interpretar a partir de aumentos en alguna cantidad que de disminuciones), las comparaciones se realizan utilizando el factor de aceleración S, que se calcula como el tiempo de ejecución en una sola CPU dividido por el tiempo de ejecución en varias CPU. Para un programa perfectamente paralelo, un gráfico del aumento de velocidad S frente al número de CPUs n daría una línea recta, S = n.
Vamos a ejecutar un trabajo más, para que podamos ver lo cerca de una
línea recta que llega nuestro código amdahl
.
BASH
#!/bin/bash
#SBATCH -J parallel-job
#SBATCH -p cpubase_bycore_b1
#SBATCH -N 1
#SBATCH -n 8
# Load the computing environment we need
# (mpi4py and numpy are in SciPy-bundle)
module load Python
module load SciPy-bundle
# Execute the task
mpiexec amdahl
A continuación, envíe su trabajo. Tenga en cuenta que el comando de envío no ha cambiado realmente con respecto a cómo enviamos el trabajo serie: todos los ajustes paralelos están en el archivo por lotes en lugar de en la línea de comandos.
Como antes, utiliza los comandos de estado para comprobar cuándo se ejecuta tu trabajo.
SALIDA
slurm-347271.out parallel-job.sh slurm-347178.out slurm-347087.out serial-job.sh amdahl README.md LICENSE.txt
SALIDA
which should take 7.688 seconds with 0.850 parallel proportion of the workload.
Hello, World! I am process 4 of 8 on smnode1. I will do parallel 'work' for 3.188 seconds.
Hello, World! I am process 0 of 8 on smnode1. I will do all the serial 'work' for 4.500 seconds.
Hello, World! I am process 2 of 8 on smnode1. I will do parallel 'work' for 3.188 seconds.
Hello, World! I am process 1 of 8 on smnode1. I will do parallel 'work' for 3.188 seconds.
Hello, World! I am process 3 of 8 on smnode1. I will do parallel 'work' for 3.188 seconds.
Hello, World! I am process 5 of 8 on smnode1. I will do parallel 'work' for 3.188 seconds.
Hello, World! I am process 6 of 8 on smnode1. I will do parallel 'work' for 3.188 seconds.
Hello, World! I am process 7 of 8 on smnode1. I will do parallel 'work' for 3.188 seconds.
Hello, World! I am process 0 of 8 on smnode1. I will do parallel 'work' for 3.188 seconds.
Total execution time (according to rank 0): 7.697 seconds
Salida no lineal
Cuando ejecutamos el trabajo con 4 trabajadores paralelos, el trabajo en serie escribió su salida primero, luego los procesos paralelos escribieron su salida, con el proceso 0 llegando primero y último.
Con 8 trabajadores, este no es el caso: como los trabajadores paralelos tardan menos que el trabajo en serie, es difícil decir qué proceso escribirá su salida primero, ¡excepto que no será el proceso 0!
Ahora, vamos a resumir la cantidad de tiempo que tardó cada trabajo en ejecutarse:
Number of CPUs | Runtime (sec) |
---|---|
1 | 30.033 |
4 | 10.888 |
8 | 7.697 |
Entonces, utilice la primera fila para calcular los speedups \(S\), utilizando Python como calculadora de línea de comandos y la fórmula
\[ S(t_{n}) = \frac{t_{1}}{t_{n}} \]
Number of CPUs | Speedup | Ideal |
---|---|---|
1 | 1.0 | 1 |
4 | 2.75 | 4 |
8 | 3.90 | 8 |
Los archivos de salida del trabajo nos han estado diciendo que este programa está realizando el 85% de su trabajo en paralelo, dejando el 15% para ejecutarse en serie. Esto parece razonablemente alto, pero nuestro rápido estudio del aumento de velocidad muestra que para obtener un aumento de velocidad de 4×, tenemos que utilizar 8 o 9 procesadores en paralelo. En los programas reales, el factor de aumento de velocidad está influido por
- Diseño de la CPU
- red de comunicación entre nodos de cálculo
- Implementaciones de bibliotecas MPI
- detalles del propio programa MPI
Usando la Ley de Amdahl, puedes probar que con este programa es imposible alcanzar 8× de velocidad, sin importar cuántos procesadores tengas a mano. Los detalles de ese análisis, con resultados que lo respalden, se dejan para la siguiente clase del taller HPC Carpentry, HPC Workflows.
En un entorno HPC, intentamos reducir el tiempo de ejecución de todo tipo de trabajos, y MPI es una forma extremadamente común de combinar docenas, cientos o miles de CPUs en la resolución de un único problema. Para aprender más sobre paralelización, vea la lección parallel novice lesson.
Puntos Clave
- La programación paralela permite a las aplicaciones aprovechar las ventajas del hardware paralelo.
- El sistema de colas facilita la ejecución de tareas paralelas.
- Las mejoras de rendimiento de la ejecución paralela no escalan linealmente.
Content from Uso eficaz de los recursos
Última actualización: 2025-08-04 | Mejora esta página
Hoja de ruta
Preguntas
- ¿Cómo puedo revisar trabajos anteriores?
- ¿Cómo puedo utilizar estos conocimientos para crear un script de envío más preciso?
Objetivos
- Consulta las estadísticas de los trabajos.
- Realiza peticiones de recursos más precisas en los scripts de trabajo basándose en datos que describen el rendimiento pasado.
Hemos tocado todas las habilidades necesarias para interactuar con un clúster HPC: iniciar sesión a través de SSH, cargar módulos de software, enviar trabajos paralelos y encontrar la salida. Vamos a aprender a estimar el uso de recursos y por qué puede ser importante.
Estimación de Recursos Requeridos Usando el Planificador
Aunque antes hemos cubierto la solicitud de recursos al planificador con el código π, ¿cómo sabemos qué tipo de recursos necesitará el software en primer lugar, y su demanda de cada uno? En general, a menos que la documentación del software o los testimonios de los usuarios nos den alguna idea, no sabremos cuánta memoria o tiempo de computación necesitará un programa.
Leer la documentación
La mayoría de las instalaciones HPC mantienen documentación en forma de wiki, sitio web o documento que se envía al registrarse para obtener una cuenta. Echa un vistazo a estos recursos y busca el software que piensas utilizar: puede que alguien haya escrito una guía para sacarle el máximo partido.
Una forma conveniente de averiguar los recursos necesarios para que
un trabajo se ejecute con éxito es enviar un trabajo de prueba, y luego
preguntar al planificador sobre su impacto utilizando
sacct -u yourUsername
. Puede utilizar este conocimiento
para configurar el siguiente trabajo con una estimación más cercana de
su carga en el sistema. Una buena regla general es pedir al programador
entre un 20% y un 30% más de tiempo y memoria de lo que espera que
necesite el trabajo. Esto garantiza que las pequeñas fluctuaciones en el
tiempo de ejecución o en el uso de memoria no provoquen la cancelación
del trabajo por parte del programador. Ten en cuenta que si pides
demasiado, puede que tu trabajo no se ejecute aunque haya suficientes
recursos disponibles, porque el programador estará esperando a que los
trabajos de otras personas terminen y liberen los recursos necesarios
para igualar lo que has pedido.
Estadísticas
Como ya hemos enviado amdahl
para que se ejecute en el
cluster, podemos consultar el planificador para ver cuánto tiempo ha
tardado nuestro trabajo y qué recursos se han utilizado. Usaremos
sacct -u yourUsername
para obtener estadísticas sobre
parallel-job.sh
.
SALIDA
JobID JobName Partition Account AllocCPUS State ExitCode
------------ ---------- ---------- ---------- ---------- ---------- --------
7 file.sh cpubase_b+ def-spons+ 1 COMPLETED 0:0
7.batch batch def-spons+ 1 COMPLETED 0:0
7.extern extern def-spons+ 1 COMPLETED 0:0
8 file.sh cpubase_b+ def-spons+ 1 COMPLETED 0:0
8.batch batch def-spons+ 1 COMPLETED 0:0
8.extern extern def-spons+ 1 COMPLETED 0:0
9 example-j+ cpubase_b+ def-spons+ 1 COMPLETED 0:0
9.batch batch def-spons+ 1 COMPLETED 0:0
9.extern extern def-spons+ 1 COMPLETED 0:0
Muestra todos los trabajos ejecutados hoy (tenga en cuenta que hay varias entradas por trabajo). Para obtener información sobre un trabajo específico (por ejemplo, 347087), cambiamos ligeramente el comando.
Mostrará mucha información; de hecho, cada pieza de información
recopilada sobre su trabajo por el planificador aparecerá aquí. Puede
ser útil redirigir esta información a less
para facilitar
su visualización (utilice las teclas de flecha izquierda y derecha para
desplazarse por los campos).
Discusión
Esta vista puede ayudar a comparar la cantidad de tiempo solicitado y realmente utilizado, la duración de la residencia en la cola antes del lanzamiento, y la huella de memoria en el nodo(s) de computación.
¿Hasta qué punto fueron precisas nuestras estimaciones?
Mejora de las solicitudes de recursos
A partir del historial de trabajos, vemos que los trabajos
amdahl
terminaron de ejecutarse en unos pocos minutos como
máximo, una vez despachados. La estimación de tiempo que proporcionamos
en el script del trabajo era demasiado larga Esto hace que sea más
difícil para el sistema de colas estimar con precisión cuándo los
recursos quedarán libres para otros trabajos. En la práctica, esto
significa que el sistema de colas espera para despachar nuestro trabajo
amdahl
hasta que se abre todo el espacio de tiempo
solicitado, en lugar de “colarlo” en una ventana mucho más corta en la
que el trabajo podría realmente terminar. Especificar el tiempo de
ejecución esperado en el script de envío con mayor precisión ayudará a
aliviar la congestión del cluster y puede conseguir que su trabajo se
despache antes.
Reducir la estimación de tiempo
Edita parallel_job.sh
para establecer una mejor
estimación del tiempo. ¿Qué tan cerca puedes estar?
Sugerencia: utilice -t
.
Puntos Clave
- La precisión de los guiones de trabajo ayuda al sistema de colas a asignar eficazmente los recursos compartidos.
Content from Uso responsable de los recursos compartidos
Última actualización: 2025-08-04 | Mejora esta página
Hoja de ruta
Preguntas
- ¿Cómo puedo ser un usuario responsable?
- ¿Cómo puedo proteger mis datos?
- ¿Cuál es la mejor forma de obtener grandes cantidades de datos de un sistema HPC?
Objetivos
- Describe cómo las acciones de un único usuario pueden afectar a la experiencia de otros en un sistema compartido.
- Discutir el comportamiento de un ciudadano considerado del sistema compartido.
- Explica la importancia de hacer copias de seguridad de los datos críticos.
- Describa los retos que plantea la transferencia de grandes cantidades de datos fuera de los sistemas HPC.
- Convierte muchos ficheros en un único archivo comprimido utilizando tar.
Una de las principales diferencias entre utilizar recursos HPC remotos y tu propio sistema (por ejemplo, tu portátil) es que los recursos remotos se comparten. El número de usuarios que comparten el recurso en un momento dado varía de un sistema a otro, pero es poco probable que usted sea el único usuario conectado o utilizando un sistema de este tipo.
El uso generalizado de sistemas de programación en los que los usuarios envían trabajos a recursos HPC es un resultado natural de la naturaleza compartida de estos recursos. Hay otras cosas que usted, como miembro honrado de la comunidad, debe tener en cuenta.
Sea amable con los nodos de inicio de sesión
El nodo de inicio de sesión suele estar ocupado gestionando todos los usuarios conectados, creando y editando archivos y compilando software. Si la máquina se queda sin memoria o capacidad de procesamiento, se volverá muy lenta e inutilizable para todos. Aunque la máquina está pensada para ser utilizada, asegúrate de hacerlo de forma responsable, de manera que no afecte negativamente a la experiencia de los demás usuarios.
Los nodos de inicio de sesión son siempre el lugar adecuado para lanzar trabajos. Las políticas de clúster varían, pero también pueden utilizarse para probar flujos de trabajo y, en algunos casos, pueden albergar herramientas avanzadas de depuración o desarrollo específicas del clúster. El cluster puede tener módulos que necesitan ser cargados, posiblemente en un cierto orden, y rutas o versiones de librerías que difieren de tu portátil, y hacer una prueba interactiva en el nodo principal es una forma rápida y fiable de descubrir y arreglar estos problemas.
Los nodos de inicio de sesión son un recurso compartido
Recuerda que el nodo de inicio de sesión se comparte con todos los demás usuarios y tus acciones podrían causar problemas a otras personas. Piensa detenidamente en las posibles implicaciones de emitir comandos que puedan utilizar grandes cantidades de recursos.
¿No está seguro? Pregunte a su amable administrador de sistemas (“sysadmin”) si lo que está contemplando es adecuado para el nodo de inicio de sesión, o si existe otro mecanismo para hacerlo de forma segura.
Siempre puede utilizar los comandos top
y
ps ux
para listar los procesos que se están ejecutando en
el nodo de inicio de sesión junto con la cantidad de CPU y memoria que
están utilizando. Si esta comprobación revela que el nodo de inicio de
sesión está algo inactivo, puede utilizarlo con seguridad para su tarea
de procesamiento no rutinaria. Si algo va mal – el proceso tarda
demasiado, o no responde – puede usar el comando kill
junto
con el PID para terminar el proceso.
Etiqueta del nodo de inicio de sesión
¿Cuál de estos comandos sería una tarea rutinaria a ejecutar en el nodo login?
python physics_sim.py
make
create_directories.sh
molecular_dynamics_2
tar -xzf R-3.3.0.tar.gz
Construir software, crear directorios y desempaquetar software son
tareas > comunes y aceptables para el nodo de inicio de sesión: las
opciones #2 (make
), #3 (mkdir
) y #5
(tar
) probablemente estén bien. Tenga en cuenta que los
nombres de los scripts no siempre reflejan su contenido: antes de lanzar
#3, por favor less create_directories.sh
y asegúrese de que
no es un troyano.
No está bien visto ejecutar aplicaciones que consumen muchos
recursos. A menos que esté seguro de que no afectará a otros usuarios,
no ejecute trabajos como #1 (python
) o #4 (código MD
personalizado). Si no está seguro, pida consejo a su administrador de
sistemas.
Si experimenta problemas de rendimiento con un nodo de inicio de sesión, debe informar de ello al personal del sistema (normalmente a través del servicio de asistencia) para que lo investiguen.
Prueba antes de escalar
Recuerde que generalmente se le cobra por el uso en sistemas compartidos. Un simple error en un script de trabajo puede acabar costando una gran cantidad de presupuesto de recursos. Imagina un script de trabajo con un error que hace que se quede sin hacer nada durante 24 horas en 1000 núcleos o uno en el que has solicitado 2000 núcleos por error y ¡sólo utilizas 100 de ellos! Este problema puede agravarse cuando la gente escribe scripts que automatizan el envío de trabajos (por ejemplo, cuando se ejecuta el mismo cálculo o análisis sobre muchos parámetros o archivos diferentes). Cuando esto ocurre, te perjudica tanto a ti (ya que desperdicias muchos recursos cargados) como a otros usuarios (que ven bloqueado su acceso a los nodos de cálculo ociosos). En recursos muy ocupados puedes esperar muchos días en una cola para que tu trabajo falle a los 10 segundos de empezar debido a un error tipográfico trivial en el script del trabajo. Esto es extremadamente frustrante
La mayoría de los sistemas proporcionan recursos dedicados para pruebas que tienen tiempos de espera cortos para ayudarte a evitar este problema.
Probar scripts de envío de trabajos que utilizan grandes cantidades de recursos
Antes de enviar una gran cantidad de trabajos, envíe primero uno como prueba para asegurarse de que todo funciona como se espera.
Antes de enviar un trabajo muy grande o muy largo envíe una pequeña prueba truncada para asegurarse de que el trabajo se inicia como se espera.
Tener un plan de copias de seguridad
Aunque muchos sistemas HPC guardan copias de seguridad, no siempre cubren todos los sistemas de ficheros disponibles y puede que sólo sean para fines de recuperación de desastres (es decir, para restaurar todo el sistema de ficheros en caso de pérdida en lugar de un fichero o directorio individual que hayas borrado por error). Proteger los datos críticos de la corrupción o el borrado es principalmente tu responsabilidad: mantén tus propias copias de seguridad.
Los sistemas de control de versiones (como Git) suelen tener ofertas gratuitas basadas en la nube (por ejemplo, GitHub y GitLab) que se utilizan generalmente para almacenar el código fuente. Incluso si no estás escribiendo tus propios programas, estos pueden ser muy útiles para almacenar scripts de trabajo, scripts de análisis y pequeños archivos de entrada.
Si está creando software, es posible que tenga una gran cantidad de código fuente que compila para crear su ejecutable. Dado que estos datos generalmente se pueden recuperar volviendo a descargar el código o volviendo a ejecutar la operación de comprobación desde el repositorio de código fuente, también es menos importante proteger estos datos.
Para grandes cantidades de datos, especialmente resultados
importantes de sus ejecuciones, que pueden ser irremplazables, debe
asegurarse de que dispone de un sistema robusto para sacar copias de los
datos del sistema HPC siempre que sea posible a un almacenamiento de
copia de seguridad. Herramientas como rsync
pueden ser muy
útiles para esto.
Su acceso al sistema HPC compartido estará generalmente limitado en el tiempo, por lo que debe asegurarse de tener un plan para transferir sus datos fuera del sistema antes de que termine su acceso. No subestime el tiempo necesario para transferir grandes cantidades de datos y asegúrese de planificarlo con suficiente antelación (idealmente, antes de empezar a utilizar el sistema para su investigación).
En todos estos casos, el servicio de asistencia del sistema que esté utilizando debería poder proporcionarle orientación útil sobre las opciones de transferencia de datos para los volúmenes de datos que vaya a utilizar.
Tus datos son tu responsabilidad
Asegúrate de que entiendes cuál es la política de copias de seguridad de los sistemas de archivos del sistema que estás utilizando y qué implicaciones tiene para tu trabajo si pierdes tus datos en el sistema. Planifica tus copias de seguridad de los datos críticos y cómo transferirás los datos fuera del sistema a lo largo del proyecto.
Transfiriendo datos
Como se mencionó anteriormente, muchos usuarios se encuentran con el reto de transferir grandes cantidades de datos fuera de los sistemas HPC en algún momento (esto es más frecuente en la transferencia de datos fuera que dentro de los sistemas, pero los consejos a continuación se aplican en ambos casos). La velocidad de transferencia de datos puede estar limitada por muchos factores diferentes, por lo que el mejor mecanismo de transferencia de datos que se puede utilizar depende del tipo de datos que se transfieren y a dónde van los datos.
Los componentes entre el origen y el destino de tus datos tienen diferentes niveles de rendimiento y, en particular, pueden tener diferentes capacidades con respecto al ancho de banda y la latencia.
El ancho de banda es generalmente la cantidad bruta de datos por unidad de tiempo que un dispositivo es capaz de transmitir o recibir. Es una métrica común y generalmente bien entendida.
La latencia es algo más sutil. Para las transferencias de datos, se puede considerar como la cantidad de tiempo que se tarda en sacar los datos del almacenamiento y ponerlos en una forma transmisible. Los problemas de latencia son la razón por la que es aconsejable ejecutar las transferencias de datos moviendo un pequeño número de archivos grandes, en lugar de lo contrario.
Algunos de los componentes clave y sus problemas asociados son:
- Velocidad del disco: Los sistemas de archivos de los sistemas HPC suelen ser altamente paralelos y constan de un gran número de unidades de disco de alto rendimiento. Esto les permite soportar un ancho de banda de datos muy elevado. A menos que el sistema remoto tenga un sistema de ficheros paralelo similar, la velocidad de transferencia puede verse limitada por el rendimiento del disco en ese extremo.
- Rendimiento de los metadatos: Las operaciones de metadatos, como abrir y cerrar archivos o listar el propietario o el tamaño de un archivo, son mucho menos paralelas que las operaciones de lectura/escritura. Si tus datos consisten en un gran número de archivos pequeños, puede que la velocidad de transferencia se vea limitada por las operaciones de metadatos. Las operaciones de metadatos realizadas por otros usuarios del sistema también pueden interactuar fuertemente con las que tú realizas, por lo que reducir el número de operaciones de este tipo que utilizas (combinando varios archivos en uno solo) puede reducir la variabilidad en tus tasas de transferencia y aumentar la velocidad de transferencia.
- Velocidad de red: El rendimiento de la transferencia de datos puede verse limitado por la velocidad de la red. Más importante aún, está limitado por la sección más lenta de la red entre el origen y el destino. Si está transfiriendo a su ordenador portátil/estación de trabajo, es probable que ésta sea su conexión (ya sea a través de LAN o WiFi).
- Velocidad del cortafuegos: La mayoría de las redes modernas están protegidas por algún tipo de cortafuegos que filtra el tráfico malicioso. Este filtrado tiene cierta sobrecarga y puede reducir el rendimiento de la transferencia de datos. Las necesidades de una red de uso general que aloja servidores web o de correo electrónico y equipos de sobremesa son muy distintas de las de una red de investigación que necesita transferir grandes volúmenes de datos. Si intentas transferir datos a o desde un host en una red de propósito general, puede que el cortafuegos de esa red limite la velocidad de transferencia que puedes alcanzar.
Como se ha mencionado anteriormente, si tienes datos relacionados que
consisten en un gran número de archivos pequeños, se recomienda
encarecidamente empaquetar los archivos en un archivo archive
más grande para su almacenamiento y transferencia a largo plazo. Un
único archivo grande hace un uso más eficiente del sistema de archivos y
es más fácil de mover, copiar y transferir porque se requieren muchas
menos operaciones de metadatos. Los ficheros de archivo pueden crearse
con herramientas como tar
y zip
. Ya conocimos
tar
cuando hablamos anteriormente de la transferencia de
datos.
Considere la mejor forma de transferir datos
Si vas a transferir grandes cantidades de datos, tendrás que pensar en qué puede afectar al rendimiento de la transferencia. Siempre es útil realizar algunas pruebas que puedas utilizar para extrapolar el tiempo que tardará la transferencia de tus datos.
Supongamos que tienes una carpeta “data” que contiene unos 10.000 archivos, una buena mezcla de pequeños y grandes datos ASCII y binarios. ¿Cuál de las siguientes opciones sería la mejor para transferirlos a HPC Carpentry’s Cloud Cluster?
scp -r data yourUsername@cluster.hpc-carpentry.org:~/
rsync -ra data yourUsername@cluster.hpc-carpentry.org:~/
rsync -raz data yourUsername@cluster.hpc-carpentry.org:~/
-
tar -cvf data.tar data;
rsync -raz data.tar yourUsername@cluster.hpc-carpentry.org:~/
-
tar -cvzf data.tar.gz data;
rsync -ra data.tar.gz yourUsername@cluster.hpc-carpentry.org:~/
-
scp
copiará recursivamente el directorio. Esto funciona, pero sin compresión. -
rsync -ra
funciona comoscp -r
, pero conserva la información del archivo, como las horas de creación. Esto es ligeramente mejor. -
rsync -raz
añade compresión, lo que ahorrará algo de ancho de banda. Si tienes una CPU potente en ambos extremos de la línea, y estás en una red lenta, ésta es una buena opción. - Este comando utiliza primero
tar
para unir todo en un único archivo, y luegorsync -z
para transferirlo con compresión. Con este número tan grande de ficheros, la sobrecarga de metadatos puede dificultar la transferencia, por lo que es una buena idea. - Este comando utiliza
tar -z
para comprimir el archivo y luegorsync
para transferirlo. Puede tener un rendimiento similar a #4, pero en la mayoría de los casos (para grandes conjuntos de datos), es la mejor combinación de alto rendimiento y baja latencia (aprovechando al máximo el tiempo y la conexión de red).
Puntos Clave
- Ten cuidado con el uso del nodo login.
- Tus datos en el sistema son tu responsabilidad.
- Planifica y prueba grandes transferencias de datos.
- A menudo es mejor convertir muchos ficheros en un único archivo antes de transferirlos.