Docker 이미지 최적화로 Cold Start 줄이기: 실제 경험담
1. 문제점: Docker 이미지 크기가 너무 크다
- 현재 상태
Google Cloud Run에 배포할 컨테이너 이미지를 빌드했는데 크기가 12GB에 달함.- Cloud Run은 서버가 꺼진 상태에서 요청이 들어오면 Cold Start를 통해 이미지를 다시 다운로드하고 환경을 구축함.
- Cold Start 문제: 이미지 크기가 클수록 다운로드와 환경 구축 시간이 오래 걸림.
- 내 앱은 서버에서 health 체크나 sid를 받지 않으면 부트스플래시 화면에서 넘어가지 않도록 설계했는데, 이 과정에서 대기 시간이 길어져 사용자 경험이 저하됨.
- 앱 구조 변경 아이디어
- 앱 진입점에서 health 체크만 받은 후, 사용자가 이미지를 업로드하면 로딩 상태로 둠.
- 서버는 작업을 큐에 넣어 대기하고, 클라이언트의 sid가 연결되자마자 업로드 엔드포인트 실행.
- 이를 통해 초기 로딩 속도를 개선.
2. Docker 이미지 용량 확인 및 분석
1) 이미지 레이어와 크기 확인
- Docker Desktop을 사용해 레이어 크기를 확인했더니 총 8GB.
- 하지만 전체 이미지 크기는 12GB로 나타남.
2) Dive 설치 후 분석 시도
- Dive 설치 방법
- Dive 설치 후 환경 변수 PATH에 추가.
- dive image-name 명령으로 이미지 분석.
- 문제 발생
- 이유: Docker 설정에서 containerd 기반 이미지 스토리지를 사용하도록 되어 있었음.
-
shell코드 복사could not find 'blobs/sha256/... in parsed layers
3. 문제 해결: Docker 설정 변경으로 용량 감소
1) Docker Desktop 설정 변경
- 설정 → General → Use containerd for pulling and storing images 옵션 체크 해제.
- 결과: 이미지 크기가 12GB → 8GB로 감소.
2) 이유 분석
- Containerd 옵션 활성화
- 멀티 플랫폼 이미지 지원.
- 보안 검증(이미지 서명 등) 활성화.
- Google Cloud Run은 containerd를 사용하므로 호환성이 높음.
- Containerd 옵션 비활성화
- 단일 플랫폼(예: linux/amd64) 이미지만 사용 시 메타데이터가 줄어 이미지 크기 감소.
- Cloud Run은 단일 플랫폼 이미지를 기본 지원하므로 비활성화 상태에서도 문제 없음.
3) 결론
- 조직적 배포 환경이 아니라면 비활성화로 이미지 크기를 줄이는 것이 Cold Start 문제 해결에 유리.
4. Dive로 대용량 라이브러리 확인
1) Dive 분석
- Dive 명령어로 분석 후 site-packages 디렉토리를 조사.
- du -sh * 명령어를 사용해 라이브러리별 메모리 크기 확인.
2) 결과
- 가장 큰 용량을 차지하는 라이브러리:
- nvidia (2.7GB): GPU 관련 패키지.
- torch (1.7GB): PyTorch GPU 버전.
- opencv, scipy 등도 각각 수백 MB 이상.
5. 문제 해결: GPU 패키지 → CPU 패키지로 전환
1) GPU → CPU 변경
- Docker requirements.txt에서 PyTorch 및 torchvision을 CPU 버전으로 명시.
text
코드 복사
--extra-index-url https://download.pytorch.org/whl/cpu torch==2.5.1+cpu torchvision==0.20.1+cpu
2) 결과
- 이미지 크기: 12GB → 3.5GB
- GPU 패키지 제거로 약 8.5GB 감소.
- torch와 nvidia가 전체 최적화에 크게 기여.
6. 추가 테스트
1) Dive 결과
- Dive 분석 화면에서 모든 레이어와 라이브러리 크기 재확인.
- GPU 패키지가 제거된 후 용량이 적절히 줄어든 것을 확인.
2) Cloud Run 테스트
- 최적화된 이미지를 Cloud Run에 배포.
- 실제 Cold Start 시간 확인(예상: 대폭 감소).
7. 추후 계획
- 구현 변경:
- 앱 진입점에서 health 체크만 수행.
- 사용자가 이미지를 업로드하면 큐에 작업을 대기시키고, 서버가 준비되면 업로드 처리.
- Cloud Run Cold Start 테스트:
- Cold Start 시간 비교.
- 최적화 전/후 속도 차이 기록.
8. 결론
- Docker 이미지는 크기가 작을수록 배포 속도가 빨라지고 Cold Start 시간이 줄어든다.
- Dive와 Docker Desktop을 활용해 대용량 요소를 파악하고 최적화 가능.
- 단일 플랫폼, CPU 기반으로 전환하면 대부분의 애플리케이션에서 충분히 효율적으로 동작.
- 추가로 Docker 이미지 설계 및 최적화 방법론을 학습하고 적용할 계획.
'플러팅 AI > Flask Server' 카테고리의 다른 글
| Google Cloud Run에서 AI 서버 구현기 (0) | 2024.12.08 |
|---|---|
| OCR 엔진 교체 후에도 메모리 누수 발생 시 대처법 (1) | 2024.12.07 |
| 다중 워커 간 메모리 공유 문제 해결 (0) | 2024.12.03 |
| 다중 워커 간 메모리 공유 문제 이해 (0) | 2024.11.30 |
| # Flask-SocketIO에서 `connected_clients` 상태 관리 문제 해결 (0) | 2024.11.30 |