DB 보다 더 높은 성능의 read/write 가 필요할때
웹 서비스를 운영하다 보면 DB의 성능만으로는 부족한 순간이 찾아온다. 특히 실시간으로 빠른 응답이 필요하거나, 반복적으로 같은 데이터를 조회하는 경우에는 DB 대신 캐시를 활용하는 것이 좋은 선택이 될 수 있다.
캐시로 활용할수 있는 in-memory DB 들과 apcu
대표적인 in-memory DB로는 Redis와 Memcached가 있다. 이들은 독립적인 서버로 운영되며, 분산 환경에서도 잘 동작한다. 하지만 단일 서버 환경에서는 이러한 별도의 서버를 띄우는 것이 오히려 오버헤드가 될 수 있다. 이때 PHP에서 제공하는 apuc 를 고려해볼 수 있다.
apcu 의 특징 및 장단점
PHP 프로세스와 apcu의 관계
- PHP-FPM은 master process와 여러 개의 worker process로 구성됨
- apcu는 master process의 메모리 공간에 상주하며, 모든 worker process가 이 메모리를 공유함
- worker process가 새로 생성되거나 재시작되어도 master process의 apcu 캐시는 유지됨
- 하지만 PHP-FPM 서비스 자체(master process)가 재시작되면 apcu 캐시도 함께 초기화됨
장점
- PHP 프로세스 내부에서 직접 동작하므로 매우 빠른 속도를 보여줌
- 별도의 서버 설정이 필요 없음
- 모든 PHP worker process가 동일한 캐시 공간을 공유
- 설치와 사용이 매우 간단함
- 메모리 사용량이 적음
단점
- PHP master process에 종속되어 있어 PHP-FPM 재시작시 캐시가 초기화됨
- CLI 환경에서는 프로세스간 공유가 불가능
- 분산 환경에서 사용할 수 없음
주의사항
CLI 스크립트 실행시 주의점
- CLI에서는 각 실행마다 새로운 프로세스가 생성되어 캐시가 공유되지 않음
- php.ini의 apc.enable_cli=1 설정이 있더라도 프로세스간 공유는 불가능
- CLI 작업이 필요한 경우 HTTP 요청으로 우회하거나 다른 캐시 솔루션 고려
APCu의 apc.enable_cli 설정 이해하기
## 기본 목적
- 주로 테스트와 디버깅 용도로 사용
- CLI 환경에서 apcu 캐시를 사용할 수 있게 해주는 설정
## 작동 방식의 차이
- **웹 서버(PHP-FPM)에서는:**
- master process가 메모리를 공유
- worker process들이 공유된 메모리 접근
- **CLI에서는:**
- 매 실행마다 새로운 프로세스가 생성되어 실행
- 캐시 생성 → 사용 → 프로세스 종료시 파괴
- 이 과정이 매 실행마다 반복
## 실제 사용시 주의점
- 프로덕션 환경의 CLI 스크립트에서는 권장되지 않음
- 각각의 CLI 실행은 독립적인 프로세스라 캐시가 공유되지 않음
- 예를 들어 cron job A와 cron job B는 서로 다른 캐시 공간을 가짐
## 적합한 사용 케이스
- 단위 테스트 실행시
- apcu 관련 기능 디버깅할 때
- 개발 환경에서 테스트할 때
따라서 apc.enable_cli=1
은 실제 운영 환경보다는 개발/테스트 단계에서 APC의 동작을 확인하고 디버깅하는 용도로 사용하는 것이 바람직함
웹서버 재시작 고려
- PHP-FPM master process 재시작시 캐시가 초기화되므로 중요 데이터는 DB에 백업 필요
- 계획된 재시작의 경우 캐시 워밍업 전략 수립 필요
- worker process의 재시작은 캐시에 영향을 주지 않음
메모리 관리
- 제한된 메모리를 효율적으로 사용하기 위해 캐시 만료 시간 설정 필요
- 너무 큰 데이터는 저장을 피해야 함
결론
APC는 단일 서버 환경에서 매우 효과적인 캐싱 솔루션이다. PHP master process의 메모리를 공유하는 방식으로 동작하기 때문에 모든 worker process가 빠르게 캐시에 접근할 수 있다. 다만 master process 재시작시 캐시가 초기화되거나 CLI 환경에서 제약이 있는 점을 고려해야 한다. 결국 서비스의 특성과 요구사항에 맞는 적절한 선택이 중요하다.
참고자료
'IT > php' 카테고리의 다른 글
[PHP] ?: 와 ?? 연산자의 차이점 (0) | 2024.09.12 |
---|---|
[PHP] 자식 클래스에서 상속 받은 const 값 선언 강제 하는법 (0) | 2024.02.07 |
[PHP] Carbon 사용시 주의점 (0) | 2023.02.02 |