Loop Mounting in Parallel

3

Estou fazendo um projeto no qual preciso montar mais de 100 dispositivos de loop e mesclá-lo no ponto de montagem do AUFS Como observação, para montar sequencialmente 90 dispositivos de loop, leva 25 segundos.

Estou procurando uma solução que minimize o tempo montando dispositivos de loop em paralelo

    
por SHW 09.08.2013 / 09:19

3 respostas

5

Eu acho que isso é óbvio, mas

typeset -i M=1
while [ $M -le 102 ]
  do
    mount mysourcedevice$M targetdir$M &
    let M++
done
wait

Deve fazer o trabalho. O wait esperará até que todo sub-processo seja finalizado, antes de executar o próximo comando.

    
por 09.08.2013 / 12:31
4

Talvez uma versão encadeada possa ser um pouco mais rápida, você mesmo precisa ajustar os parâmetros mount() .

#include <stdio.h>
#include <pthread.h>
#include <sys/mount.h>
#include <string.h>
#include <errno.h>

#define DEVS 100

static void *mountt(void *d)
{
    int i = (int)d;
    char loop[48], mp[48];

    snprintf(loop, 47, "/dev/loop%d", i);
    snprintf(mp, 47, "/mnt/%d", i);

    if (mount(loop, mp, "ext2", MS_MGC_VAL | MS_RDONLY | MS_NOSUID, "") < 0)
        fprintf(stderr, "mount[%d]: failed: %s\n", i, strerror(errno));

    return NULL;
}

int main(int argc, char **argv)
{
    int i;
    pthread_t tt[DEVS];

    for (i=0; i<DEVS; i++) {
        if (pthread_create( &tt[i], NULL, mountt, (void*)i) != 0)
            fprintf(stderr, "thread create[%d] failed: %s\n", i, strerror(errno));
    }

    for (i=0; i<DEVS; i++)
        pthread_join(tt[i], NULL);

    return 0;
}

gcc -O2 -Wall -o mountt mountt.c -lpthread

    
por 12.08.2013 / 10:09
0

Usando o GNU Parallel, é assim:

seq 100 | parallel -j0 mount device{} dir{}

Se você tem uma lista de diretórios:

parallel -j0 mount device{#} {} ::: dirs*

Se você tem uma lista de dispositivos:

parallel -j0 'mkdir -p dir{#}; mount {} dir{#}' ::: device*

O GNU Parallel é um paralelizador geral e facilita a execução de trabalhos em paralelo na mesma máquina ou em várias máquinas para as quais você tem acesso ssh. Muitas vezes, pode substituir um loop for .

Se você tem 32 tarefas diferentes que você quer rodar em 4 CPUs, uma forma direta de paralelizar é rodar 8 tarefas em cada processador:

O

GNUParallelgeraumnovoprocessoquandoumtermina-mantendoasCPUsativaseeconomizandotempo:

Instalação

Se o GNU Parallel não for empacotado para sua distribuição, você poderá fazer uma instalação pessoal, que não requer acesso root. Isso pode ser feito em 10 segundos ao fazer isso:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

Para outras opções de instalação, consulte o link

Saiba mais

Veja mais exemplos: link

Assista aos vídeos de introdução: link

Percorra o tutorial: link

Inscreva-se na lista de e-mail para obter suporte: link

    
por 10.06.2016 / 20:03