자체 호스팅 음원 스트리밍 서비스는 보관 곡 수가 대규모로 늘어날 때 심층 페이징과 특정 집계 쿼리에서 처리 지연이 급격히 증가하기 쉽습니다. 대용량 음악 라이브러리의 실제 운영 부하를 정확히 파악하기 위해 500,500곡 기준 데이터셋을 바탕으로 PureStream의 Subsonic 프로토콜 읽기 경로를 종합적으로 측정하고 성능 수치를 기록했습니다.
테스트 범위 및 데이터셋 구축
음악 수집가의 로컬 라이브러리는 수십만 곡 규모에 달하기도 합니다. Subsonic 프로토콜의 대표적인 엔드포인트(search3 열거, getMusicDirectory 디렉터리 탐색, getAlbumList2 앨범 목록)는 데이터 규모에 따라 비용 구조가 크게 달라집니다. 커버링 인덱스가 적용되는 경로가 있는 반면 전체 테이블 중복 제거와 그룹 집계가 필요한 경로도 있습니다. 이번 테스트에서는 다음 작업을 진행했습니다:
- [x] 테스트 데이터셋 생성: 약 4.2만 장의 앨범, 2,000명의 아티스트, 100개 장르를 포함하는 50만 건의 미디어 데이터를 생성하고 마이그레이션을 거쳐 프로덕션과 동일한 SQLite 데이터베이스 구성
- [x] 장르 조회용 인덱스 추가: 장르 쿼리에 커버링 읽기 인덱스를 적용하고 스키마 무결성 검증을 도입하여 인덱스 누락 방지
- [x] 성능 기준선 데이터 수집: 핵심 14개 읽기 경로에 대해 P50 및 P95 지연 시간을 샘플링하여 기준 보고서 작성
핵심 읽기 경로 실측 수치
| 엔드포인트 | 10만 곡 | 50만 곡 | 평가 |
|---|---|---|---|
| search3 메인 열거 | 53µs | 69µs | 안정 |
| search3 심층 페이지 (offset=25만) | — | 25ms | 안정 |
| getMusicDirectory 단일 페이지 | 1.3ms | 1.4ms | 안정 |
| getAlbumList2 3가지 페이징 | 8–82ms | 86–333µs | 안정 |
| getSongsByGenre | 미측정 | 113µs | 인덱스 효과 확인 |
| FTS 텍스트 검색 | 24.8ms | 137ms | 선형 증가 |
| getArtists 중복 제거 열거 | 3.4ms | 543ms | 집계 병목 |
| getGenres 집계 | 미측정 | 600ms | 허용 범위 내 |
| 대용량 단일 디렉터리 심층 페이지 | — | 734ms | 경계 조건 |
주요 지표 분석:
- 메인 열거 처리 시간 (69µs): search3 기본 쿼리는 50만 행 환경에서도 마이크로초 수준의 응답을 유지합니다. 유효 행만 인덱싱하는 부분 커버링 인덱스를 적용하여 백그라운드 카탈로그 스캐너 쓰기 작업 중에도 읽기 성능을 보장합니다.
- 심층 페이징 (25ms): 25만 번째 곡 오프셋 위치에서 단일 페이지를 가져오는 처리 시간은 25밀리초로, 깊은 오프셋에서도 밀리초 단위의 응답 속도를 유지합니다.
- 장르별 곡 조회 (113µs): 신규 추가된 커버링 인덱스를 통해 실행 계획이 전체 테이블 스캔에서 인덱스 탐색으로 전환되어 실행 시간이 대폭 단축되었습니다.
성능 병목 분석
측정을 통해 연산량이 집중되는 두 가지 쿼리의 특성이 명확히 드러났습니다:
- getArtists 중복 제거 열거 (543ms): 기본 아티스트와 참여 아티스트 필드를 통합하고 그룹화하는 과정에서 전체 테이블 순회가 발생합니다. 50만 곡 규모에서도 1초 미만으로 완료되어 현재는 기술 관찰 대상으로 분류했습니다.
- getGenres 집계 연산 (600ms): 장르 통계는
COUNT(DISTINCT album)을 통해 고유 앨범 수를 계산하므로 50만 곡 규모에서 약 600밀리초가 소요됩니다.
주요 개선 성과
- [x] 50만 곡 환경에서 14개 핵심 읽기 엔드포인트의 P50/P95 성능 기준선 수립
- [x] 장르 전용 읽기 인덱스 배포 및 스키마 등록, 실행 계획 단언 테스트 보강
- [x] 중복 제거 및 집계 쿼리의 연산 부하 정량화 및 개선 방향 도출
향후 작업 과제
- [ ] 프로토콜 레벨 페이징 개선: offset 매개변수가 없는 엔드포인트에 커서 기반 탐색을 도입하여 심층 순회 부담 완화
- [ ] 재생 중인 스트리밍 세션 권한 검증 쿼리 통합 최적화
