Extra Form
PHP PHP 8.1
CMS Rhymix 2.0

안녕하세요

PHP7 버전 때 부터 opccache.preload 설정을 지원하는것 같은데요,

혹시 라이믹스에서는 이를 활용할 방법 (타겟으로 지정해두면 속도 향상에 도움이 될) 이 있을까요?

관련 문서 링크입니다.

https://www.php.net/manual/en/opcache.configuration.php#ini.opcache.preload

 

웹 호스팅 유저는 적용을 못하더라도, 독립서버 유저들은 어쩌면 사용을 해볼 수 있을것 같아서요! 

  • profile

    preload 기능 자체는 PHP-FPM 재시작 후 최초 1회의 요청을 처리하는 속도에만 영향을 미칩니다. preload를 사용하지 않아도 2회째부터는 이미 대부분의 함수와 클래스들이 opcache에 캐싱되어 있을 테니까요.

     

    그러나 실제로 preload 기능을 사용하면 2회째 이후에도 속도가 꽤 빨라지는데, 그건 preload된 파일 한정으로 opcache.validate_timestamps 설정을 끈 것처럼 취급하기 때문입니다. preload된 파일의 수정 여부를 체크하지 않고, 수정하더라도 무시하고, 처음에 preload한 버전만 계속 사용하는 거지요. 그냥 opcache.validate_timestamps 설정만 꺼도 preload를 사용하는 것과 거의 동일한 성능 개선 효과를 얻을 수 있다고 하더군요.

     

    물론 opcache.validate_timestamps 설정은 모든 PHP 파일에 무분별하게 적용되기 때문에, 특정 파일의 수정 여부만 체크하지 않도록 하려면 preload가 좀더 나은 방법일 수 있습니다. 예를 들어 모듈이나 애드온은 수시로 수정하지만 코어는 절대 건드리지 않는 분이라면 코어에 포함된 파일들만 preload해서 속도를 향상시키고, 모듈이나 애드온은 수정 여부를 그때그때 체크하도록 할 수 있겠지요.

     

    여기까지는 성능 개선에 대한 의견이고, 아래는 opcache에서 파일 수정 여부를 체크하지 않도록 할 경우의 주의사항입니다. preload를 사용하든 opcache.validate_timestamps를 끄고 쓰든 마찬가지로 해당됩니다.

     

    1. 라이믹스 코어에서 사용하는 캐시파일이나, Rhymix\Framework\Storage::write() 등 코어에서 제공하는 함수를 사용해서 변경한 파일은 그때마다 opcache_invalidate()해주기 때문에, 사실 opcache.validate_timestamps를 완전히 꺼놓고 써도 어마어마한 문제가 생기지는 않습니다. 뭔가 수정할 때마다 opcache를 비우거나 PHP-FPM을 재시작해 줘야 하는 불편이 있을 뿐이죠. 예를 들어 실서버에서 소스를 일체 수정하지 않고 git 저장소를 통해 push/pull만 하는 분이라면, git pull 직후에 hook을 사용해서 opcache를 비워주도록 세팅할 수 있겠지요.

     

    2. 단, 캐시파일 재생성 기능을 사용해서 일괄 삭제된 파일이나, 서드파티 자료가 생성한 파일은 제대로 갱신되지 않을 수도 있으므로 평균 이상의 디버깅 실력을 갖추신 분 외에는 이런 식으로 운영하는 것을 권장하지 않습니다. 일부 파일은 갱신되고 일부 파일은 갱신되지 않으면 정말 난감한 상태가 되거든요. 일반적이지 않은 서버 환경에서 괴랄한 버그가 발생하면 아무도 못 도와드려요. 이런 미세최적화에 신경쓰는 것보다 오래된 애드온, 잘못 만든 모듈 하나 정리하는 편이 현실적으로 훨씬 더 도움이 되기도 하고요.

     

    3. 따라서 코어에서는 일반 사용자에게 피해를 끼칠 가능성이 높은 preload 스크립트나 설정 예제를 제공하지 않겠습니다. php, html, xml, scss 등 무엇이든 수정하면 별도의 빌드, 컴파일, 캐시비움 등의 과정 없이 즉시 반영되도록 한다는 라이믹스의 대전제에 어긋나기도 하고요.

     

    4. opcache 특성상 많은 파일을 수정하면 캐시 꼬임 버그에 걸릴 가능성도 그만큼 높아지므로, preload와 무관하게 files/cache 폴더는 아예 opcache blacklist에 등록해 버리는 편이 낫습니다. 이렇게 하면 나머지 파일들은 preload하거나 opcache.validate_timestamps를 꺼놓아도 문제가 될 가능성이 그나마 줄어들 것 같습니다.

  • profile profile

    감사합니다, 자세히 설명해주셔서 궁금증이 풀렸어요

    어차피 preload나 opcache나 메모리에 기계어로 컴파일되어 올라가는 원리는 똑같으니까, 거기서 거기라고 생각하면 되겠군요~