[JVM] CPU 사용률 , Run Queue 런큐
$ top // 명령을 이용하면 CPU사용률을 볼 수 있다.
아래와 같이 bash가 75.2%의 CPU를 사용하는데 괜찮은 것일까?
가끔 컴퓨터가 버벅거릴때, CPU사용률을 보면 100%가 되는것들이 있다.
그때문에 CPU사용률이 100%가되면 문제가 있는것이라고 생각할 수 있는데, 그렇지 않다.
CPU사용률은 특정 시간에 대한 평균값이다. 스레드마다 실행되는 시간이 정해져있고, 시간을 다 소모하게되면 다른 스레드가 돌고, 자기차례가 다시 돌아올때까지 유휴기간을 갖는다. 자신이 CPU사용시간을 받았을때, 사용시간 동안 CPU 를 사용한 퍼센트이기 때문에 높을수록 좋다.
따라서 CPU에 관해서, 성능을 높히기 위한 방법은 짧은 시간 동안 CPU 사용률을 가능한 높히는 것
CPU 사용시간은 두 가지로 나뉜다.
- 사용자 시간(사용자가 어플리케이션을 사용하는 시간)
- 시스템 시간(I/O와 같은 컴퓨터의 기반 시스템 자원을 사용하는 시간)
$ iostat 1 // 1초마다 cpu의 사용자시간, 시스템시간을 볼 수 있다.
cpu아래에 us는 사용자시간, sy는 시스템시간, id는 idle 유휴 상태를 의미한다.
따라서 CPU 사용률이 매우 낮다. 첫줄을 보면, 120ms동안 바쁘고, 나머지 870ms 동안 쉰다. 그러면 Idle 쉬는 시간을 줄이면 되지않을까?
idle 상태는 여러가지 이유로 인해 될 수 있다.
1) 동기화 연산(락 기다림)
2) 원격 서비스 호출(데이터베이스 응답 기다림)
3) 그냥 일이 없음
세번째는 어쩔 수 없고, 1,2번 같은 경우는 응답이 더빠르게 오게 해서 CPU사용률을 높혀야 한다.
(1,2번 같은 경우 APM을 사용해서 확인 할 수 있음)
- 싱글 CPU 자바 웹 어플리케이션
CPU가 한개일 경우 사용률은 초당 평균값이기 때문에 오해가 발생할 수 있다.
웹 서버 어플리케이션의 경우, 웹서버가 요청을 전부 처리하고 다음 요청을 기다리고 있을 때도 idle시간으로 처리된다. 따라서 요청을 처리하는데 450ms걸렸다면, 그 동안 100%의 CPU를 사용했음에도 불구하고, 나머지 550ms동안 0% CPU를 사용했기 때문에 CPU사용률은 45%가된다.
웹 플리케이션이 최적화되서 일을 더 빨리 처리한다면, CPU사용률은 더 낮아진다.
- 멀티 CPU 자바 웹 어플리케이션
여러개의 스레드는 더욱더 평균값에 의해 해석이 왜곡될 수 있다.
멀티 스레드에서는 CPU들이 처리해야할 사항이 있을 때도 유휴 상태가 될 수 있다.
각 CPU가 처리하는 스레드 풀이 고정되어 있을 경우, 어떤 CPU는 자신의 스레드풀을 다 처리했지만, 다른스레드는 그렇지 않을 수 있다. 때문에 CPU 유휴기간이 추가적으로 발생한다.
프로세서 큐라고도 불린다.
런큐에는 지금 실행되고 있는 스레드, 처리되어야할 스레드들이 들어있다.
런큐의 길이는 가용 CPU가 있는 경우 실행할 수 있거나 실행되고 있는 모든 스레드의 숫자이다.
실행시킬 스레드가 가용 CPU의 개수보다 많다면 성능은 저하되기 시작한다.
일반적으로는 윈도우에서는 런큐의 길이가 0이되고, 유닉스에서는 CPU숫자와 같거나 작기를 권장한다.
(윈도우는 지금 실행되는 스레드를 런큐길이에서 제외하기 때문에 유닉스보다 1이 작음)
런큐의 길이가 특정 기간에 너무 크다면 머신이 과부하를 받는다는 의미이다.
런큐의 길이가 너무 길다면, 작업을 줄일 방법이 없다면 다른 머신으로 작업을 분산시켜야 한다.
자바 웹 어플리케이션은 멀티 스레드 환경이기 때문에 평균값이 잘못 해석될 일이 많아서, CPU사용률만으로는 얻을 수 있는 정보가 별로 없는 것 같다.
APM(Application Profiling Management) System을 사용하면, (대표적인 유료 프로그램으로 제니퍼가 있음) 요청이 들어와서부터 실행되는 메소드마다 몇초가걸렸는지 확인할 수 있다. 그래서 병목이 되는 곳을 빠르게 파악해서 수정가능하다.
'JAVA > JVM' 카테고리의 다른 글
[JVM] 기본 GC 튜닝 (0) | 2021.12.16 |
---|---|
[JVM] GC 알고리즘 - Overview (0) | 2021.12.16 |
[JVM] JIT 컴파일 로그, 컴파일 스레드, 인라이닝 튜닝 (0) | 2021.12.16 |
[JVM] JIT : Just In Time Compiler 개념 & 튜닝 (0) | 2021.12.16 |
[JVM] PERM 영역 이해하기 (0) | 2021.12.16 |
[JVM] Heap dump 힙 덤프 개념 - 왜 필요한가 (0) | 2021.12.16 |
[JVM] GC 기본개념 - JVM메모리 구조 / Minor GC / Full GC (0) | 2021.12.16 |
[JVM] JVM 종류 - Hotspot vs JRockit (0) | 2021.12.16 |