- 캐시 무효화 전략에 대해 설명해주세요
- Redis에서 데이터가 영구적으로 저장되지 않는 이유와 이를 방지하기 위한 방법을 설명해주세요
- JVM 튜닝을 통한 성능 최적화 방법을 설명해주세요
- 스레드 풀과 비동기 작업을 사용한 성능 최적화 방법을 설명해주세요
- 서버의 CPU, 메모리 사용률을 모니터링하고 최적화하는 방법을 설명해 주세요
1. 캐시 무효화 전략
캐시 무효화 전략에 대해 설명해주세요
캐시 무효화
- 캐시에 저장된 데이터가 더 이상 유효하지 않을 때, 이를 제거하거나 갱신하여 최신 상태를 유지시키는 전략
- 데이터 일관성을 유지하는데 필수적
만약 하나의 링크가 DB에서 사라짐. 이 경우 캐시된 링크가 무효화되지 않더라도 대부분의 사용자는 문제 없이 페이지를 이용 가능하지만 몇몇 사용자는 404에러를 마주함 = 해당 링크는 더 이상 유효하지 않기 때문에, 그러나 보여주는 페이지 자체는 아무런 문제가 없어 디버깅이 까다로움
캐시를 사용하지 말아야 하는 경우
- 원래 데이터 소스가 무거운 경우 (DB에서 여러 복잡한 조인 과정이 필요한 경우)
- 데이터가 매 요청마다 갱신될 필요가 없는 경우
- 데이터를 가져오는 작업에 부작용이 없어야 하는 경우(은행 전산 시스템)
- 데이터가 자주 접근되고 한 번 이상 필요한 경우
- 캐시 적중률
- 캐시 데이터와 원본 저장소의 데이터가 일관성을 유지하게 해야 함
- 데이터베이스에서 데이터가 수정된 경우 캐시 데이터를 유효성 검증을 통해 데이터를 무효화 시켜야 함
Write-through(쓰기 직전)
- 데이터가 캐시에 저장되기 전에 데이터베이스에 먼저 쓰는 전략
- 캐시와 데이터베이스가 항상 동기화 상태 유지
- 읽기성능은 좋음, 쓰기 성능은 약간 저하
Write-around(쓰기 우회)
- 데이터에 캐시를 쓰지 않고 바로 데이터베이스에 저장하는 방식
- 자주 사용되지 않는 데이터를 캐시에 쓰지 않아 불필요한 데이터가 캐시에 채워지는것 방지
- 쓰기성능은 좋음, 자주 읽는 데이터에 대해 캐시 미스 초래
Write-back(쓰기 후방)
- 데이터를 캐시에 먼저 쓰고, 일정시간이 지난 후 특정 조건이 충족되면 데이터베이스에 쓰는 방식
- 쓰기 성능향상, 캐시가 비우기 전에 시스템이 종료되면 데이터 손실 위험
Cache Eviction(캐시 제거)
- 캐시의 공간이 부족할 때 오래된 데이터나 자주 사용되지 않는 데이터를 제거하는 전략
- LRU(Least Recently Used) : 가장 오랫동안 사용되지 않은 데이터
- LFU(Least Frequently Used) : 가장 사용 빈도가 낮은 데이터
- FIFO(First in First out) : 캐시에 가장 먼저 들어온 데이터 먼저 제거
TTL(Time to Live)
- 캐시 항목에 수명 시간을 설정하여, 일정 시간이 지나면 자동으로 무효화
- 데이터가 자주 변경되거나 실시간 데이터가 필요한 경우 유용
Explicit Invalidation(명시적 무효화)
- 데이터가 변경될 때 개발자가 명시적으로 캐시를 무효화하는 방식
- 데이터베이스의 특정 레코드가 업데이트되면 해당 레코드에 대한 캐시를 무효화
이벤트 기반 무효화
- 특정 이벤트 발생에 따라 캐시 데이터 무효화
- 필요할 때만 무효화가 되도록 하는 정밀한 무효화 접근 방식
버전 기반 무효화
- 캐시에 각 데이터의 버전 번호가 할당되며 데이터가 변경될때마다 버전 번호 증가
- 데이터가 무효화되면 버전 번확 캐시에서 업데이트 되어 가장 최신 버전의 데이터만 사용되도록 함
- 버전 번호 관리를 위한 추가 오버헤드 필요
캐시 무효화란 무엇이며, 왜 필요하다고 생각하시나요?
2. Redis에서 데이터가 영구적으로 저장되지 않는 이유와 이를 방지하기 위한 방법을 설명해주세요
Redis
- 인메모리 기반 데이터 저장소
- 데이터를 빠르게 읽고 쓰는 데 최적화되어 있음
데이터가 영구적으로 저장되지 않는 이유
- 메모리 기반 저장소 : 서버가 재시작되거나 장애가 발생하면 메모리에 저장된 데이터가 모두 사라짐
- TTL : TTL을 설정하면 TTL이 만료되었을 때 해당 키가 자동으로 삭제됨
- Eviction : 메모리 제한이 설정된 상태에서 메모리가 부족할 경우 데이터 제거
영구적인 저장을 위한 방법
- AOF(Append-Only File) 설정 :
- Redis에서 데이터를 영구적으로 저장하기 위한 로그 기반 방법
- 모든 쓰기 연산 기록
- AOF 파일이 커질 수 있음, I/O 작업이 많아져 성능에 영향
- RDS(Snapshot) :
- 데이터베이스 전체 상태 저장
- 복구시 빠르게 로드
- 스냅샷 사이 데이터 변경은 손실될 수 있음
- CPU, 디스크 사용량 증가
- Redis 클러스터 사용
- 데이터를 여러 노드에 분산 저장
- 특정 노드가 다운되더라도 다른 노드에서 데이터 복구 가능
- 클러스터 설정이 복잡함
3. JVM 튜닝을 통한 성능 최적화 방법을 설명해주세요
JVM
- 자바 애플리케이션을 실행하기 위한 가상 머신
- 메모리구조를 통해 자바 프로그램이 효율적으로 실행될 수 있도록 함
- 힙 메모리 크기 조정 (초기 힙 크기, 최대 힙 크기 설정)
- 가비지 컬렉션 튜닝 ( Serial GC, Parallel GC 등 가비지 컬렉션 로그를 분석하고 적절한 알고리즘 선택)
- 쓰레드의 스택 크기를 조정하여 메모리 사용 최적화
- 메타스페이스 크기 조정
- 스레드 풀 크기 조정
4. 스레드 풀과 비동기 작업을 사용한 성능 최적화 방법을 설명해주세요
스레드 풀 사용
-
미리 일정 개수의 스레드를 생성해 두고, 작업이 들어올 때마다 생성된 스레드가 작업을 처리하도록 하는 방식
-
장점 : 스레드 생성 제한, 메모리 및 CPU 사용을 효율적으로 관리, 성능 향상
-
단점 : 복잡성 증가, 데드락
-
재사용 작업큐 스레드수 관리