코딩하는 문과생

[리눅스] CPU 점유율 높은 프로세스 찾기 본문

개발 관련 지식/리눅스

[리눅스] CPU 점유율 높은 프로세스 찾기

코딩하는 문과생 2022. 12. 19. 22:38

[서론]

본인이 속한 팀에서는 배치서버를 사용하여 대용량 데이터의 집계를 하거나 타 시스템과 데이터를 주고 받는다. 그러나 최근 들어 9시, 10시, 11시 등 정각에 특정 프로세스의 CPU 100% 점유가 5분 이상 지속되는 등 특정 시간에 일부 배치가 몰려 있어 각 업무별 배치의 스케줄링 조정이 필요했다. 

 

[본론]

대처방안은 아래와 같다.

1. 서버 추가 및 장비 업그레이드

본인 팀에는 배치서버가 2개 있다. 1번기가 Main이며, 2번기는 failover를 위해 항시 대기중인 서버이다. 다만 1번기의 프로세스들의 cpu점유율이 너무 높아 cpu 코어를 업그레이드 하거나 신규 서버를 추가하는 방안이 고려되긴 했지만, 결국 물리적 장비를 추가 또는 업그레이드하는 건 비용적 측면을 고려해야 한다는 점에서 기각되었다.

 

2. 2번기를 활용하자

각 업무별 데이터 검증배치가 있다. 해당 검증배치는 시스템을 운영하는데 있어 크리티컬하지 않으므로, 검증배치만 2번기에서 작동시켜도 cpu 점유율이 낮춰질거라는 서버파트의 판단이 있었다. 따라서 각 업무별 검증배치 스케줄을 1번기 crontab에서 제거하고 2번기 crontab으로 재설정하였다.

 

3. cpu 과점유 프로세스 찾기

한동안 100% 과점유가 없었지만, 얼마지나지 않아 1번기에서 또 매 정각마다 cpu 100% 점유가 약 5분간 지속되었다. 따라서 추가로 고려한 방안은 cpu 과점유 배치만 2번기로 추가로 더 이관하는 방안을 현재 고려하고 있다. 어떤 프로세스가 cpu를 지속적으로 과점유하는지 추출하기 위해 하기 쉘 스크립트작성 후 crontab으로 지정하여 과점유 배치리스트와 cpu 점유율을 확인할 수 있도록 하였다.

 

- 스크립트 작성(/plugin/bin/cpuTooMuch.sh)

#!/bin/ksh
 
Ttime()
{
     TODAY=$(date +"%y%m%d")
     TM=$(date +"%Y/%m/%d %H:%M")
}
 
Ttime
 
for vv in {1..1000}
do
    for i in `top -cbn 1 | grep "^ " | grep 배치를돌리는계정명  | head -n 10 | awk '{ print $1 ":" $9 }'`
    do
        tarPid=`echo $i | awk -F ":" '{ print $1}'  `
        tarCpu=`echo $i | awk -F ":" '{ print $2}'  `
 
        echo ${tarPid}
        echo ${tarCpu}
        if [[ tarCpu -gt 30 ]]; then
            echo `echo -e "${TM}\t\c"; echo -e "${tarCpu}\t\c"; ps -efq $tarPid | grep 배치를돌리는계정명 | awk '{ print $5 "\t" $7 "\t" $21 }'` >> /plugin/TPF/${TODAY}.log
        fi
    done
    sleep 1
done

 

- 크론탭 지정

$ crontab -e
# 아래 스케줄링 추가
# 00 09,10 * * * /plugin/bin/cpuTooMuch.sh

/plugin/TPF 폴더에 금일 날짜로 로그가 생성된다.

 

추출 대상 중 일부 배치를 2번기로 추가 이관할 예정이다. (22.12.19)