Hace unos días comenté algo acerca del procesamiento paralelo en bash.
Hoy he tenido que hacer un pequeño script para realizar unos dump de subversion, y al medir tiempos por temas de ventanas de copias, me he encontrado con que el proceso de realizar las copias de todos mis repos consumía un tiempo de aproximadamente 2.30h, lo cual me ha dejado un poco mosca al irme a casa.
No se pero se me había metido en la cabeza que podía ser más rápido, y una cosa a llevado a la otra y al final he acabado pensando en la posibilidad de lanzar estos scripts en paralelo, lo cual tiene gracia ya que la máquina en cuestión tiene un solo core ;) (Por lo que la ganancia sería 0) pero bueno me ha dado por darle vueltas al tema.
Así que me he puesto y al final he hecho otro script, en el que si tengo presente el número de cores disponibles.
No he podido probarlo, pero intentaré hacerlo en breve montando alguna maquena en VirtualBox. (Cuando tenga tiempo y ganas ;))
Estos son los scripts que repito. No se si funciona el segundo de ellos, pero como ejemplo del anterior post creo que es valido.
Script sin paralelización:
#Definimos el array que contendrá los repos
typeset -a A_REPOS
#Obtenemos el numero de repos (Directorios, sin el directorio de copias ni el "." o el "..")
let NUM_REPOS=`ls -l|grep "drwx"|grep -v "DUMP_BACKS"|tr -s ' ' |cut -d ' ' -f 9|tr -s '.'|cut -d '.' -f 1|wc -l`
#Obtenemos una lista de los repos
REPOS=`ls -l|grep "drwx"|grep -v "DUMP_BACKS"|tr -s ' ' |cut -d ' ' -f 9|tr -s '.'|cut -d '.' -f 1`
let num=1
#Llenamos el array con los elementos de la lista de repos
while [ $num -le $NUM_REPOS ]; do
A_REPOS[$num]=`echo $REPOS|tr -s ' ' |cut -d ' ' -f $num`
let num=num+1
done
num=1
#Para cada posicion del array lanzamos un dump
while [ $num -le $NUM_REPOS ]; do
#echo ${A_REPOS[$num]}
svnadmin dump ${A_REPOS[$num]}|gzip -9 > ${A_REPOS[$num]}".gz"
let num=num+1
done
Script con paralelización:
#Definimos el array que contendrá los repos
typeset -a A_REPOS
#Obtenemos el numero de repos (Directorios, sin el directorio de copias ni el "." o el "..")
let NUM_REPOS=`ls -l|grep "drwx"|grep -v "DUMP_BACKS"|tr -s ' ' |cut -d ' ' -f 9|tr -s '.'|cut -d '.' -f 1|wc -l`
#Obtenemos una lista de los repos
REPOS=`ls -l|grep "drwx"|grep -v "DUMP_BACKS"|tr -s ' ' |cut -d ' ' -f 9|tr -s '.'|cut -d '.' -f 1`
let num=1
#Definimos el numero de procesadores de muestra maquina
let PMAX=(`ls -ld /sys/devices/system/cpu/cpu*|wc -l`)-1
#definimos un array con el numero de cores
typeset REPOS_CORE[$PMAX]
#Llenamos el array con los elementos de la lista de repos
while [ $num -le $NUM_REPOS ]; do
A_REPOS[$num]=`echo $REPOS|tr -s ' ' |cut -d ' ' -f $num`
let num=num+1
done
num=1
pos=1
while [ $num -le $NUM_REPOS ]; do
#Llenamos un array con tantos elementos como procesadores
REPOS_CORE[$pos]=${A_REPOS[$num]}
#Cuando esta lleno lanzamos los procesos y colocamos la posicion a 1 para volver a llenarlo
if [ $pos -eq $PMAX ] then
for i in REPO_CORE; do
svnadmin dump $i|gzip -9 > $i."gz" &
pos=0
wait
done
fi
let num=num+1
let pos=pos+1
done
Los colores indican las diferencias entre uno y otro.
Básicamente cuando tenemos el array con los nombres de los repos, vamos llenando otro hasta tener tantos elementos como cores, en ese momento lanzamos todos los dump y colocamos la posición, a 0 para que se coloque a 1, y repetir el proceso.
De este modo conseguimos lanzar varios dump al mismo tiempo, con lo que con el tiempo del mayor, realizaremos los demás. (Creo)
NOTA: Repito y no me cansaré de hacerlo ;), que el segundo script NO ESTÁ TESTEADO, básicamente es una idea que pienso que puede funcionar.
Mostrando entradas con la etiqueta Subversion. Mostrar todas las entradas
Mostrando entradas con la etiqueta Subversion. Mostrar todas las entradas
viernes, 3 de julio de 2009
viernes, 5 de septiembre de 2008
Apache + Subversion. Una pareja interesante ;)
Desde hace ya bastante tiempo estaba pensando en montar algún tipo de sistema para control de versiones, ya que llega un punto en que se me están haciendo ingestionables.
Por otro lado también me resultaba interesante, poder acceder a estas versiones desde cualquier parte, fué por estos motivos por los que me decante por algun soft. de control de versiones, integrable con apache, y como ya había trabajado con Subversion.. la decisión era bastante clara.
Introducción.
Se va ha configurar Apache para que "arranque" Subversion como un modulo más, dentro del proceso "httpd"
Este documento está realizado en un sistema Centos 4.
[root@nodo1 ~]# uname -a
Linux nodo1 2.6.18-92.1.1.el5.028stab057.2 #1 SMP Mon Jul 21 20:55:45 MSD 2008 i686 i686 i386 GNU/Linux
Con Apache 2
[root@nodo1 ~]# httpd -v
Server version: Apache/2.2.3 Server built: Jan 15 2008 20:33:30
How-To.
1.- Lo primero que necesitamos evidentemente es tener instalado Apache2, sobre este punto no vamos a incidir ya que lo tenía instalado desde la instalación del sistema. Basta con decir que se puede realizar, compilando los fuentes, desde RPM's o yum, etc..
2.- Lo siguiente es instalar los modulos de subversion que vamos a cargar junto con Apache.
mod_dav_svn
subversion
[root@nodo1 ~]# yum install mod_dav_svn subversion
.....
=============================================================================
Package Arch Version Repository Size ============================================================================= Installing: mod_dav_svn i386 1.4.2-2.el5 base 70 k
Installing for dependencies: subversion i386 1.4.2-2.el5 base 2.3 M Transaction Summary
=============================================================================
Install 2 Package(s) Update 0 Package(s) Remove 0 Package(s) Total download size: 2.4 M Is this ok [y/N]: y
3.- Hay que asegurarse también que Apache esta configurado para arrancar en los niveles de ejecución que nos interesen.
[root@nodo1 ~]# chkconfig --list httpd
httpd 0:desactivado 1:desactivado 2:desactivado 3:desactivado 4 :desactivado 5:desactivado 6:desactivado
En nuestro caso el 345
[root@nodo1 ~]# chkconfig --level 345 httpd on
4.- Ahora vamos a modificar los ficheros de configuración para adaptarlos a nuestras necesidades, tanto el httpd.conf como el fichero de configuracion de subversion en conf.d, que se ha creado automaticamente, en la instalación anterior
En el fichero de conf de Apache, he optado por crear un nuevo VirtualHost para esta prueba.
<VirtualHost 192.168.150.128:80>
ServerAdmin maalgi@ono.com
DocumentRoot "/var/www/html/svn"
ServerName 192.168.150.128
ErrorLog logs/error_svn_log
CustomLog logs/access_svn_log combined
<Directory "/var/www/html/svn">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
Evidentemente esto se puede afinar tanto como se quiera, pero para realizar la prueba me valia con esto, ;)
Ahora hay que hacer unas pequeñas modificaciones en el fichero de configuracion propio de subversion.
[root@nodo1 conf.d]# vi /etc/httpd/conf.d/subversion.conf
Si estas lineas no están o están comentadas, hay que meterlas, ya que son las encardas de cargar los modulos.
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
Hay que añadir al final del fichero lo siguiente.
<Location /repos >
DAV svn
SVNPath /var/www/html/svn/repos
AuthType Basic
AuthName "Subversion repos"
AuthUserFile /etc/svn-auth-conf
Require valid-user
</Location >
Aquí indicamos entre otras cosas el fichero de passworsd que se usuará para el login, el tipo de autenticación, y el directorio del repositorio.
5.- Ahora vamos a crear el repositorio que usaremos para esta prueba. Lo creamos dentro de la estructura de directorios que usa por defecto el Apache como DocumentRoot, para agilizar aunque claro está se podria modificar.
[root@nodo1 ~]# cd /var/www/html/
[root@nodo1 html]# mkdir svn
[root@nodo1 html]# chmod 755 svn
[root@nodo1 html]# cd svn
[root@nodo1 svn]# svnadmin create repos
[root@nodo1 svn]# chown -R apache:apache /var/www/html/svn
6.- Vamos ha crear usuarios para poder acceder a los repositorios.
[root@nodo1 conf.d]# htpasswd -cm /etc/svn-auth-conf celtha_svn
New password:
Re-type new password:
Adding password for user celtha_svn
El resto de usuarios se añadiran igual pero sin el parametro "c"
7.- Ya estamos en condiciones de iniciar, o reiniciar el servidor http.
root@nodo1 ~]# /etc/init.d/httpd restart
Parando httpd: [FALLÃ]
Iniciando httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
[ OK ]
NOTA.
Tube bastantes problemas a la hora de conseguir cargar los modulos de subversion, ya que estaba intentando hacer que se gargarran en el httpd.conf con un LoadModule, en lugar de desde el subversion.conf , jejeje un pequeño error ;)
Por otro lado en el SVNPath, en lugar de poner la ruta, /var/www/html/svn/repos, ponia /var/www/http/svn/repos, y no conseguia verlo ;)
NOTA2.
El uso de la aplicación está fuera de lo que intentaba plasmar este documento, solo comentar que desde Windows una bueno aplicacion para la explotación de este sistema es tortoisesvn
Tambien se puede hacer desde consola claro:
[root@nodo1 svn]# svn import /tmp/prueba_subversion/ file:///var/www/html/svn/repos/prueba_subversion -m "Repo para pruebas"
Añadiendo /tmp/prueba_subversion/uno
Añadiendo /tmp/prueba_subversion/uno/uno1
Añadiendo /tmp/prueba_subversion/uno/uno1/hola.txt
Añadiendo /tmp/prueba_subversion/dos
Añadiendo /tmp/prueba_subversion/dos/uno1
Añadiendo /tmp/prueba_subversion/tres
Commit de la revisión 1.
El acceso web se ve de este modo :)
Por otro lado también me resultaba interesante, poder acceder a estas versiones desde cualquier parte, fué por estos motivos por los que me decante por algun soft. de control de versiones, integrable con apache, y como ya había trabajado con Subversion.. la decisión era bastante clara.
Introducción.
Se va ha configurar Apache para que "arranque" Subversion como un modulo más, dentro del proceso "httpd"
Este documento está realizado en un sistema Centos 4.
[root@nodo1 ~]# uname -a
Linux nodo1 2.6.18-92.1.1.el5.028stab057.2 #1 SMP Mon Jul 21 20:55:45 MSD 2008 i686 i686 i386 GNU/Linux
Con Apache 2
[root@nodo1 ~]# httpd -v
Server version: Apache/2.2.3 Server built: Jan 15 2008 20:33:30
How-To.
1.- Lo primero que necesitamos evidentemente es tener instalado Apache2, sobre este punto no vamos a incidir ya que lo tenía instalado desde la instalación del sistema. Basta con decir que se puede realizar, compilando los fuentes, desde RPM's o yum, etc..
2.- Lo siguiente es instalar los modulos de subversion que vamos a cargar junto con Apache.
mod_dav_svn
subversion
[root@nodo1 ~]# yum install mod_dav_svn subversion
.....
=============================================================================
Package Arch Version Repository Size ============================================================================= Installing: mod_dav_svn i386 1.4.2-2.el5 base 70 k
Installing for dependencies: subversion i386 1.4.2-2.el5 base 2.3 M Transaction Summary
=============================================================================
Install 2 Package(s) Update 0 Package(s) Remove 0 Package(s) Total download size: 2.4 M Is this ok [y/N]: y
3.- Hay que asegurarse también que Apache esta configurado para arrancar en los niveles de ejecución que nos interesen.
[root@nodo1 ~]# chkconfig --list httpd
httpd 0:desactivado 1:desactivado 2:desactivado 3:desactivado 4 :desactivado 5:desactivado 6:desactivado
En nuestro caso el 345
[root@nodo1 ~]# chkconfig --level 345 httpd on
4.- Ahora vamos a modificar los ficheros de configuración para adaptarlos a nuestras necesidades, tanto el httpd.conf como el fichero de configuracion de subversion en conf.d, que se ha creado automaticamente, en la instalación anterior
En el fichero de conf de Apache, he optado por crear un nuevo VirtualHost para esta prueba.
ServerAdmin maalgi@ono.com
DocumentRoot "/var/www/html/svn"
ServerName 192.168.150.128
ErrorLog logs/error_svn_log
CustomLog logs/access_svn_log combined
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
Evidentemente esto se puede afinar tanto como se quiera, pero para realizar la prueba me valia con esto, ;)
Ahora hay que hacer unas pequeñas modificaciones en el fichero de configuracion propio de subversion.
[root@nodo1 conf.d]# vi /etc/httpd/conf.d/subversion.conf
Si estas lineas no están o están comentadas, hay que meterlas, ya que son las encardas de cargar los modulos.
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
Hay que añadir al final del fichero lo siguiente.
<
SVNPath /var/www/html/svn/repos
AuthType Basic
AuthName "Subversion repos"
AuthUserFile /etc/svn-auth-conf
Require valid-user
Aquí indicamos entre otras cosas el fichero de passworsd que se usuará para el login, el tipo de autenticación, y el directorio del repositorio.
5.- Ahora vamos a crear el repositorio que usaremos para esta prueba. Lo creamos dentro de la estructura de directorios que usa por defecto el Apache como DocumentRoot, para agilizar aunque claro está se podria modificar.
[root@nodo1 ~]# cd /var/www/html/
[root@nodo1 html]# mkdir svn
[root@nodo1 html]# chmod 755 svn
[root@nodo1 html]# cd svn
[root@nodo1 svn]# svnadmin create repos
[root@nodo1 svn]# chown -R apache:apache /var/www/html/svn
6.- Vamos ha crear usuarios para poder acceder a los repositorios.
[root@nodo1 conf.d]# htpasswd -cm /etc/svn-auth-conf celtha_svn
New password:
Re-type new password:
Adding password for user celtha_svn
El resto de usuarios se añadiran igual pero sin el parametro "c"
7.- Ya estamos en condiciones de iniciar, o reiniciar el servidor http.
root@nodo1 ~]# /etc/init.d/httpd restart
Parando httpd: [FALLÃ]
Iniciando httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
[ OK ]
NOTA.
Tube bastantes problemas a la hora de conseguir cargar los modulos de subversion, ya que estaba intentando hacer que se gargarran en el httpd.conf con un LoadModule, en lugar de desde el subversion.conf , jejeje un pequeño error ;)
Por otro lado en el SVNPath, en lugar de poner la ruta, /var/www/html/svn/repos, ponia /var/www/http/svn/repos, y no conseguia verlo ;)
NOTA2.
El uso de la aplicación está fuera de lo que intentaba plasmar este documento, solo comentar que desde Windows una bueno aplicacion para la explotación de este sistema es tortoisesvn
Tambien se puede hacer desde consola claro:
[root@nodo1 svn]# svn import /tmp/prueba_subversion/ file:///var/www/html/svn/repos/prueba_subversion -m "Repo para pruebas"
Añadiendo /tmp/prueba_subversion/uno
Añadiendo /tmp/prueba_subversion/uno/uno1
Añadiendo /tmp/prueba_subversion/uno/uno1/hola.txt
Añadiendo /tmp/prueba_subversion/dos
Añadiendo /tmp/prueba_subversion/dos/uno1
Añadiendo /tmp/prueba_subversion/tres
Commit de la revisión 1.
El acceso web se ve de este modo :)
Suscribirse a:
Entradas (Atom)