1. 초보가 상식으로 정리해보는 cache 이야기
오늘 마지막으로 Memcached를 설치해보고 워드프레스 속도 최적화 프로젝트(?)는 종료하면서 초보가 보기에 의미가 있는 cache 이야기해 보려고 합니다.
이 포스팅은 공유 목적도 있지만 제 자신의 기록과 나중에 참고할 자료 성격이 더 강합니다. 아무래도 이 포스팅을 위해서 고민을 많이하다보니 자료가 어디있지라는 생각에 제일 먼저 떠오르는 곳이 이 곳이기 때문에 저는 여기에 올린 포스팅을 종종 참조하곤 합니다. 그리고 저라도 활용을 해야 할 듯 싶기도 합니다.
다만 이 포스팅의 한계는 분명합니다. 미래를 앞서가는 개발자에게 어떤 인사이트를 제공하고 개발자분들에게 명확한 가이드가 되는 포스팅은 아닙니다. 먼저 고민을 하고 구글링한 결과를 한글로 정리한 것에 불과할 수도 있습니다. 이런 고민을 하는 초심자들에게는 조금 도움은 될 수 있지 않을까 합니다.
오늘 서버 성능을 개선해보고자 cache 부분을 어떻게 개선할까 고민했습니다.
2. 고민의 계기 – newspaper 7 테마에서 APC 를 추천하다.
그 고민의 시작은 newspaper 7 테마 제작사에서 테마의 속도를 올리는 방법으로 APC full page cache를 사용하라고 조언을 하더군요. 그래서 이게 대단한 것 같아서 자료를 찾아보고 설치를 해보았습니다.
아래는 newspaper 7 테마 제작사에서 권유하는 내용입니다.
- we recommend that you use WP Super cache with default settings.
- you can also use the APC full page cache if you have a lot of ram on your server
구글링으로 알아본 cache에 대해서 간략히 정리해 봅니다.
APC는 매우 낡은 기술로 더 이상 잘 사용하지 않는 기술이라고 합니다.
이렇게 낡은 기술을 newspaper 7과 같은 최신 테마에서 사용하라고 가이드 한다는 점에서 굉장히 실망하게 되었습니다.
그러면서 이 테마는 최근에 최신 기술을 기반으로 만들어진 테마라기보다는 오래전에 나온 테마를 계속 업데이트 해온 것이 아닐까 하는 생각이 들었습니다.
알고보니 이 테마가 처음 등장한 것은 2014년 경으로 이 당시는 APC가 그 낡은 기술은 아니었던 것으로 보입니다.
아마 예전에 만들었던 마케팅 커뮤니케이션 자료들이 최신 기술등으로 업데이트되고 있지 않다는 게 최종 결론입니다.
3. Cache 프로그램에 대해서
Cache에 대해서 구글링을 하다보면 만나는 단어들이 있습니다. APC, XCache , Opcache, Memcache, Memcached 그리고 Tarantool (HASH), Tarantool (TREE), Redis, Azure Redis Cache, CouchBase Redis등등이 그것입니다.
굉장히 많은 종류의 Cache가 있지만 워드프레스를 운영하는 초보 입장에서는 APC, Opcache, Memcache, Memcached가 많은 접하는 수준의 단어들인 것 같습니다.
그런데 이 cache관련 내용은 들어도 잘 모르는 알송달송한 내용이 대부분인듯… 역시 전문 분야는 다른 것 같다는 생각입니다.
Nginx서버에서의 Cache 관련 구글링을 통해서 얻은 내용을 아래와 같이 간략히 정리해 봅니다.
-
Cache에는 Full page cache, PHP Script 결과를 모아 두는 cache, 데이타베이스 Query 결과를 모아두는 cache로 나눌 수 있다.
-
Full page cache는 PHP를 통해서 HTML 형태로 page를 구성한 결과를 보관했다가 요청이 오면 바로 보여주어 속도를 높이는 기법으로 Nginx에서는 FastCGI가 가장 좋은 성과를 보여 준다,
-
PHP Script Cache는 말 그대로 PHP Script를 컴파일한 결과를 공유 메모리에 저장하고 있다가 필요 시 사용하는 cache로 요즘 OPcache가 가장 성능이 좋다고 알려 있다.
-
APC는 PHP Script 결과를 모아 두는 cache + 데이타베이스 Query 결과를 모아두는 cache 모두 커버하는 기술이었다.(아래 개발군님의 댓글 참조)
-
xcache, wincache, eAccelerator 등등은 구닥다리 기술로 쳐다볼 필요조차 없다
-
APC의 PHP 관련 기능은를 대신해서 PHP 5.5이상에서는 자체 OPcache로 대체되었고, PHP 5.5이하에서 Opcache를 사용하려면 별도 프로그램을 깔아야 한다.
-
PHP 5.5이상에서 APC의 기능 중 데이타베이스 쿼리(query) Cache 부분은 APCu라는 php 확장 모듈을 사용 할 수 있다.
-
데이타베이스 쿼리(query) Cache에는 APCu나 Memcached가 있다. 이중에서 단독 머신에서 사용하기에는 APCu가 빠르며, 머신 3개이상을 운영한다면 Mencached가 낫다는 평가가 있다.
-
OPcache와 Memcached의 차이는 OPcache는 위에서 설명한 대로 PHP Script 결과를 모아 두는 cache이고, Memcached는 주로 데이타베이스 쿼리(query) 결과를 보관하는 cache라는 차이가 있다.
-
Opcache나 APCu가 Redis 또는 Memcached 보다 속도면에서 유리한 이유는 Redis나 Memcached는 별도 서버와 통신을 통해서 작동하는 방식이라 규모가 작은 시스템에서는 상대적으로 느맇 수 있다. 반면 OPcache나 APCu는 연결할 필요없이 바로 서버 공유메모리에 바로 Caching하기 때문에 빠르고 메모리도 절약된다, Memcached와 Redis의 작동 방식은 같다.
-
Opcache와 Memcached를 같이 쓰는 것에 대해서 OPcache는 PHP Script Cache이고 Memcached는 데이타베이스 Query Cache이므로 같이써도 무방하다. 이를 같이 쓰는 경우를 많이 발견할 수 있다. 특히 사용자가 많은 경우 시스템을 효율적으로 공유할 수 있는 유용성때문에 같이 사용한다.
아래에서는 비교적 최신 기술이고 PHP 5.5이상에서 내장되어 사용되는 OPcache에 대해서 살펴보도록 하겟습니다.
4. OPcache 의미와 설정법
OPcache는 byte코드로 컴파일된 명령문(PHP Script)으로 공유된 메모리에서 PHP 문서 해석 시간을 줄여 성능을 개선시킵니다. Opcache는 낮은 CPU 자원을 사용하면서 빠른 해석으로 개벌적 접속자가 상대적으로 빠른 속도감을 느낄 수 있습니다.
아래는 PHP Script를 처리하는 과정에 대한 플로우 차트인데 Cache와 PHP Script 컴파일이 잔행되는 프로세스를 살펴볼 수 있습니다. 이 플로우 차트는 Basics of PHP opcode cache
에서 가져왔습니다.
Opcache는 PHP 5.5부터 내장되어 설치되며 5.4이하에서는 PECL 방식으로 사용이 가능합니다.
Opcache는 PHP.ini 파일에서 환경 설정을 효율적 세팅함으로써 효울을 더 높힐 수 있습니다.
4.1. OPcache 적용 여부 확인
우선 OPcache가 작동하고 있는지 확인하는 방법은
첫째, php.ini 설정을 살펴보면 됩니다.
ubuntu 계열에서 php.ini 파일은 /etc/php/7.2/fpm/ 폴더에 있습니다. (PHP Version만 달라짐)
vi /etc/php/7.2/fpm/php.ini
여기에서 OPcache 관련 항목이 있으면 설치되어 작동하고 있는 것입니다.
또한 일반적으로 많이 사용하는 php-info.php를 활용해서 확인 할 수 있습니다.
먼저 아래와 같은 내용의 php-info.php 파일을 만들어 계정의 루트에 올립니다.
그 다음 인터넷 브라우저에서 (yourdomain)/php-info.php를 치면 php의 관련 내용이 나오는데요.. 여기서 opcache 관련 내용을 확인하면 됩니다.
<?php
phpinfo();
?>
4.2. php.ini에서 OPcache 설정
php.ini 파일을 열어보면 OPcache 관련해 앞에 주석 처리된 명령문들이 많이 있습니다.
이 명령문 중에서 상호 관련이 있는 변수는 opcache.memory_consumption, pcache.max_accelerated_files, opcache.max_wasted_percentage의 3가지로 서로 충돌이 나지 않토록 설정하는 게 관건으로 보입니다.
-
opcache.memory_consumption은 기본값이 64MB로 되어 있는데요. 메모리의 여유가 있다면 늘려주는 게 좋을 것 같습니다. 원래 256MB를 설정했는데, OPcache 모니터링 프로그램으로 며칠 살펴보니 70MB이하로 사용되고 있어서 96MB로 최종 설정했습니다.
-
opcache.max_accelerated_files은 한번에 처리하는 캐시 파일 수 인데요. 이는 200에서 1,000,000사이의 값을 넣게 되어 있고 기본값은 2000입니다. 램에 여우가 있다면 기본보다 높이는게 좋겠죠. 저는 100,000으로 설정했습니다만 실제로 1,300개 정도 사용되고 있는 것으로 보아 개인 사이트라면 10,000정도면 충분할 것 같습니다.
-
opcache.max_wasted_percentage는 Opcache가 재시작을 해야할 시 버려야하는 비율을 정하는 것입니다. 기본값은 5%로 되어 있습니다. 일반적으로 기본보다 더 높여주는 것 같습니다.
-
opcache.revalidate_freq는 php소스 변경 확인 간격을 말하는데요. 개발자라면 이를 0으로 놓아 바로 바로 확인토록 하고, 일반인이라면 60 또는 180으로 설정합니다.
그외 일반적으로 꼭 하는 설정들은 아래에 적어 보았습니다.
opcache.enable=1 ; Opcache 사용여부 설정, 1일때 활성화 됨
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=100,000 ; 최대 파일갯수 설정
opcache.revalidate_freq=180 ; php 소스 변경확인시간 60sec
opcache.validate_timestamps=2 ;php 소스 수정 확인
opcache.fast_shutdown=1
opcache.enable_cli=0 ; 명령행 버전의 PHP에서도 opcache적용할지 여부
opcache.use_cwd=1 ;같은 이름을 가진 파일들사이에서 가능한 충돌 제거
4.3. OPcache 모니터링
이렇게 OPcache를 설정했으면 이 OPcache가 어떻게 작동하고 있는지 모니터링하고 혹시 수정할게 있는지 확인하는 게 좋을 것 같습니다.
이 모니터링 프로그램은 PHP’s Zend Opcache Config & Web Viewer
에서 세가지 프로그램을 소개하고 있는데요. 저는 이중에서 Opcache-Status by Rasmus Lerdorf를 설치해 사용하고 있습니다.
cd /var/www/example.com/ # 설치하고 싶은 디렉토리로 이동
wget https://raw.github.com/rlerdorf/opcache-status/master/opcache.php
설치 후 인터넷 브라우저에서 설치주소/opcache.php 명령으로 모니터링 프로그램을 볼 수 있습니다. 아래 이미지가 모니터링 프로그램으로 확인한 내용입니다.
5. 마무리하면서
이상으로 간단히 OPcache에 대해서 살펴보았습니다. 단일 사이트에서 OPcache는 굉장히 효율적인 툴로 보입니다. 더우기 올해 PHP가 7.x에서 8.0으로 업그레이드가 되면 더욱 유용할 것으로 보입니다.
저는 Page Caching은 FastCGI를 적용하고, PHP Script Cache는 여기서 설명한 OPcache를 적용하며, 데이타베이스 관련해 Memcached를 적용해 사용하고 있습니다.
지금까지 성과는 나름 만족스럽습니다.
FastCGI나 Memcached에 대해서는 아래 포스팅을 참조하시기 바랍니다.
6. 관련 포스팅
[워드프레스 최적화] 워드프레스에서 Memcached 이용해보기 – Ubuntu 16.04 + Nginx + PHP 7