이전 워드프레스 최적화 작업하면서 웹서버에서 작동하고 있는 cache들에 대해서 살펴본적이 있는데 여기서는 좀더 Cache에 집중해서 정리해 보자.

서버 최적화를 위한 방안중 가장 시스템템을 효율적으로 활용하는 방법이 Cache이기 때문에 Cache에 대해 살펴보다보면 무수히 많은 종류의 Cache를 만날 수 있다.
APC, XCache , Opcache, Memcache, Memcached, Tarantool (HASH), Tarantool (TREE), Redis, Azure Redis Cache, CouchBase Redis등등이 그것입니다.

이렇게 굉장히 많은 종류의 Cache가 있지만 조그마한 워드프레스 사이트를 운영하는 입장에서는 전부를 다 알 필요는 없을 것 같고 요즘 많이 사용하는 Cache들에 대한 개념 정도만 이해ㅑ하고 있으면 되지 않을까 싶다.

워드프레스 최적화를 위해서 Nginx 웹서버 Cache에 대해서 그 동안 구글링을 통해서 얻은 내용을 아래와 같이 간략히 정리해 본다.

1. Cache의 종류

웹서버에서 작동하는 cache는 크게 3가지 종류로 나눌 수 있다. 즉 Full page cache, PHP Script 결과를 모아 두는 cache, 데이타베이스 Query 결과를 모아두는 cache가 그것이다.

이를 간략히 웹서버내에서 작동하는 플로우 차트로 그려보면 아래와 같다.

▽ NGINX 서버 작동 플로우 차트 Flow chart,
구글링을 통해 얻은 지식으로 토대로 차트화 by Happist

NGINX 서버 작동 플로우차트 Flow chart

  • Full page cache는 PHP를 통해서 HTML 형태로 page를 구성한 결과를 보관했다가 요청이 오면 바로 보여주어 속도를 높이는 기법으로 Nginx에서는 FastCGI가 가장 좋은 성과를 보여 준다,

  • PHP Script Cache는 말 그대로 PHP Script를 컴파일한 결과를 공유 메모리에 저장하고 있다가 필요 시 사용하는 cache로 요즘 OPcache가 가장 성능이 좋다고 알려 있다.

  • 데이타베이스 Query 결과를 모아두는 cache는 PHP 요청에 따라 Query(질의문)를 파싱하고 데이타베이스에 접속해 데이타를 분류해 놓은 인덱스에서 찾거나 인덱스가 안되었다면 데이타베이스 전체를 찾아 결과를 가져온 값을 모아두어 나중에 닽은 query(질의문)가 오면 바로 답읗 해주어 속도를 향상시키고 CPU가 두번일을 하지 않토록 해 시스템을 효율적으로 작동될 수 있도록 한다.

2. PHP와 데이타베이스 관련 캐시등 -APC, OPcache 그리고 APCu

APC는 Alternative PHP Cache의 약자로 PHP Script 수행 결과를 모아두는 Cache와 PHP 요청에 따라 데이타베이스에서 작업한 결과를 모아두는 Cache가 합쳐진 PHP 확장 모듈로 오랜전부터 굉장히 많이 사용하던 Caching 방법이다.

점차 PHP 자체에 caching 기능을 넣어달라는 요청이 늘면서 PHP 5.5부터는 자체적으로 Caching 기능을 내장하게 되었다. 이게 바로 OPcache이다. OPcache는 PHP Script 결과물만 저장하는 Cache만 가지고 있으므로 데이타베이스 작업 결과를 모아두는 Caching은 APCu라는 PHP 확장 모듈을 사용할 수 있다.

즉 아래와 같이 정리할 수 있다.

  • APC는 PHP Script 결과를 모아 두는 cache + 데이타베이스 Query 결과를 모아두는 cache 모두 커버하는 기술이었다.

  • PHP 5.5부터 APC의 PHP 관련 Caching 기능은 자체 OPcache로 대체되었다,

  • PHP 5.5부터 APC의 기능 중 데이타베이스 쿼리(query) Cache 부분은 APCu라는 php 확장 모듈을 사용 할 수 있다.

  • 데이타베이스 쿼리(query) Cach로 확장 모듈인 Memcached를 사용할 수 있다.

3. APCu vs Memcached

데이타베이스 쿼리(query) Cache로 APCu나 Memcached 모두 사용할 수 있지만 단독 머신에서 사용하기에는 APCu가 빠르며, 머신 3개이상을 운영한다면 Mencached가 낫다는 평가가 있다.

apcu vs memcached vs opcache for vBulletin에 따르면 머신 3개이상인 경우에는 mencached가 효율적일 수 있다고 이야기 한다. 이를 인용해 본다.

  1. If they both run on the same server, they will compete for vital system resources like memory, network IO, CPU etc. In the best cases, this will make performance of both jittery and in the worst cases, will make both of them ineffective because of insufficient resources.
  2. You can get pretty far while running your database server on a single machine. On the other hand, you will have to distribute your Memcached servers much sooner. So you’re anyway going to have to locate them on different machines at some point. Better to start with a topology you’re going to have for a long time.
  3. As a continuation of previous point, it’s in fact advisable to distribute your Memcached cluster in at least 3 machine, even if you could hold all the data in a single machine. The reason is – if your Memcached isn’t distributed and the machine where your server runs fails, your whole Memcached will need to start cold. While it says cold, your database could easily get 10-100x more read load than it usually does – which might just bring it down too.
  4. Just having one Memcached machine is bad for reliability in itself (since it can bring database down after a cold start), having the database and Memcached run on the same machine is even worse – if the machine fails, not only you’d have to migrate to slave database (or whatever else failover mechanism you have), you’d also have to start from a cold cache with a very low hit rate. So your new database server will be hammered right away — possibly causing it to go down once again.

여러 자료를 종합 검토할 시 Redis 또는 Memcached는 별도 서버와 통신을 통해서 작동하는 방식이라 규모가 작은 시스템에서는 상대적으로 느릴 수 있다고 한다.

반면 OPcache나 APCu는 연결할 필요없이 바로 서버 공유메모리에 바로 Caching하기 때문에 빠르고 메모리도 절약된다, Memcached와 Redis의 작동 방식은 같다.

그러면 Memcached와 Redis는 왜 사용하는 것일까?

사이트가 커지면서 점차 효율적으로 운영하는 것을 고민하게 된다. 그러면서 효율화를 위해서 분리된 서버를 도입하게 된다. 예를 들어 서비스를 담당하는 서버와 데이타베이스 서버를 독립시키거나 데이타 양이 많아지면 일정 조건에 따라 서버를 분리시키기도 한다.
이렇게 서버가 분리되면 여러 서버에 있는 데이타를 동기화가 필요한데 이럴 경우 Redis나 Memcached를 활용하면 보다 용이하게 데이타를 통합할 수 있다.

그러므로 많은 질문중의 하나인 Opcache와 Memcached를 같이 쓸 수 있느냐에 대해서는 같이 쑬 수 있다고 한다. 왜냐면 앞서 설명한대로 OPcache는 PHP Script Cache이고 Memcached는 데이타베이스 Query Cache이기 때문이다.
많은 사이트에서 이 조합으로 서버를 운영한다고.

다만 위에서 지적한대로 3개이상의 머신을 상요하는 대단위 사이트에서야 효과가 날 수 있다.

4. 결론

사이트 규모가 작다면 Full Page Cache로 FasrCGI를 사용하고, PHP script caching으로는 OPcache르 사용하며, Database caching으로는 APCu의 조합이 이론상 효율적이다.

규모가 커진다면 FasrCGI + OPcache+Memcache를 사용하는 것도 좋다는 의견이 많다.

5. 관련 자료들

가상 서버를 운영하고픈 勇者에게 전하는 가상 서버 운영 입문 노하우 – Vultr 가상서버호스팅(VPS)를 중심으로

[워드프레스 최적화] FastCGI cache 적용 워드프레스 반응 속도 및 서버 로드 줄이기

[워드프레스 최적화] OPcache를 활용한 워드프레스 속도 최적화 방안

[워드프레스 최적화] 워드프레스에서 Memcached 이용해보기 – Ubuntu 16.04 + Nginx + PHP 7

10$ 제휴 프로모션으로 Vultr 가입하기