gbmin's Tech Notes

서버 구축 및 유지보수, 클라우드 컴퓨팅, 네트워크 보안, IT 분야 기술 노트. :)

Tech Notes/Linux

PHP OPcache 설치 및 설정 방법

gbmin 2023. 7. 28. 11:54

PHP OPcache는 PHP 엔진에 내장된 확장 모듈로 스크립트의 바이트 코드를 서버의 메모리에 캐싱 함으로써 PHP 처리와 웹 응답 속도를 향상할 수 있다. OPcache 설정으로 그 효과는 봤을 때는 왜 이걸 이제 사용했나 싶었다. 하지만 OPcache 설정이 무조건 좋은 건 아니다. 여러 가지 주의해야 할 사항도 있으니 OPcache에 대한 기능과 동작 방식을 제대로 알고 사용해야 성능 최적화를 이룰 수 있다.


[목차]

1. OPcache 소개

2. OPcache 설치

3. OPcache의 설정 옵션

4. OPcache 사용 시 주의할 사항


 

1. OPcache 소개

PHP OPcache는 PHP 엔진에 내장된 확장 모듈로, PHP 스크립트의 바이트 코드를 서버의 메모리에 저장함으로써 PHP의 성능을 향상할 수 있다. PHP 성능이 향상됨으로써 웹 응답 시간이 감소하여 덩달아 웹 응답 시간이 감소하며 웹응답 속도향상도 기대해 볼 수 있다.
기본적으로 PHP 코드는 각 요청마다 해석되고 실행되는데 PHP OPcache는 이 과정을 개선하여 효율을 극대화한다. 코드가 처음 실행될 때, OPcache는 PHP 스크립트를 컴파일된 상태인 바이트 코드로 변환하고 이를 메모리에 저장한다. 그러면 다음 요청이 올 때, PHP는 이미 컴파일된 바이트 코드를 메모리에서 직접 실행할 수 있다. 이렇게 함으로써 컴파일 단계를 생략하고 실행 시간을 단축시킬 수 있는 것이다. OPcache는 웹 서버가 재시작될 때까지 바이트 코드를 메모리에 유지하며, 설정에 따라 특정 시간이 지난 후에 바이트 코드를 자동으로 재컴파일 할 수도 있다. 자세한 설정 내용은 하단 내용에 정리하였다.

 

2. OPcache 설치

작성된 내용은 Centos7 Remi 저장소를 통해 설치한 PHP 환경을 예로 들었다.
확장 모듈 방식으로 설치하면 되며 각 OS 별 PHP 설치 환경이 다양 하니 본인 환경에 맞는 방법을 찾아야 한다.

 

 

2.1. 모듈 설치 및 활성화

# yum install php-opcache

 

 

2.2. 모듈 설치 확인

# php -m | grep OPcache
Zend OPcache
Zend OPcache

 

2.3. OPcache 설정

설정 파일 확인

# php --ini
Configuration File (php.ini) Path: /etc
Loaded Configuration File: /etc/php.ini
Scan for additional .ini files in: /etc/php.d
Additional .ini files parsed: /etc/php.d/10-opcache.ini,
~ 이하 생략

 /etc/php.d/10-opcache.ini 경로로 OPcache 설정 파일이 추가된 것을 볼 수 있다.

설정 값 추가

opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.revalidate_freq=60
opcache.fast_shutdown=1

이 설정은 OPcache를 활성화, 사용할 메모리 양을 설정, 최대 파일 수를 지정, 스크립트 재검증 빈도, 빠른 종료 활성화하는 등 간단한 설정을 적용하였다.

설정 값 적용 확인

# php -i | grep opcache
Additional .ini files parsed => /etc/php.d/10-opcache.ini,
opcache.blacklist_filename => /etc/php.d/opcache*.blacklist => /etc/php.d/opcache*.blacklist
opcache.consistency_checks => 0 => 0
opcache.dups_fix => Off => Off
opcache.enable => On => On
opcache.enable_cli => On => On
opcache.enable_file_override => Off => Off
opcache.error_log => no value => no value
opcache.file_cache => no value => no value
opcache.file_cache_consistency_checks => On => On
opcache.file_cache_only => Off => Off
opcache.file_update_protection => 2 => 2
opcache.force_restart_timeout => 180 => 180
opcache.huge_code_pages => Off => Off
opcache.interned_strings_buffer => 8 => 8
opcache.lockfile_path => /tmp => /tmp
opcache.log_verbosity_level => 1 => 1
opcache.max_accelerated_files => 10000 => 10000
opcache.max_file_size => 0 => 0
opcache.max_wasted_percentage => 5 => 5
opcache.memory_consumption => 128 => 128
opcache.opt_debug_level => 0 => 0
opcache.optimization_level => 0x7FFEBFFF => 0x7FFEBFFF
opcache.preferred_memory_model => no value => no value
opcache.preload => no value => no value
opcache.preload_user => no value => no value
opcache.protect_memory => Off => Off
opcache.restrict_api => no value => no value
opcache.revalidate_freq => 2 => 2
opcache.revalidate_path => Off => Off
opcache.save_comments => On => On
opcache.use_cwd => On => On
opcache.validate_permission => Off => Off
opcache.validate_root => Off => Off
opcache.validate_timestamps => On => On


설정 적용

# systemctl restart httpd

설정 적용을 위해서는 PHP와 웹서비스를 재시작해야 한다. 필자는 apache를 사용 중이기 때문에 apache를 재시작하였다.


3. OPcache의 설정 옵션

OPcache의 설정 옵션을 조정함으로써 PHP 스크립트의 컴파일 및 실행 방식을 세밀하게 제어할 수 있다.

참고로 설정 값의 0과 1은 보통 프로그래밍 언어에서 boolean 값으로 사용되며, 이는 '참' 또는 '거짓'을 나타낸다.
일반적으로 0은 '비활성화' 또는 '아니요'를 의미하고, 1은 '활성화' 또는 '예'를 의미하니 설정 시 혼동되지 않도록 주의해야 한다.

설정 옵션 설명
opcache.enable OPcache 확장을 활성화하거나 비활성화하는 데 사용 (기본값: 1)
opcache.memory_consumption OPcache가 사용할 수 있는 메모리를 메가바이트(MB) 단위로 설정 (기본값: 128)
opcache.interned_strings_buffer 인터닝된 문자열을 저장하기 위해 사용할 메모리 양을
메가바이트(MB) 단위로 설정 (기본값: 8)
opcache.max_accelerated_files OPcache에 저장할 수 있는 최대 파일 수를 설정 (기본값: 10000)
opcache.revalidate_freq 스크립트 타임스탬프 검증 주기를 초 단위로 설정 '0'은 항상 검증하라는 의미이며,
'0' 이외의 값은 해당 시간 간격마다 검증하라는 의미 (기본값: 2)
opcache.validate_timestamps 파일 타임스탬프를 검사하여 스크립트가 변경되었는지 확인하는 기능 (기본값: 1)
opcache.revalidate_path 스크립트가 파일 시스템에서 새로 발견될 때마다 스크립트의 위치를 재검증할지 여부를 설정 (기본값: 0)
opcache.save_comments OPcache가 주석을 저장하고 API 함수에 의해 사용되는 Doc Comments를 유지할지 여부를 설정 (기본값: 1)
opcache.fast_shutdown 고속 종료를 사용하는 경우, 스크립트 종료 시 추가 메모리 해제를 건너뛰게 됨, 종료 과정이 빨라짐 (기본값: 0)
opcache.enable_cli CLI 모드에서 OPcache를 활성화여부를 결정
CLI 모드에서는 보통 OPcache를 사용하지 않음, 디버깅이나 특정 테스트를 할 때만 사용하는 것을 권장함 (기본값: "0")

 

 

4. OPcache 사용 시 주의할 사항

OPcache 사용으로 많은 이점이 있지만 일부 상황에서는 주의가 필요하다. 몆 가지 주요 단점 및 주의사항을 정리하였다.

 

스크립트 변경 감지 지연

OPcache는 파일 변경을 즉시 감지하지 않는다. 이는 opcache.revalidate_freq 설정에 따라 조정된다. 이로 인해 개발 환경에서는 코드 변경이 즉시 반영되지 않을 수 있으므로, OPcache는 일반적으로 프로덕션 환경에서만 사용하는 것이 좋다.

 

메모리 사용량 증가

OPcache는 컴파일된 스크립트를 메모리에 저장하기 때문에, 시스템 메모리 사용량이 증가한다. 이로 인해 메모리가 충분하지 않은 시스템에서는 성능 저하가 발생할 수 있다.

 

복잡한 설정

OPcache는 여러 설정 옵션이 있는데, 이를 효율적으로 관리하려면 시스템에 대한 이해가 필요하다. 설정이 잘못되면 성능 저하나 다른 문제를 일으킬 수 있기 때문이다.

 

Segmentation Fault 발생 가능성

OPcache를 사용하면서 Apache "Segmentation Fault" 오류가 발생하는 경우가 있다. 이는 보통 메모리 관련 이슈, 특히 PHP 확장모듈과 Apache 확장 모듈 같은 외부 코드를 실행할 때 잘못된 메모리 영역을 쓰려고 할 때 발생될 수 있다. Segmentation Fault 에러는 기본적으로 apache error.log 에 남기 때문에 OPcache 설정 후 에러가 발생되는지 모니터링을 하는 게 중요하다.

 

Segmentation Fault 발생될 수 있는 상황.

  • 메모리 부족: 시스템에서 사용 가능한 메모리가 부족하면, 프로세스가 필요한 메모리를 할당받지 못하고 "Segmentation Fault"를 발생시킬 수 있다. 메모리를 확보하거나 증설해야 한다.
  • 라이브러리 충돌: 서로 다른 라이브러리 또는 확장 기능이 메모리를 공유하거나, 같은 리소스에 동시에 액세스 하려고 시도할 때 "Segmentation Fault"가 발생할 수 있다. 이런 경우, 충돌이 발생하는 라이브러리나 확장 모듈을 찾아 수정하거나, 필요하다면 제거해야 한다.
  • 버그가 있는 코드: 프로그램 코드에 버그가 있거나, 잘못된 메모리 액세스를 시도하는 코드가 있을 때 "Segmentation Fault"가 발생할 수 있다. 이런 경우, 버그를 찾아서 수정해야 하는데, 이는 디버거를 사용하거나, 코어 덤프를 분석하는 방법을 써야 한다.