1. 미들웨어이야기/01. JVM

CPU 과부하로 인한 응답속도 저하 패턴

OSSW(Open Source System SoftWare 2009. 6. 3. 14:43

CPU에 영향을 주는 로직

1)과도한 String연산(루프 포함)
String 연산과 루프(for, while)는 CPU를 과도하게 사용하는 경향이 있어서 예전 DAO 코딩 시 String Buffer를 많이들 사용 하였습니다.

2)과도한 RMI Call
RMI호출은 Java object를 직렬화 하고 역 직렬화하는 과정을 수반하는데, 이는 CPU를 많이 사용하는 작업이기 때문에 항시 주의를 요합니다.
특별히 RMI Call을 하지 않더라도 EJB를 call하는 것이 Remote일 때는 RMI호출을 사용하게 되고 부하량이 많을 때는 이 부분이 주로 병목의 요인이 되곤 한다. JEUS에선 single-vm-only 및 local invocation optimize 기능을 적절히 잘 사용합니다.

3)JNDI lookup
JNDI lookup은 Server의 JNDI에 Binding된 Object를 읽어오는 과정입니다. 이 과정도 위에서 설명한 RMI call이 수행되는데, 특히 EJB를 호출하기 위해서 Home과 Remote Interface를 lookup 하는 과정에서 종종 CPU를 과 점유 하기도 합니다.
그러므로, JSP나 Servlet에서 caching해서 사용하는 것을 권장한다.

4)임시 객체를 생성을 최소화
너무 빈번하게 임시객체를 생성하면 성능은 이상없어 보이지만 CPU 점유율은 높아집니다. Application 특성을 잘 파악하여 Singleton으로 구성 가능한지 체크합니다.

5)성능이 느린 Query
DB query 로직이 매우 느려도 CPU에 영향을 줄 수가 있다.

Full GC
JVM의 Full GC에 의해서 CPU가 과도하게 사용될 수 있습니다. Application의 memory leak에 의해서 heap이 비정상적으로 많이 늘어 날 경우 여러 번의 Full GC로 인해서 CPU overhead가 심해질 수 있습니다.
JVM Debugging 옵션
-Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4142,suspend=n

위와 같이 WAS 실행시 해당 옵션을 적용하고 운영하면 CPU overhead 및 기타 Perfroamcne에 영향을 주므로 Remote Debugging 용도는 특별히 꼭 사용할 서버에만 적용하여 사용합니다