Reúna informações de uso de trabalho no cluster

2

Estou executando simulações em um cluster Linux compartilhado por centenas de outros usuários. Existe um agendador de tarefas instalado no cluster que determina quem é executado e um dos comandos do agendador ( showq ) exibe uma lista de todos os trabalhos ativos, inativos, bloqueados, etc. Gostaria de processar essa saída para determinar coisas como o número de usuários únicos executando trabalhos em qualquer ponto. Aqui está uma amostra de alguma saída de showq -r , que mostra os trabalhos em execução:

active jobs------------------------
JOBID               S  PAR  EFFIC  XFACTOR  Q  USERNAME    GROUP            MHOST PROCS   REMAINING            STARTTIME 
123456              R  bas  -----    1.0    -   user_X    group_A            n1     8    4:00:00  Fri Sep 19 17:25:05
123457              R  bas  -----    1.0    -   user_Y    group_B            n2     16    4:00:00  Fri Sep 19 17:25:05  
123458              R  bas  -----    1.0    -   user_Y    group_B            n3     1    4:00:00  Fri Sep 19 17:25:05 
123459              R  bas  -----    1.0    -   user_X    group_A            n4     1    4:00:00  Fri Sep 19 17:25:05 
123460              R  bas  -----    1.0    -   user_X    group_A            n5     2    4:00:00  Fri Sep 19 17:25:05 
123461              R  bas  -----    1.0    -   user_Z    group_A            n6     4    4:00:00  Fri Sep 19 17:25:05 
......

5000 active jobs           

Especificamente, gostaria de calcular:

  1. O número de usuários únicos executando trabalhos e quantos trabalhos cada usuário está executando (também gostaria de fazer o mesmo para grupos, mas isso será trivial quando você fizer isso com os usuários)
  2. O número de núcleos de processador ( PROCS ) que um usuário / grupo está ocupando
  3. O número de trabalhos em série ( PROC=1 ) e paralelos ( PROC>1 ) que um usuário / grupo está executando

Eu poderia fazer isso no Python com bastante facilidade, mas gostaria de retirá-lo usando uma combinação de awk / sed ou outros comandos do Linux. Slick one-liners me faz feliz :-)

    
por commanderdata 20.09.2014 / 00:48

2 respostas

0

A primeira coisa que você precisa fazer é remover as linhas indesejadas da saída de showq -r , ou seja, linhas que dizem tarefas ativas, etc., que podem ser feitas usando showq -r | sed '1,2d' |sed '$d' , ou você pode usar grep com uma expressão regular que descreve parte da linha de dados - por exemplo grep "----" neste caso pode funcionar se o valor de EFFIC for sempre ---- . Quando você tiver um arquivo com apenas linhas de dados, use associative arrays in awk fazer o resto da magia.

#!/bin/awk

{ 
  proc_count[$7] = proc_count[$7] + $10;        
  if ($10 > 1) { multi_proc[$7]++; } else { single_proc[$7]++;  }
}
END { 
  for (foo in proc_count) { print foo, proc_count[foo], multi_proc[foo], single_proc[foo] }
}

Se você executar o script acima, você notará que nada é exibido para a contagem do processador serial de user_z . Isso porque eu estava tentando salvar linhas e não imprimi 0 . Vou deixar que você adicione a verificação de erros e prettifique a saída.

    
por 20.09.2014 / 03:10
0

Primeiro, armazene o seguinte script e chmod +x para ele. Suponha que o nome seja job_processor.awk :

#!/usr/bin/gawk  -f
## $7 username
## $8 groupname
## $10 procs
{
if ( $10 == 1 )
    printf ("username: %s and groupname: %s are serial!\n",$7,$8);
else if  ( $10 > 1 )
    printf ("username: %s and groupname: %s are parallel!\n",$7,$8);



printf ("username: %s and groupname: %s with  procs: %d!\n",$7,$8,$10);
}

você tem que usar o seguinte formato:

cat jobs |./job_process.awk |sed '1,2d' |sed '$d'

A saída é:

username: user_X and groupname: group_A are parallel!
username: user_X and groupname: group_A with  procs: 8!
username: user_Y and groupname: group_B are parallel!
username: user_Y and groupname: group_B with  procs: 16!
username: user_Y and groupname: group_B are serial!
username: user_Y and groupname: group_B with  procs: 1!
username: user_X and groupname: group_A are serial!
username: user_X and groupname: group_A with  procs: 1!
username: user_X and groupname: group_A are parallel!
username: user_X and groupname: group_A with  procs: 2!
username: user_Z and groupname: group_A are parallel!
username: user_Z and groupname: group_A with  procs: 4!
    
por 20.09.2014 / 02:14