본문으로 건너뛰기

6. 트러블 슈팅 가이드

설치 뒤에 자주 만나는 증상과 조치를 모았습니다. 겪고 있는 증상과 가장 가까운 항목을 찾아 보십시오.

증상으로 찾기

증상항목
WAS 가 기동되지 않고 VerifyError 가 난다WAS를 실행하다 오류가 발생합니다
운영 중 JVM 이 갑자기 죽는다WAS를 실행하다 오류가 발생합니다 · JVM Core dump
콘솔의 트랜잭션 화면에서 한글이 깨집니다한글이 깨져서 표시됩니다
트랜잭션 시각이 실제와 어긋납니다서버 시간 차이
메소드별 CPU 시간이 0 으로 나옵니다트랜잭션 CPU시간 표시 확인
Apache 정보가 콘솔에 안 보인다Apache 웹서버의 서버정보
컨테이너·OpenShift 에서 기동 오류가 난다컨테이너·OpenShift 환경

어느 항목에도 없으면 다음 세 가지를 모아 기술지원팀에 알려 주십시오 — 에이전트 버전, Java 버전, 그리고 WAS 기동 로그의 오류 메시지 전문입니다.

Transaction Trace 정보의 한글이 깨져서 표시됩니다.

OPENMARU APM은 기본적으로 UTF-8 Charset을 사용하고 있습니다. WAS에서 기본 Charset으로 EUC-KR을 사용하시는 경우, 아래와 같이 에이전트 설정을 변경하여 EUC-KR을 UTF-8으로 변환하여 한글이 출력되게 설정하시면 됩니다.

$ vi khan-agent-test.conf
----------
user.charset.encoding=EUC-KR

APM서버와 WAS 머신의 서버 시간 차이가 많습니다.

OPENMARU APM 인스턴스 시작 스크립트에 아래 옵션을 설정하시면 WAS/System 머신의 서버시간을 무시하고, 모든 시간을 OPENMARU APM 서버의 시간을 사용합니다.

-Duse.monitoring.server.time=true

OPENMARU APM의 Provisioning 기능을 사용하여 설치시 아래 ‘모니터링 서버시간사용(에이전트시간 무시)’ 옵션을 선택하고 설치하면 -Duse.monioring.server.time=true가 설정됩니다.

트랜잭션 CPU시간 표시 확인

OPENMARU APM에서는 트랜잭션의 상세 메소드 별 CPU 사용 시간을 측정하여 표시하고 있습니다. 해당 기능은 Java 1.6 부터 지원하고 있어, OPENMARU APM Java 1.5용 에이전트를 사용하는 경우에는 해당값이 0 으로 표시됩니다.

WAS를 실행하다 오류가 발생합니다.

오류 메시지

26-Feb-2016 16:57:58.334 SEVERE [main] org.apache.catalina.core.StandardService.initInternal Failed to initialize connector [Connector[HTTP/1.1-8090]]
org.apache.catalina.LifecycleException: Failed to initialize component [Connector[HTTP/1.1-8090]]
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:106)
at org.apache.catalina.core.StandardService.initInternal(StandardService.java:567)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:851)
… …
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:484)
Caused by: java.lang.VerifyError: Expecting a stackmap frame at branch target 37
Exception Details:
Location:

org/apache/catalina/connector/CoyoteAdapter.service(Lorg/apache/coyote/Request;Lorg/apache/coyote/Response;)V @2: invokestatic
Reason:
Expected stackmap frame at this location.
Bytecode:
0x0000000: 014e b805 0713 0509 1305 0a13 0522 1305
0x0000010: 232a 05bd 00f4 5903 2b53 5904 2c53 b605
0x0000020: 124e a700 06b6 0515 2b04 b600 03c0 0004
0x0000030: 3a04 2c04 b600 05c0 0006 3a05 1904 c700

원인

Java 7 부터 JVM 은 클래스를 적재할 때 스택맵 프레임(StackMapTable)을 검사합니다. 에이전트가 바이트코드에 측정 코드를 넣으면 분기와 try-catch 가 생기는데, 이때 스택맵 프레임을 다시 계산하지 않으면 원래 값과 어긋나 검증기가 클래스 적재를 거부합니다.

해결 방법

에이전트를 최신 버전으로 올리십시오. 에이전트가 계측한 클래스의 스택맵 프레임을 다시 계산하도록 바뀌어 이 오류가 발생하지 않습니다.

-noverify · -Xverify:none 을 쓰지 마십시오

예전에는 이 오류를 피하려고 기동 옵션에 -noverify 또는 -Xverify:none 을 넣어 검증기를 꺼 두었습니다. 최신 에이전트에서는 필요하지 않으며, 넣으면 오히려 위험합니다.

검증기를 끄면잘못된 바이트코드가 걸러지지 않고 그대로 적재됩니다
그 결과JIT 컴파일러가 그 코드를 최적화하는 시점에 JVM 이 비정상 종료(SIGSEGV)할 수 있습니다
언제 나타나나적재 직후가 아니라 해당 코드가 충분히 실행된 며칠 뒤에 나타납니다

실제로 이 옵션을 넣은 환경에서 운영 중 JVM 이 종료되는 장애가 있었습니다. 원인을 추적하기 어려운 형태라, 기동 스크립트에 이 옵션이 남아 있으면 지우십시오.

Java 13 부터 -Xverify:none-noverify 는 사용이 권장되지 않는(deprecated) 옵션이며 기동할 때 경고를 출력합니다. Oracle 은 이 옵션을 뺄 예정이라고 밝혔습니다.

그래도 오류가 계속되면

에이전트 버전과 오류 메시지의 클래스 이름을 함께 기술지원팀에 알려 주십시오.

Apache 웹서버의 서버정보가 표시되지 않습니다.

원인 및 해결방법

Apache 서버정보는 System Agent가 시작될 때, 서버정보를 가져오게 됩니다. 이때 Apache가 구동중이지 않은 경우 정보를 수집하지 못하게 됩니다.

Apache가 실행중인 상태에서 System Agent만 재기동하면 서버정보가 수집됩니다.

UNIX 서버에서 실행시 JVM Core dump가 발생합니다.

UNIX계열에서는 OPENMARU APM에서 데이터 전송시 속도 효율적인 압축 알고리즘인 Snappy 방식을 사용할 때 오류가 발생하는 경우가 있습니다.

WAS Agent와 SYS Agent의 옵션에서 압축 알고리즘을 다음과 같이 lzw로 변경하십시오.

# agent's compression algorithm : snappy(default), lzw
agent.compress.type=lzw

컨테이너·OpenShift 환경

OpenShift JBoss EAP이미지 LogManager오류

JBoss EAP + OPENMARU APM Image를 실행시 다음 오류메시지와 같이 JBoss EAP 6.4/7.0 실행시 LogManager 오류가 발생합니다.

java.lang.RuntimeException: JBAS014670: Failed initializing module org.jboss.as.logging
at org.jboss.as.controller.extension.ParallelExtensionAddHandler$1.execute(ParallelExtensionAddHandler.java
:111)
at org.jboss.as.controller.AbstractOperationContext.executeStep(AbstractOperationContext.java:611)
at org.jboss.as.controller.AbstractOperationContext.doCompleteStep(AbstractOperationContext.java:489)
at org.jboss.as.controller.AbstractOperationContext.completeStepInternal(AbstractOperationContext.java:290)
at org.jboss.as.controller.AbstractOperationContext.executeOperation(AbstractOperationContext.java:285)
at org.jboss.as.controller.OperationContextImpl.executeOperation(OperationContextImpl.java:1132)
at org.jboss.as.controller.ModelControllerImpl.boot(ModelControllerImpl.java:299)
at org.jboss.as.controller.AbstractControllerService.boot(AbstractControllerService.java:292)
at org.jboss.as.server.ServerService.boot(ServerService.java:346)
at org.jboss.as.server.ServerService.boot(ServerService.java:321)
at org.jboss.as.controller.AbstractControllerService$1.run(AbstractControllerService.java:254)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.util.concurrent.ExecutionException: java.lang.IllegalStateException: JBAS011592: The logging subsystem requires the log manager to be org.jboss.logmanager.LogManager. The subsystem has not be initialized and cannot be used. To use JBoss Log Manager you must add the system property "java.util.logging.manager" and set it to "org.jboss.logmanager.LogManager"
at java.util.concurrent.FutureTask.report(FutureTask.java:122)
at java.util.concurrent.FutureTask.get(FutureTask.java:188)
at org.jboss.as.controller.extension.ParallelExtensionAddHandler$1.execute(ParallelExtensionAddHandler.java:103)
... 11 more

원인 및 해결방안

JBoss EAP를 사용하는 경우 패치마다 Logmanager의 위치가 변경되기 때문에 contrib/openShift-launch.sh 파일의 다음 부분을 현재 버전의 JBoss EAP Container Image에 맞게 변경합니다.

$ cd jboss-eap64/contrib
$ vi OpenShift-launch.sh
… 중략 …
export JBOSS_LOGMANAGER_DIR="/opt/eap/modules/system/layers/base/.overlays/layer-base-jboss-eap-6.4.14.CP/org/jboss/logmanager/main"
#export JBOSS_LOGMANAGER_DIR="/opt/eap/modules/system/layers/base/.overlays/layer-base-jboss-eap-6.4.13.CP/org/jboss/logmanager/main"
#export JBOSS_LOGMANAGER_DIR="/opt/eap/modules/system/layers/base/.overlays/layer-base-jboss-eap-6.4.12.CP/org/jboss/logmanager/main"
#export JBOSS_LOGMANAGER_DIR="/opt/eap/modules/system/layers/base/.overlays/layer-base-jboss-eap-6.4.11.CP/org/jboss/logmanager/main"
export JBOSS_LOGMANAGER_JAR=`cd "$JBOSS_LOGMANAGER_DIR" && ls -1 *.jar'
… 중략…

OpenShift 3.6 버전에서 Docker CPU 사용량 정보가 모니터링 되지 않음

OPENMARU APM SYS Agent 로그에 아래와 같은 메시지가 출력됨

2017-11-13 09:46:06 [INFO ] CpuStat.java::parseCpuStat:90 - FileNotFound file: /sys/fs/cgroup/cpu/system.slice/docker-5561112f9d4762568135d5c91fe2ba610d1cb331cbe86d430c695b4af677100d.scope/cpuacct.stat
2017-11-13 09:46:06 [WARN ] MemStat.java::parseMemory:97 - FoundNotFound file: /sys/fs/cgroup/memory/system.slice/docker-bb16cdd2dd3a674d8eee018ade3fd517077ff718ab67d10fa87678a536c0507f.scope/memory.usage_in_bytes

원인 및 해결방안 OpenShift 3.5 버전까지는 Docker의 Cgroup Driver로 Cgroup을 사용했지만, OpenShift 3.6 버전에서는 systemd를 기본 Docker Cgroup Driver로 변경하여 Docker 모니터링을 위해 생성되는 Pseudo파일의 위치가 변경되어 오류가 발생함

  • Docker Plugin의 설정파일을 수정
$ cd khan-sys-agent/plugins/khan-plugin-docker.conf
$ vi config.properties
  • docker.cgroup.driver.type을 systemd 로 변경
# docker's cgroup driver type : cgroup or systemd

# OpenShift 3.6 use systemd type, below OpenShift 3.5 use cgroup type

docker.cgroup.driver.type=systemd

#docker.cgroup.driver.type=cgroup