Load Average
의 정의가 뭘까?
이는 man proc 을 통해서 확인할 수 있다.
The first three fields in this file are load average figures giving the number of jobs in the run queue (state R) or waiting for disk I/O (state D) average over 1, 5, and 15 minutes
즉 run queue 에 있는 CPU 를 받기 위해 대기중인 프로세스의 수와 I/O 작업이 끝나기를 기다리고 있는 프로세스의 수를 합한 값을 1분 5분 15분 단위로 나타낸 것을 말한다.
이 값은 프로세스의 수를 세는 것이기 때문에 CPU Core 의 수가 몇 개냐에 따라 각각 의미하는 바가 다르다. 상대적이다.
예로 Load Average 가 2 이고 run queue 에 두 개의 프로세스가 대기중이며 CPU 코어가 하나다. 이 경우에는 한 개의 프로세스는 작업을 처리할 수 없다.
하지만 이 경우에 CPU 코어의 수를 늘린다면 같은 Load Average 값이더라도 모든 프로세스를 다 실행할 수 있다. 이 경우에는 문제가 되지 않는다.
그리고 같은 Load Average 값이더라도 CPU 를 원하는 프로세스인지 I/O 를 원하는 프로세스인지는 알 지 못한다. 두 값을 합한 것이니까.
그렇다면 I/O 를 원하는지 CPU 를 원하는지 알려면 어떻게 해야할까? 이는 vmstat
으로 알 수 있다.
vmstat
을 사용할 때 출력되는 r
값과 b
값에 주목해서 구별하면 된다.
r
은 실행되기를 기다리고 있거나 현재 실행하고 있는 프로세스의 개수륾 말하는 거며 b
는 I/O 를 위해 대기열에 있는 프로세스의 개수를 말한다.
이렇게 CPU 가 병목인지 I/O 가 병목인지 알았다면 이제 각 문제를 해결하면 된다.
먼저 사용자 프로그램이 병목인지, 시스템 프로그램이 병목인지 확인하자. 이는 top
이나 sar
명령으로 확인이 가능하다.
그리고 ps
명령으로 어떤 프로세스가 CPU 를 얼마나 차지하고 있는지 확인하는게 가능하다.
이렇게 프로세스를 찾은 후에는 좁혀서 분석해야한다. 주로 로그를 심어놨다면 로그를 통해서 확인하는게 가능하다.
또 다른 방법이라면 strace
나 oprofile
로 병목지점을 좁혀볼 수 있다.
strace
는 프로세스가 호출한 시스템 콜을 추적하는게 가능하다.oprofile
는 어떤 함수가 cpu 를 많이 사용하는지 추적하는게 가능하다.
I/O 가 병목인 경우에는 입출력이 많아서 병목인지, 스왑영역을 사용해서 병목인지 알아야 한다.
sar
이나 vmstat
으로 스왑을 사용하는지 살펴보자.
스왑영역을 쓰고 있다면 특정 프로세스가 메모리를 독차지 하고 있을 수 있으므로 ps
명령어로 찾아보자.
메모리를 많이 쓰고 있는 사용자 프로세스가 있다면 메모리 누수가 있는지 확인해봐야 한다. 그렇지 않다면 메모리를 증설해야 할 수도 있다.
입출력이 빈번하게 발생하고 있다면 캐시서버를 통해서 입출력 자체를 줄이거나 알고리즘 개선으로 줄이는 방법이 있을 수 있고 블라킹 되지 않게 리액티브 프로그래밍을 이용하거나 코루틴을 적용해볼 수 있다.