jvm 2

@Scheduled가 3대에서 돌면 생기는 일: 분산 환경 스케줄러의 함정

테스트에서 사라진 30명동시성 테스트를 돌리고 있었다. 100명이 대기열에 등록하고, 전원이 활성화된 뒤 주문하는 시나리오였다. 그런데 결과가 계속 70명만 성공했다.100 - 70 = 30. 배치 사이즈가 30이었다.처음에는 동시성 문제를 의심했다. 락 충돌인가? 커넥션 풀 부족인가? 한참을 뒤지다가 원인을 찾았다. @SpringBootTest가 @Scheduled 빈을 자동으로 시작하고, 테스트 실행 중에 스케줄러가 대기열에서 30명을 꺼내가고 있었다. 테스트가 100명을 등록하고 읽으려는 사이에 스케줄러가 30명을 소비해버린 것이다.이건 로컬에서의 문제였지만, 프로덕션에서는 더 심각한 버전이 존재한다. 서버가 3대면 스케줄러도 3개다.@Scheduled의 본질: JVM 로컬 타이머@Scheduled..

JVM 가비지 컬렉션(feat. Parallel, CMS, G1)과 운영 트러블슈팅 사례

백엔드 시스템을 운영하다 보면, 코드 수준의 최적화만으로는 해결되지 않는 성능 병목을 마주하게 됩니다.특히 자바(Java) 기반 서버는 JVM 메모리 관리와 Garbage Collection(GC) 정책에 따라 서비스 안정성과 응답 속도가 크게 달라집니다. 운영 환경에서 트래픽이 급증하면, 예상치 못한 Full GC, OutOfMemoryError, 커넥션 풀 고갈과 같은 문제가 한꺼번에 발생하며 서비스 전체가 지연되거나 중단될 수 있습니다.저는 특정 외부 연동 서버 운영 중 실제로 이러한 문제를 경험했습니다. 순간적으로 API 응답이 수 초 단위로 지연되고, 504 Gateway Timeout이 동시다발적으로 발생했으며, TCP 연결이 100%까지 포화되는 상황이 반복되었습니다.이 과정에서 JVM 메모..