전자제품을 구매하고 언박싱을 하면 매번 튀어나오는 매뉴얼...

하지만, 우리는 보통 그 매뉴얼을 거들떠 보지도 않는다. 어!? 나만 그런가!? ^^

 

리눅스 서버를 구성하고 종종 확인하는 리소스...

솔직히... 그 의미가 어떤 것인지 경험으로만 파악했지, 정확한 의미는 잘 모른다. 어?! 나만 그런가?! ^^

 

[ Environment ]

- VM : VirtualBox v7.0.6 r155176

- OS : Ubuntu 20.04 LTS

 

VirtualBox

 

 

[ top ]

내 서버가 왠지 힘들어하는 것 같으면 가장 먼저 확인하는 것이 'top' 명령어이다.

> top

 

여기에서 주로 보는 것은 다음의 'load average' 영역일 것이다.

load average

 

'load average'는 시스템의 부하정도를 알려주는 지표인데,

실행중인 프로세스 또는 Disk I/O 등을 위해 대기하고 있는 프로세스의 정도를 알려주는 정보로써

CPU core 1개당 1 이상의 값을 갖는다면 대기해야하는 task가 있다는 의미로 이해하면 된다.

 

그런데, 왜 3개의 값이 보일까?!

1분 / 5분 / 15분 순서로 값을 보여주는데, 이를 통해 부하가 심해지고 있는지 해소되고 있는지 경향을 볼 수 있다.

 

개인 PC라면 가성비로 사용해야하기에 1에 맞춰서 Spec을 확보해도 괜찮겠지만

서비스를 위한 서버라면 아무리 돈이 없어도 평균 0.5 이하로 맞춰야 그나마 성능 저하 없이 사용할 수 있다.

 

일단 여기까지만 알아도 충분하지 않을까!? ^^

 

 

[ core ]

우리가 요즘 사용하는 CPU는 거의 multi-core일 것이다.

어!? 그런데, 생각해보니 Kubernetes에서 POD의 core를 소숫점으로도 줄 수 있는데... 일단 지금은 무시!!! ^^

core

 

실습을 하고 있는 환경은 일단 VirtualBox에서 2 core를 할당했다.

정말 잘 되어있는지 확인해보자.

> cat /proc/cpuinfo

 

스크린샷을 다 찍기에는 너무 길어져서 잘랐는데.... 그냥 심플하게 확인하려면 다음과 같이 하면 된다.

> grep -c processor /proc/cpuinfo

 

2 core가 잘 할당되어 있는 것을 볼 수 있다.

 

다른 명령어로도 확인할 수 있다.

> lscpu

 

 

[ full-load CPU ]

CPU 관련한 부하가 한계치까지 가면 어떻게 되는지 시뮬레이션을 해보자.

 

> nano cpu.py
#!/usr/bin/python

test = 0
while True:
    test = test + 1

 

Terminal 탭을 2개를 열고 진행을 해보자.

> python ./cpu.py

 

> top

 

응?! 그런데, 2 core 인데...

CPU 100%라고 하면, load 값이 2가 되어야 할 것 같은데 ... 1 값으로 수렴하고 있는 것 처럼 보인다.

 

그 이유는!

지금 실행되고 있는 python은 core 1개에서 실행되고 있기 때문이다!

 

그러면... python을 하나 더 실행해보자.

> python ./cpu.py

 

그리고나서 top을 다시 한 번 확인해보면,

> top

 

2 core이기 때문에, 각각 100% 실행이 되고 있으니... 2 값으로 나온다.

 

어!? 그러면 하나 더 실행하면!?

> top

 

밑에 보이는 리스트 형식의 내역을 보면 CPU는 총 200%를 3으로 나눠서 사용하고 있는 것이 보일 것이다.

'load average' 값은 3값으로 수렴하고 있다.

 

 

[ uptime]

'top' 명령어 말고 다른 명령어도 알아보자.

> uptime

 

지속적으로 값을 보여주는 것이 아니라 1회성으로 뿌려주고 끝난다.

 

 

[ /proc/loadavg ]

또 다른 방법으로도 확인해볼 수 있다.

> cat /proc/loadavg

 

 

[ w ]

top 명령어와 uptime 명령어의 중간쯤에 위치하고 있는 것 같은 'w' 명령어도 있다.

> w

 

 

그런데, 'load average'를 발생시키는 요인이 CPU 사용만 있을까!?

답은.... 당연히... 아니다 !!!

 

 

[ full-load Disk I/O ]

디스크에 읽고 쓰는 것도 부하를 야기한다.

 

> nano io.py
#!/usr/bin/python

while True:
    f = open("./test.txt", 'w')
    f.write("TEST")
    f.close()

 

> python ./io.py

 

> top

 

CPU 사용량은 9%를 찍고 있지만 'load average'를 보면 1에 수렴하고 있다.

 

CPU 100%를 찍으면 어떻게 될까?

 

> python ./cpu.py

 

> top

 

'load average'를 보면 2에 수렴하고 있지만 CPU 사용량을 보면 차이가 있다.

 

 

그렇다.

'load average'는 단순하게 Running 중인 프로세스 뿐만 아니라 Disk I/O로 인해 대기타는 것도 같이 바라보고 있다.

 

그러면, 이렇게 부하가 잡히고 있을 때 분석은 어떻게 하면 될까!?

일단은 뭐, top으로 확인 가능한 아래 리스트 목록으로 추적이 가능하다.

 

하지만, CPU 부하가 문제인지 Disk I/O 대기가 문제인지 어떻게 알 수 있을까?

 

 

[ vmstat ]

어떤 상태인지 'vmstat' 명령어를 사용해보자.

> vmstat

 

'vmstat' 명령어는 일단 Virtual Memory Statistics의 약자로써 현재 CPU 및 Memory 사용량을 알 수 있다.

 

지금 여기에서 살펴볼 것은 앞 부분에 있는 "r"과 "b" 부분이다.

 

"r"은 현재 실행하려고 하거나 실행 중인 프로세스의 개수를 알려주는 것이고

"b"는 uninterruptible sleep 상태의 프로세스 개수, 즉 I/O 대기를 하고 있는 프로세스의 개수를 알려준다.

 

중간에 io.py의 실행을 종료하면 어떻게 나오는지를 살펴보자.

> vmstat 1

 

중간에 보면 "b" 부분이 0으로 바뀌는 것을 확인할 수 있다.

 

 

우리 서버가 지금 힘들어하지는 않는지

머리(CPU)가 아픈지 손(I/O)이 바쁜지 파악해서 해결해주도록 하자.

반응형

+ Recent posts