servidores

De Wikicima
(Diferencias entre revisiones)
Saltar a: navegación, buscar
(Entorno de trabajo)
(Sistema de colas)
 
(No se muestran 14 ediciones intermedias realizadas por un usuario)
Línea 1: Línea 1:
 
Algunas recomendaciones básicas de cómo manejarse con trabajo en un servidor compartido
 
Algunas recomendaciones básicas de cómo manejarse con trabajo en un servidor compartido
   
  +
  +
= Consideraciones iniciales =
 
Cuando se trabaja desde un servidor el entorno gráfico '''NO EXISTE'''
 
Cuando se trabaja desde un servidor el entorno gráfico '''NO EXISTE'''
  +
  +
{| class="wikitable" style="margin:auto"
  +
|-
  +
| Un servidor es un recurso compartido
  +
|-
  +
| ¡¡ Seamos respetuoses con el resto !!
  +
|}
   
 
= Acceso =
 
= Acceso =
Línea 41: Línea 50:
   
 
== Servidor de cálculo ==
 
== Servidor de cálculo ==
Estos servidores suelen tener una jerarquía de directorios cada uno de los cuáles con distintas características y propósitos:
+
Estos servidores suelen tener una jerarquía de directorios cada uno de los cuáles con distintas características y propósitos.
* <code>$HOME</code>: punta de entrada al servidor, con poca capacidad, sin copia de seguridad y sin límite de tiempo
 
* <code>$WORKDIR</code>: lugar de los códigos y scripts con capacidad limitada y con copia de seguridad y sin límite de tiempo
 
* <code>$SCRATCHDIR</code>: lugar de simulado, con bastante capacidad, sin copia de seguridad y con límite de tiempo (1 mes)
 
* <code>$STOREDIR</code>: lugar de almacenaje, con mucha capacidad, sin copia de seguridad y sin límite de tiempo
 
   
 
== librerías sistema ==
 
== librerías sistema ==
 
Los servidores, suelen tener una gran batería de librerías ya pre instaladas llevado a cabo por los gestores del servidor. No es una tarea obvia, puesto que en un servidor, es clave la eficiencia, así que las librerías se suelen instalar desde los códigos fuentes y para distintas versiones y distintos compiladores. Además, si se escae, con flags de compilación específicos para el servidor. Toda esta complejidad está bien ordenada y hecha accesible para todes les usuaries. Se mantienen múltiples versiones (hasta un punto) para facilitar la reproducibilidad de experimentos antiguos.
 
Los servidores, suelen tener una gran batería de librerías ya pre instaladas llevado a cabo por los gestores del servidor. No es una tarea obvia, puesto que en un servidor, es clave la eficiencia, así que las librerías se suelen instalar desde los códigos fuentes y para distintas versiones y distintos compiladores. Además, si se escae, con flags de compilación específicos para el servidor. Toda esta complejidad está bien ordenada y hecha accesible para todes les usuaries. Se mantienen múltiples versiones (hasta un punto) para facilitar la reproducibilidad de experimentos antiguos.
  +
  +
=== module: gestor de librerías ===
  +
En algunos servidores existe un software dedicado a la gestión de librerías llamado [https://modules.sourceforge.net/ modules]. Dicho sistema está diseñado para un manejo fácil y transparente. El sistema se encarga de definir las variables de compilación (ej. <code>$LD_LIBRARY_PATH</code> y de cargar los módulos dependientes necesarios (ej. compilador de fortran cuando cargando las librerías netCDF)
  +
  +
Se pueden listar las librerías existentes de una determinada librería con:
  +
<PRE style="shell">
  +
$ module avail [librería]
  +
</PRE>
  +
  +
Y después se carga una determinada versión de la librería con
  +
<PRE style="shell">
  +
$ module load [librería]/[N].[M]
  +
</PRE>
  +
  +
Se pueden cambiar las versiones con
  +
<PRE style="shell">
  +
$ module switch [librería]/[P].[Q]
  +
</PRE>
   
 
== entornos: anaconda, conda, miniconda ==
 
== entornos: anaconda, conda, miniconda ==
  +
En un servidor no tenemos capacidad de instalación de nuevos programarios y/o librerías. Para eso es necesario recurrir a los gestores del servidor.
  +
  +
Para evitar este problema y dar libertad a les usuaries, aparecen los entornos tipo de la família conda (ej. [https://docs.anaconda.com/ anaconda]). Con este gestor, se permite instalar programario y librerías directamente por el usuarie de un servidor.
  +
  +
Da mucha facilidad y flexibiliad y su uso es muy extendido y común, siendo a veces, incluso obligado. Ya que la gestión de librerías y programarios está personalizado por el propio usuario. Las personas a cargo del servidor, quedan liberadas de prestar servicio de apoyo y mantenimiento de librerías y software.
  +
  +
Aún así existen algunos inconvenientes:
  +
* Pueden aparecer problemas de incompatibilidades entre paquetes y versiones de librerías
  +
* Con un mal uso, se puede llegar a llenar el <CODE>$HOME</CODE> del usuario, llegando a duplicar en los peores casos todo el sistema operativo
   
 
= Trabajo desde terminal =
 
= Trabajo desde terminal =
  +
En un servidor lo más común es trabajar desde la terminal. Al principio puede ser bastante dificultoso. La edición de archivos de texto (ej. scripts y códigos) se tiene que hacer con editores de terminal (ej. [https://www.vim.org/ vim], [https://www.nano-editor.org/ nano], [https://www.gnu.org/software/emacs/ emacs], ...).
  +
  +
El uso del entorno gráfico está altamante desaconsejado, puesto que el ancho de banda con el servidor, se llena con datos innecesarios, demorando la velocidad de trabajo y la eficiencia.
  +
  +
== escritura de códigos ==
  +
Una forma muy habitual de trabajar, es escribir los códigos a través de un repositorio. Esto nos facilita 2 cosas:
  +
# Copia de seguridad garantizada
  +
# Rápida y fácil actualización de códigos entre múltiplas computadoras
  +
  +
El desarrollo más grande de una script, se puede realizar desde una máquina en local (teniendo una copia en local reducida del trabajo a realizar). Una vez satisfechos, se traslada el trabajo al servidor donde se realizan los últimos retoques.
  +
  +
Por ejemplo, para post-procesar con python una salida de un modelo se puede trbajar:
  +
# Descarga en local de un par de archivos pequeños
  +
# Preparación del script en la máquina en local con los archivos descargados (ej. con spyder)
  +
# Actualización del repositorio una vez terminado
  +
# Ejecución de la script en el servidor desde la terminal
  +
<PRE style="shell">
  +
$ python3 [script].py
  +
</PRE>
   
 
= Distribución espacios de almacenaje =
 
= Distribución espacios de almacenaje =
  +
En un servidor, al ser un espacio compartido, es habitual que muchas de las componentes sean también compartidas.
  +
  +
La configuración estándar de espacios de almacenaje suele ser la siguiente:
  +
* <code>$HOME</code>: punta de entrada al servidor, con poca capacidad, sin copia de seguridad y sin límite de tiempo
  +
* <code>$WORKDIR</code>: lugar de los códigos y scripts con capacidad limitada y con copia de seguridad y sin límite de tiempo
  +
* <code>$SCRATCHDIR</code>: lugar de trabajo, con bastante capacidad, sin copia de seguridad y con límite de tiempo (1 mes), el cuál pasado ese tiempo se borran automáticamente los archivos
  +
* <code>$STOREDIR</code>: lugar de almacenaje, con mucha capacidad, sin copia de seguridad y sin límite de tiempo. En este espacio están los datos comunes y los resultados individuales
  +
  +
{| class="wikitable" style="margin:auto"
  +
|-
  +
! nombre !! capacidad !! copia seguridad !! limite tiempo
  +
|-
  +
| <code>$HOME</code> || baja || no || no
  +
|-
  +
| <code>$WORKDIR</code> || media || sí || no
  +
|-
  +
| <code>$SCRATCHDIR</code> || alta || no || sí
  +
|-
  +
| <code>$STOREDIR</code> || muy alta || no || no
  +
|}
   
 
= Sistema de colas =
 
= Sistema de colas =
Todo trabajo en una máqiuna en remoto y multi-procesador '''tiene que''' ser ejecutado dentro de un trabajo del servidor de colas
+
Todo trabajo en una máquina en remoto y multi-procesador '''tiene que''' ser ejecutado dentro de un trabajo del servidor de colas. Esto incluye desde un modelo a una script de shell/python/...
  +
  +
[[File:Paralelizacion.pdf]]
  +
  +
Si bien un servidor puede tener múltiples procesadores, todes les usuaries, acceden a él, a través de un mismo acceso (ej. <code>hydra</code> en el CIMA). Esta máquina de acceso, maneja todo el servidor (colas, libreriías, compiladores, paralelización, ...). Si les usuaries ejecutan muchos programas en este acceso, relentizan su funcionamento, afectando a la totalidad del servidor.
  +
  +
Un gestor de colas nos garantiza:
  +
* Uso igualitario entre usuaries
  +
* Uso respetuoso
  +
* Uso eficiente del servidor
  +
  +
Al ser un espacio de trabajo compartido, se tiene que garantizar que ningún usuarie entorpezca el trabajo de les otres. Si bien el servidor suele tener múltiple procesadores y gran memoria, los recursos siguen siendo limitados y su uso no puede ser un ''salvaje oeste''. Para evitar esto se utiliza el servidor de colas.
  +
  +
El servidor de colas trabaja a partir del manejo de ''trabajos de colas''. Estos ''trabajos'' contienen el programa que el usuario quiere utilizar y los recursos necesarios (memoria, cantidad de procesadores, tiempo de ejecución, ...) el flujo de trabajo es el siguiente:
  +
# El usuarie manda el trabajo de cola
  +
# El gestor de colas recibe el pedido
  +
# El gestor de colas determina:
  +
## ''ejecución'': Si el servidor tiene los recursos solicitados por el usuarie libres
  +
## ''espera'': Si el servidor no tiene los recursos solicitados, el tabajo se pone en modo esper (se manda ala ''cola'')
  +
# El gestor de colas termina el trabajo si trasnscurrido el tiempo aún no terminado
  +
  +
Hay distintos gestores de colas: [https://slurm.schedmd.com/documentation.html SLURM], [https://en.wikipedia.org/wiki/Portable_Batch_System PBS] (versión libre no mantenida), ...
  +
  +
[[File:SistemaColas.pdf]]
  +
  +
== python ==
  +
Mención especial para python, puesto que cada vez más existen paquetes paralelizados. Dicha paralelización está embebdia y el usuarie no suele prestar mucha atención a su configuración. En la mayoría de los casos (ej. dask), dicha paralelización está basada en ''threads'' (memoria compartida). Si no se configura, la script de python se ejectua en todos los ''cores'' disponibles.
  +
  +
Así que para evitar problemas con el equipo de entrada y manejo del servidor, las scripts de python también se tienen que ejecutar via una script de colas y nunca desde un entorno de programación (ej. spyder).

Última revisión de 15:48 4 jun 2024

Algunas recomendaciones básicas de cómo manejarse con trabajo en un servidor compartido


Contenido

[editar] Consideraciones iniciales

Cuando se trabaja desde un servidor el entorno gráfico NO EXISTE

Un servidor es un recurso compartido
¡¡ Seamos respetuoses con el resto !!

[editar] Acceso

El acceso a los clúster de computación (HPC del Inglés) o servidores se realiza en la mayoría de los casos via ssh

$ ssh [NombreUsuarioenServidor]@[nombreServidor].[domino]

Por ejemplo, el CIMA dispone de un clúster de computación llamado hydra y con el domino cima.fcen.uba.ar. Si Juan Perez quiere acceder a Hydra usa el siguiente comando (al apretar enter, el sistema te pide la clave pero no aparece ningún cursor):

$ ssh juan.perez@hhydra.cima.fcen.uba.ar
juan.perez@hydra.cima.fcen.uba.ar's password:
[juan.perez@hydra ~]$
  • Una vex en el servidor/clúster le usuarie tiene un entorno linux estándard. Al trabajar en un espacio compartido es necesario tener cuidado ya que los cambios podrían afectar a otras personas.
  • Para salir, se usa la instrucción exit
[juan.perez@hydra ~]$ exit
$

[editar] vpn

La virtual private network o VPN nos permite conectarnos de forma segura a un servidor. En frente de la vulnerabilidad de la red, cada vez es más común conectarse a servidores a través de una VPN.

Para ello será necesario contar con una credencial de acceso (dada por la adminstración del recurso al cuál nos queremos conectar). Antes de conectarnos será necesario activar la VPN

[editar] Entorno de trabajo

En un servidor, se tendrá que hacer todo desde la terminal. Puesto que si queremos utilizar una interfaz gráfica (si es que es posible), seremos muy poco eficientes, porque a parte de mandarse las instrucciones por internet, también se tiene que mandar todos los gráficos.

Cuando se entra a un sevidor, se hace directamente al ${HOME} de cada usuarie.

En general, podemos encontrarnos con 2 tipos de servidores: datos, cálculo. Si bien conceptualmente son iguales, presentan distintas singularidades

Lo habitual es cada usuarie tenga una cantidad de recursos designados (espacio en disco, horas de cálculo, ...) si un usuarie supera estos límites, se imposibilita que continúe trabajando hasta que no se solucione el sobreuso.

[editar] Servidor de datos

Estos servidores suelen tener una jerarquía de directorios dentro de los cuáles están bien organizados los datos. Es necesario saber donde se encuentran los datos (desde una web, correo, ...) que queremos porque puede ser muy difícil encontrarnos.

[editar] Servidor de cálculo

Estos servidores suelen tener una jerarquía de directorios cada uno de los cuáles con distintas características y propósitos.

[editar] librerías sistema

Los servidores, suelen tener una gran batería de librerías ya pre instaladas llevado a cabo por los gestores del servidor. No es una tarea obvia, puesto que en un servidor, es clave la eficiencia, así que las librerías se suelen instalar desde los códigos fuentes y para distintas versiones y distintos compiladores. Además, si se escae, con flags de compilación específicos para el servidor. Toda esta complejidad está bien ordenada y hecha accesible para todes les usuaries. Se mantienen múltiples versiones (hasta un punto) para facilitar la reproducibilidad de experimentos antiguos.

[editar] module: gestor de librerías

En algunos servidores existe un software dedicado a la gestión de librerías llamado modules. Dicho sistema está diseñado para un manejo fácil y transparente. El sistema se encarga de definir las variables de compilación (ej. $LD_LIBRARY_PATH y de cargar los módulos dependientes necesarios (ej. compilador de fortran cuando cargando las librerías netCDF)

Se pueden listar las librerías existentes de una determinada librería con:

$ module avail [librería]

Y después se carga una determinada versión de la librería con

$ module load [librería]/[N].[M]

Se pueden cambiar las versiones con

$ module switch [librería]/[P].[Q]

[editar] entornos: anaconda, conda, miniconda

En un servidor no tenemos capacidad de instalación de nuevos programarios y/o librerías. Para eso es necesario recurrir a los gestores del servidor.

Para evitar este problema y dar libertad a les usuaries, aparecen los entornos tipo de la família conda (ej. anaconda). Con este gestor, se permite instalar programario y librerías directamente por el usuarie de un servidor.

Da mucha facilidad y flexibiliad y su uso es muy extendido y común, siendo a veces, incluso obligado. Ya que la gestión de librerías y programarios está personalizado por el propio usuario. Las personas a cargo del servidor, quedan liberadas de prestar servicio de apoyo y mantenimiento de librerías y software.

Aún así existen algunos inconvenientes:

  • Pueden aparecer problemas de incompatibilidades entre paquetes y versiones de librerías
  • Con un mal uso, se puede llegar a llenar el $HOME del usuario, llegando a duplicar en los peores casos todo el sistema operativo

[editar] Trabajo desde terminal

En un servidor lo más común es trabajar desde la terminal. Al principio puede ser bastante dificultoso. La edición de archivos de texto (ej. scripts y códigos) se tiene que hacer con editores de terminal (ej. vim, nano, emacs, ...).

El uso del entorno gráfico está altamante desaconsejado, puesto que el ancho de banda con el servidor, se llena con datos innecesarios, demorando la velocidad de trabajo y la eficiencia.

[editar] escritura de códigos

Una forma muy habitual de trabajar, es escribir los códigos a través de un repositorio. Esto nos facilita 2 cosas:

  1. Copia de seguridad garantizada
  2. Rápida y fácil actualización de códigos entre múltiplas computadoras

El desarrollo más grande de una script, se puede realizar desde una máquina en local (teniendo una copia en local reducida del trabajo a realizar). Una vez satisfechos, se traslada el trabajo al servidor donde se realizan los últimos retoques.

Por ejemplo, para post-procesar con python una salida de un modelo se puede trbajar:

  1. Descarga en local de un par de archivos pequeños
  2. Preparación del script en la máquina en local con los archivos descargados (ej. con spyder)
  3. Actualización del repositorio una vez terminado
  4. Ejecución de la script en el servidor desde la terminal
$ python3 [script].py

[editar] Distribución espacios de almacenaje

En un servidor, al ser un espacio compartido, es habitual que muchas de las componentes sean también compartidas.

La configuración estándar de espacios de almacenaje suele ser la siguiente:

  • $HOME: punta de entrada al servidor, con poca capacidad, sin copia de seguridad y sin límite de tiempo
  • $WORKDIR: lugar de los códigos y scripts con capacidad limitada y con copia de seguridad y sin límite de tiempo
  • $SCRATCHDIR: lugar de trabajo, con bastante capacidad, sin copia de seguridad y con límite de tiempo (1 mes), el cuál pasado ese tiempo se borran automáticamente los archivos
  • $STOREDIR: lugar de almacenaje, con mucha capacidad, sin copia de seguridad y sin límite de tiempo. En este espacio están los datos comunes y los resultados individuales
nombre capacidad copia seguridad limite tiempo
$HOME baja no no
$WORKDIR media no
$SCRATCHDIR alta no
$STOREDIR muy alta no no

[editar] Sistema de colas

Todo trabajo en una máquina en remoto y multi-procesador tiene que ser ejecutado dentro de un trabajo del servidor de colas. Esto incluye desde un modelo a una script de shell/python/...

Archivo:Paralelizacion.pdf

Si bien un servidor puede tener múltiples procesadores, todes les usuaries, acceden a él, a través de un mismo acceso (ej. hydra en el CIMA). Esta máquina de acceso, maneja todo el servidor (colas, libreriías, compiladores, paralelización, ...). Si les usuaries ejecutan muchos programas en este acceso, relentizan su funcionamento, afectando a la totalidad del servidor.

Un gestor de colas nos garantiza:

  • Uso igualitario entre usuaries
  • Uso respetuoso
  • Uso eficiente del servidor

Al ser un espacio de trabajo compartido, se tiene que garantizar que ningún usuarie entorpezca el trabajo de les otres. Si bien el servidor suele tener múltiple procesadores y gran memoria, los recursos siguen siendo limitados y su uso no puede ser un salvaje oeste. Para evitar esto se utiliza el servidor de colas.

El servidor de colas trabaja a partir del manejo de trabajos de colas. Estos trabajos contienen el programa que el usuario quiere utilizar y los recursos necesarios (memoria, cantidad de procesadores, tiempo de ejecución, ...) el flujo de trabajo es el siguiente:

  1. El usuarie manda el trabajo de cola
  2. El gestor de colas recibe el pedido
  3. El gestor de colas determina:
    1. ejecución: Si el servidor tiene los recursos solicitados por el usuarie libres
    2. espera: Si el servidor no tiene los recursos solicitados, el tabajo se pone en modo esper (se manda ala cola)
  4. El gestor de colas termina el trabajo si trasnscurrido el tiempo aún no terminado

Hay distintos gestores de colas: SLURM, PBS (versión libre no mantenida), ...

Archivo:SistemaColas.pdf

[editar] python

Mención especial para python, puesto que cada vez más existen paquetes paralelizados. Dicha paralelización está embebdia y el usuarie no suele prestar mucha atención a su configuración. En la mayoría de los casos (ej. dask), dicha paralelización está basada en threads (memoria compartida). Si no se configura, la script de python se ejectua en todos los cores disponibles.

Así que para evitar problemas con el equipo de entrada y manejo del servidor, las scripts de python también se tienen que ejecutar via una script de colas y nunca desde un entorno de programación (ej. spyder).

Herramientas personales