Python/Python for Linux

[ Python ] 리눅스 mpstat 유틸을 이용한 CPU Core별 통계 뽑기. (평균값, 최대값, 최소값)

Pydole 2023. 5. 14. 22:39

 

 

Datebase CPU Core 증설작업 후 Core별로 CPU가 모두 활동하는지 확인해볼 필요가 생겼다.

 

리눅스의 mpstat는 Core 별 사용량을 모니터링할 수 있다. 결과를 파일로 export 하고, Python을 하여 DataFrame화

 

하려 한다. 

 

DataFrame 하게 되면 DB, NoSQL 등에 저장하여 통계적으로 활용할 수 있겠다.

 

 

목표 : 리눅스의 mpstat 유틸과 python을 이용하여 Core 별 통계 추출 

 


 

mpstat 명령어를 이용한 데이터 수집 ( 파일 리다이랙션 )

 

# 1초간격으로 모든 CPU Core 사용량을 추출 (리눅스 명령)
# Output File : cpu_result_final.txt

mpstat -P ALL 1 >> cpu_result_final.txt



%usr은 어플리케이션에서 사용되는 CPU 사용율을 볼 수 있는데, 이 지표를 활용해 보기로 한다.

 

16core mpstat 실행 예

 


 

 

수집하고 시간만큼 파일에 저장하고, Python으로 전처리 한다.

 

# 파일을 열어 라인별로 리스트 변환
# readlines() : 라인별로 읽어 리스트로 변환하는 메소드

with open('cpu_result_final.txt') as f:
    lines = f.readlines()

 

# 공백을 split하여 리스트 요소가 13인 것만 추출 (CPU, all이 포함된 문자열은 제외)
# 사전 형태로 생성하는데, Core는 Key가 되고, %usr은 Value 값이 되어 리스트에 계속 append

dct = {}

for i in lines:
    i = i.split()
    
    if len(i) == 13:  
        if 'CPU' in i:
            pass
    
        elif 'all' in i:
            pass
    
        else:
            if i[2] not in dct:
                dct[i[2]] = [float(i[3])]
            else:
                dct[i[2]] += [float(i[3])]

 

 

# Option : DataFrame에서 소숫점 2자리 표현. (굳이 소숫점을 5자리 이상 길게 할 필요는 없다)
# 위에서 생성한 딕셔너리(dct)를 DataFrame으로 변환

import pandas as pd

pd.options.display.float_format = '{:.2f}'.format

dct = { 'cpu_' + x : y for x, y in dct.items() } 
df = pd.DataFrame(dct)
df

 

 

 

# 평균, 최대값, 최소값을 구해서 맨 마지막열에 추가
# 숫자 index 이름을 알맞게 변경



meanvalue = df.mean().to_dict()
df = df.append(meanvalue, ignore_index=True)

maxvalue = df.max().to_dict()
df = df.append(maxvalue, ignore_index=True)

minvalue = df.min().to_dict()
df = df.append(minvalue, ignore_index=True)

df = df.rename(index = {4720:'평균'})
df = df.rename(index = {4721:'최대값'})
df = df.rename(index = {4722:'최소값'})
df