본문 바로가기

프로젝트/APM MiddleWare

(17)
Transaction : Out of shared memory, DeadLock (24.07.01) Out of shared memory 자체적으로 개발 중인 Collector 로직에서, 시간에 따른 노후화된 시간 파티션을 제거하는 로직이 있다.이것은 Scheduler와 엮여 매 설정된 시간마다 Drop 및 새로운 시간 파티션 테이블을 Create 하는데 문제가 발생했다.   에러를 보아하니,1. 조건에 맞는 오래된 파티션 테이블이 다수이며 (로깅을 확인해 본 결과 약 200개 이상의 테이블로 사료된다. 이는 파티션 생성 로직만 냅두고 오랜만에 Drop을 하기 때문.. )2. 이것을 삭제 실패하는 경고문을 확인할 수 있었다. 원인 : 메모리 부족늘 그렇듯 트랜잭션을 통해 민감한 작업 실행 시 이를 묶어서 격리해야 하는데, 이것의 용량이 부족하다는 의미이다.아마 새로운 테이블을 생성하는 작업은 상대적으로..
부하 증가에 따른 로드 밸런싱 정책 고려 (Envoy) (24.06.20) 개요현재 자체적으로 개발한 Collector 서버에서 수집하는 데이터가 많아질 때면, OOM이 발생하고는 한다. (특히 수집하는 타겟 서버에서 갑자기 많은 부하가 일어날 경우, 급작스러운 데이터 증가로 인해 발생하는 일이다.)Major GC를 막을 수는 없지만(자연스러운 현상이니), 문제는 ‘갑작스럽게 허용 수치 이상의 많은 데이터가 들어올 경우 서버가 멈춰버리는 빈도가 꽤 커진다는 것. 이를 위해 Memory Leak 등을 측정하고자 MAT로 힙 덤프를 떠서 분석했었지만, 근본적으로 막을 수 없는 JPA 관련 인스턴스나 캐시 등은 어쩔 수가 없다 (Query Cashe Plan이나.. 기본적으로 매핑에 사용되는 준비된 persistEntity 등.. ). 서버의 멈춤 현상을 막기 위해 할 수 있는 건 ..
Eclipse MAT 전체 Heap 사용량 보기 / 메모리 분석 (24.06.18) 현재 온보딩중인 서버의 Memory Leak을 보기 위해 heap dump를 뜬 뒤, 분석한 overview 값과 실제 APM 및 프로세스 상의 JVM Heap Used가 일치하지 않는다. MAT의 Heap Overview 294.1MB 하지만 Pinpoint 및 외부 APM의 경우 한결같이 600-700MB의 Heap 사용을 이야기하고 있다.이렇게 차이가 날 이유가 없는데.. 실제로 검색을 조금 해본 결과, 다음과 같은 설정을 해주지 않아서 벌어진 문제였다.문제 원인 및 해결 방법1. Eclipse MAT 설정 변경MAT에서 기본적으로 도달할 수 없는 객체는 분석에 포함되지 않는다. 이를 포함하려면 설정을 변경해야 한다.MAT 실행:Eclipse Memory Analyzer (MAT)를 실행한다.Pre..
작업 중 발생한 Redis 동시성 문제 발생과 처리 Collector 모듈 동작 중 동시성 문제가 발생했다.원인은 꽤 명확한 것인데, Redis 객체 insert에 해당하는 Collection 객체가 Synchronized하지 않기 때문.   ... //스케줄러 동작 여하에 따라 데이터 임시 보관용 List private final List keepedMetricDtos = new ArrayList(); //Metric Table private final List keepedEtcDtos = new ArrayList(); //예외 체크용 //Redis Saver private final MetricRedisSaver metricRedisSaver = new MetricRedisSaver(); //Psql pri..
[Agent / ASM] agent의 transform 메서드에 ASM 바이트코드 적용하기 2 / ASM 라이브러리 이슈 ClassReader / Visiter / Writer를 사용한 값 읽어오기 public static byte[] addLogging(byte[] classfileBuffer) { ClassReader classReader = new ClassReader(classfileBuffer); // 클래스 파일 읽기 // 클래스 파일 쓰기, COMPUTE_MAXS와 COMPUTE_FRAMES 옵션으로 메서드의 최대 스택 크기와 로컬 변수를 자동 계산 ClassWriter classWriter = new ClassWriter(classReader, ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES); // Classvisitor 내부에 MethodVisitor가 있으..
개발 진행 : 메서드 변조(MethodVisitor, ClassVisitor), 로깅 PrepareStatement Search transformer를 통해 prepareStatement를 조회해보자. public class MyClassTransformer implements ClassFileTransformer { //이 인터페이스의 구현체(transform)은 JVM이 존재하는 클래스를 로드할 때마다 호출되며, 이 시점에서 바이트코드를 조사하고 변경할 수 있다. @Override public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) { if (className.contains..
[Agent] java.lang.management 설명 java.lang.management 패키지 https://docs.oracle.com/en/java/javase/21/docs/api/java.management/java/lang/management/package-summary.html java.lang.management (Java SE 21 & JDK 21) package java.lang.management Provides the management interfaces for monitoring and management of the Java virtual machine and other components in the Java runtime. It allows both local and remote monitoring and managem..
[Agent] Agent 동작 구성 및 이해 Agent 개발 Instrumentation 인터페이스 API reference for Java Platform, Instrumentation Instrumentation (Java SE 17 & JDK 17) public interface Instrumentation This class provides services needed to instrument Java programming language code. Instrumentation is the addition of byte-codes to methods for the purpose of gathering data to be utilized by tools. Since the changes are pur docs.oracle.com 이 인터페이스..