클러스터의 작업 사용량 정보 수집

클러스터의 작업 사용량 정보 수집

수백 명의 다른 사용자가 공유하는 Linux 클러스터에서 시뮬레이션을 실행하고 있습니다. 누가 실행 중인지 결정하는 작업 스케줄러가 클러스터에 설치되어 있으며, 스케줄러 명령 중 하나( showq)는 모든 활성 작업, 유휴 작업, 차단된 작업 등의 목록을 표시합니다. 해당 출력을 처리하여 언제든지 작업을 실행하는 고유 사용자 수 등을 확인하고 싶습니다. 다음은 showq -r실행 중인 작업을 보여주는 몇 가지 출력 예입니다 .

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           

구체적으로 다음을 계산하고 싶습니다.

  1. 작업을 실행하는 고유 사용자 수 및 사용자당 실행 중인 작업 수(그룹에도 동일한 작업을 수행하고 싶지만 일단 사용자에 대해 수행하면 이는 쉽지 않습니다.)
  2. PROCS사용자/그룹이 점유하는 프로세서 코어 수( )
  3. 사용자/그룹에 대해 실행 중인 PROC=1직렬( ) 및 병렬( ) 작업 수PROC>1

awkPython에서는 이 작업을 매우 쉽게 수행할 수 있지만 / sed또는 다른 Linux 명령을 조합 하여 수행하고 싶습니다 . 매끄러운 농담이 나를 행복하게 만듭니다 :-)

답변1

가장 먼저 해야 할 일은 의 출력에서 ​​원하지 않는 줄 showq -r, 즉 활성 작업을 나타내는 줄 등을 제거하는 것입니다. 이는 를 사용하여 수행할 수 있거나 데이터 행의 일부를 설명하는 정규 표현식을 showq -r | sed '1,2d' |sed '$d'사용할 수 있습니다 . 예를 들어 이 경우 값이 항상 이면 작동할 수 있습니다 . 데이터 행만 포함된 파일이 있으면 다음을 사용할 수 있습니다.grepgrep "----"EFFIC----associative arrays in awk나머지 마법을 완료하세요.

#!/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] }
}

위의 스크립트를 실행하면 직렬 프로세서 수가 표시되지 않음을 알 수 있습니다 user_z. 줄 수를 저장하고 0거기에 a를 인쇄하지 않으려고 하기 때문입니다. 오류 검사를 추가하고 출력을 예쁘게 만드는 것은 여러분의 몫입니다.

답변2

먼저 다음 스크립트를 저장하고 chmod +x 이름을 지정 하십시오 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);
}

다음 형식을 사용해야 합니다.

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

출력은 다음과 같습니다

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!

관련 정보