본문 바로가기

분류 전체보기40

관리자 마케팅 알람 페이지의 조회 지연 및 OOM 문제 해결 후기 문제 발생어느날 모바일 앱에서 여러 API 호출이 일제히 실패하는 현상이 발생했다. 슬랙 알림을 확인해 보니 매니지 서버가 중지되어 있었고, 해당 서버에 접속해 보니 힙 덤프가 생성되어 있었다. 매니지 서버는 단순 관리자 페이지용이 아니라, 앱에서 사용하는 휴일 정보, 이벤트 정보, 공지 사항 등 다양한 데이터를 제공하고 있었다. 매니지 서버의 중단은 전체 앱 API 흐름에 큰 영향을 주는 연쇄 장애로 이어졌다. 장애 직전에는 특정 페이지의 응답 속도가 점점 느려지고 있었으며, 이후 과도한 메모리 적재가 누적되면서 OOM이 발생한 것으로 분석되었다. 원인 분석힙 덤프와 스택 트레이스를 분석한 결과, 마케팅 알림 전송 결과 페이지 조회 시 특정 엔티티가 140만 개 이상 메모리에 적재되어 있었고, 이로 인.. 2025. 5. 11.
요금/재고 동기화 병목 문제를 스프링 스케줄링 개선으로 해결한 후기 문제 상황현재 서비스에서는 외부 연동사의 숙박 업체 정보를 가져와 판매하기 위해, 데이터를 동기화하는 별도의 서버를 운영하고 있다. 해당 서버는 여러 개의 큐(자바 내부의 큐)를 통해 데이터를 스케쥴링하여 처리하고 있었는데, 인수인계 받았을 당시 요금/재고 관련 큐에 하루 약 10만 건, 며칠이 지나면 수십만 건의 데이터가 누적되는 현상이 발생하고 있었다. 문제는 이 큐들이 좀처럼 해소되지 않았고, 시간이 지날수록 데이터가 쌓여가고 있었다. 이에 따라, 요금/재고가 동기화 지연이 발생했고, 외부 연동사의 숙박 상품의 예약 실패 사례도 점점 늘어나고 있었다. 원인 분석문제의 원인을 파악하기 위해 코드와 실행 로그를 함께 확인했다. 코드상으로는 약 6개의 주기적인 스케줄링 작업이 존재했고, 실제 로그를 확인.. 2025. 5. 10.
QueryDSL fetchOne() OOM 문제 분석 및 해결 후기 문제 발생어느 날 회사 슬랙에 인증 서버에서 문제가 발생했다는 알림이 도착했다. 다행히 인증 서버는 OOM(Out Of Memory) 발생 시 힙 덤프를 자동으로 생성하도록 설정되어 있었고, 이를 기반으로 메모리 덤프를 분석할 수 있었다. 분석 결과, 약 73만 개가 넘는 회원 정보 객체가 메모리에 적재되었고, 이로 인해 OOM이 발생한 것으로 확인되었다. 왜 그렇게 많은 객체가 한 번에 올라왔는지 추적하기 위해 스택 트레이스를 분석한 결과, 특정 사용자의 설정 정보를 조회하기 전, 회원 정보를 불러오는 로직에서 문제가 발생하고 있었다. 기존에 작성되어 있던 코드에서는 fetchOne()으로 특정 회원의 정보를 가져오고 있었다.// 문제가 발생한 부분 (QueryDSL 버전은 5.0.0 버전 사용중)re.. 2025. 5. 8.
메인 메모리 메인 메모리배경CPU는 pc(program counter)가 지시하는대로 메모리부터 다음 수행할 명령어를 가져오는데 그 명령어는 필요한 경우 추가적인 데이터를 더 가져올 수 있으며 반대로 데이터를 메모리로 내보낼 수도 있다.기본 하드웨어메인 메모리와 각 처리 코어에 내장된 레지스터들은 CPU가 직접 접근할 수 있는 유일한 범용 장치이다.모든 실행되는 명령어와 데이터들은 CPU가 직접적으로 접근할 수 있는 메인 메모리와 레지스터에 있어야 한다.데이터가 메모리에 없다면 CPU가 그것들을 처리하기 전에 메모리로 이동시켜야 한다.메인 메모리를 사용하는 프로그램들이 제대로 동작하기 위해서는 운영체제 영역 뿐만 아니라 사용자 프로그램 사이도 서로 보호해야 한다.운영체제가 CPU와 메모리 간의 접근 중에 개입하게 되.. 2025. 2. 6.
교착상태2 교착 상태교착 상태 회피교착 상태 성립 조건(4가지 조건)중 한 가지는 성립되지 않도록 하는 방법은 장치의 이용률을 저하시키고 시스템의 총처리율을 감소시킨다. 교착 상태를 회피하는 다른 대안자원이 어떻게 요청될지에 대한 추가 정보를 제공하도록 요구한다.가용 자원, 각 스레드에 할당된 자원, 각 스레드가 요청하거나 방출할 자원의 정보 등자원 R1, R2를 가진 시스템에서스레드 P는 R1을 먼저 요청하고 R2를 요청스레드 Q는 R2를 먼저 요청하고 R1을 요청각 스레드의 요청과 방출에 대한 완전한 순서를 파악하고 있다면 교착 상태를 피하고자 스레드가 대기해야 하는지 여부를 결정할 수 있다.안전 상태안전 상태(Safe State)각 스레드들이 요청하는 모든 자원(최대 요구 수를 요구하더라도) 교착 상태를 발생.. 2024. 12. 25.
교착 상태1 교착 상태교착 상태(deadlock)스레드가 자원을 요청했을 때, 그 자원이 그 순간 이용할 수 없다면 스레드는 대기 상태에 들어간다. 때때로 대기 중인 스레드가 다시는 상태를 변경하지 못하는 경우가 발생하는데, 이는 해당 스레드가 요청한 자원이 다른 대기 중인 스레드에 의해 점유되어 있을 때 발생한다. 이러한 상황을 교착상태(deadlock)라고 한다.시스템 모델시스템은 여러 경쟁 스레드간에 분산 될 한정된 수의 자원으로 구성된다.자원은 여러 유형(또는 클래스)으로 분할될 수 있으며, 각각은 몇 개의 동일한 인스턴스로 구성된다.CPU 사이클, 파일 및 IO 장치 등시스템에 4개의 CPU가 있는 경우 자원 유형 CPU에는 4개의 인스턴스가 존재한다.스레드는 자원을 사용하기 전에 자원를 요청해야하며 자원을.. 2024. 12. 16.