Blog

이 포스트는 루마니아 XE팀에서 실행했던 XE 1.4 대비 1.5 버전의 성능 테스트 결과를 번역한 것입니다. 번역 과정에서 의역 또는 오역이 포함되어 있을 수 있습니다. 원문 보기.

XE 1.5의 주요한 개선점 가운데 하나는 성능 입니다. 이 글은 개선 사항을 통해 사용자가 어떤 이점을 취할 수 있는지 그리고 XE 1.4 버전과 비교하여 얼마나 빨라졌는지를 보여 주려고 합니다. 캐싱과 데이터베이스 복제 그리고 다중 서버를 실험 했습니다.

캐싱

캐시는 어떻게 활성화 하죠? 무엇이 어떻게 캐싱 될까요?

XE에는 오브젝트 캐시와 템플릿 캐시가 있습니다. 오브젝트 캐시는 모듈 인스턴스, 사용자 정보, 레이아웃 정보, 문서 등 객체를 저장하는데 사용됩니다. 템플릿 캐시는 미리 컴파일된 템플릿 파일을 저장하기 위해 사용됩니다. 우리가 모르는 사이 모든 템플릿 파일(사용된 스킨 등)은 PHP가 해석 가능한 형태로 디스크에 저장 됩니다. 매번 디스크로부터 이 정보를 읽어내는 데에는 시간이 걸리기 때문에 템플릿 캐시는 속도를 높이기 위해 APC 또는 Memcache로 저장 합니다.

캐시 사용하기

우선 PHP APC 또는 Memcached가 설치되어 있는지 확인합니다. 자세한 설치 방법은 인터넷에 많은 자료가 소개되어 있으니 여기서는 생략하겠습니다.

XE 설정 파일에 간단한 캐시 활성 코드를 추가 합니다. ./files/config/db.config.inc 파일을 찾아서 맨 아래 두 라인을 추가 합니다.

$db_info->use_object_cache = 'apc';
$db_info->use_template_cache = 'apc';

끝입니다. 'apc' 대신 'memcache'를 사용할 수도 있습니다. 더 정확하게 말하면 memcache 연결 문자열은 'memcache://localhost:11211' 이런식으로 써야 합니다.

설정 파일에 이 라인을 추가하지 않더라도 php.ini 에서 APC를 활성화 하면 XE 설치가 훨씬 빨라집니다. 이것은 APC가 opcode 캐싱을 하기 때문인데요. 매 페이지를 로드할 때 PHP 해석기가 PHP 스크립트를 바이트 코드로 해석하지 않는다는 것을 의미합니다. XE 캐시로 memcache를 사용하더라도 여러분의 서버에 APC를 설치할 것을 강력하게 권장합니다.

memcache는 사용할 때 기본적으로 memcache 서버가 접근/설정 불가능한 경우 아무런 메시지를 받지 못하기 때문에 PHP가 웹 서버로부터 memcache 서버로 접근 가능한지를 미리 확인해야 합니다. 이것을 확인하기 위해 작은 스크립트를 실행해 보는 편이 좋습니다.

캐시 적용 결과

우리는 XE를 통해 몇 가지 성능 테스트를 실행해 봤습니다. 이 포스트 하단에서 더 자세한 테스트 환경을 볼 수 있습니다. 그 전에 우리가 사용하는 부하 테스트 도구인 그라인더에서 사용하는 측정 단위 'TPS'(Tests Per Second)를 알아야 합니다. 이것은 초당 얼마나 많은 부하(우리의 경우 텍스타일에서 글 읽기+글 쓰기+댓글 쓰기)를 성공적으로 처리 했는지를 표시하는 단위 입니다.

테스트 하는 동안 XE 1.5는 XE 1.4.5에 비하여 HTTP 요청당 DB 쿼리 수가 조금 더 높다는 것을 확인 했습니다. 이런 이유로 아무런 설정을 하지 않는 경우 XE 1.5는 XE 1.4.5에 비하여 조금 더 느린 경향(MySQL과 CUBRID에서 2% 정도)이 있습니다. 그러나 데이터 캐시를 활성화(단일 서버는 APC, 다중 서버는 memcached) 함으로써 XE 1.5는 XE 1.4.5에 비하여 현저하게 빨라집니다. 테스트 결과는 APC를 사용한 단일 서버에서 28%, memcached를 사용한 다중 서버에서 42% 빠른 결과를 보여 주었습니다.

xeResult1.png 

TPS 수치가 높으면 성능이 훨씬 좋다는 의미 입니다. 그래프 왼쪽으로부터 '캐싱 안된 1.4.5, 캐싱 안된 1.5, APC 캐싱된 1.5, memcached 캐싱된 1.5' 순 입니다.

아래 그래프를 통해 단지 캐시를 사용하는 것 만으로도 58 으로부터 38 까지 데이터베이스 쿼리 수가 감소한다는 것을 확인할 수 있습니다.

xeResult1-1.png 

복제

XE 1.5에 추가된 다른 하나는 XE 설치 시 하나 이상의 DB를 사용할 수 있도록 개선한 것입니다. XE 복제는 복제를 지원하는 모든 DB에서 사용 가능합니다. XE가 지원하고 있는 DBMS인 MySQL, CUBRID, MS-SQL에서 DB 복제가 가능하다는 의미 입니다.

복제를 위한 XE 설정

복제 설정을 하려면 XE의 설정 파일(./files/config/db.config.php)에서 모든 데이터베이스 서버 접속 문자열을 제공해야 합니다. 단일 마스터 접속 문자열($db_info->master_db)과 여러 개의 슬래이브($db_info->slave_db)를 제공할 수 있습니다.

$db_info->master_db = array('db_type' => 'mysql','db_port' => '3306','db_hostname' => 'localhost','db_userid' => 'root','db_password' => 'pass','db_database' => 'xe150','db_table_prefix' => 'xe_');

$db_info->slave_db = array(array('db_type' => 'mysql','db_port' => '3306','db_hostname' => 'localhost','db_userid' => 'root','db_password' => 'pass','db_database' => 'xe150','db_table_prefix' => 'xe_'));

모든 SELECT 쿼리가 슬래이브에서 실행되고 모든 INSERT, UPDATE, DELETE 쿼리가 마스터에서 실행되기 때문에 설치 직후 db.config 파일은 마스터와 슬래이브에 동일한 연결을 포함합니다. 이것은 마스터 데이터베이스에서 SELECT를 원하는 경우 슬래이브 배열에도 추가해 주어야 한다는 의미 입니다.

복제하면 얼마나 빠를까요?

XE 1.5 텍스타일에 하나의 마스터와 하나의 슬레이브를 사용한 MySQL 복제 테스트 결과 약 8% 정도 성능이 개선 되었습니다.

xeResult2.png 

다중 웹 서버

XE에 다중 웹 서버를 사용하길 원한다면 첨부 파일이 어떻게 저장 되는지에 대한 이슈를 알아야 합니다. 첨부 파일은 업로드했던 서버의 files 폴더에 저장되기 때문에 다른 서버가 찾으려고 요청하면 파일을 찾을 수 없습니다. 때문에 파일/첨부 파일 폴더의 동기화를 유지하는 도구를 사용해야 합니다.

또한 XE 캐싱을 사용하기로 결심했다면 APC 캐시가 다중 웹 서버 사이에서 공유 불가능 하다는 것을 알아야 합니다. 이것은 여러분이 다중 웹 서버를 사용하는 경우 memcached를 사용해야 하는 이유 입니다. 그럼에도 불구하고 각각의 서버에 opcode 캐싱을 위해 APC 캐시를 사용하는 것이 좋다는 사실을 기억하세요.

성능 테스트 상세

성능 테스트를 위해 10개의 텍스타일 블로그에 1만개의 포스트와 10만개의 댓글 그리고 하나의 웹 서버와 하나의 DB 서버를 사용 했습니다. 테스트하는 동안 memcache 서버와 다른 DB 및 웹 서버를 테스트 하기 위해 세 번째 장비를 추가 했습니다.

부하 테스트를 위해 자바 부하 테스트 프레임웍인 그라인더를 사용했습니다. 100명의 동시 접속자가 989 페이지를 읽고 하나의 글과 10개의 댓글을 써서 매번 1천 번의 요청을 재현하는 방식으로 테스트 했습니다. 이런 요청을 보내기 위해 그라인더 에이전트로써 각각 50 워커의 프로세스를 갖는 두 대의 전용 장비를 사용 했습니다. 에이전트와 워커가 그라인더에서 그들의 문서를 어떻게 호출했는지 아래 URL을 통해서 더 자세한 내용을 알 수 있습니다. http://grinder.sourceforge.net/g3/getting-started.html

제목 최종 글 날짜
공지 XE1 신규 보안 취약점 신고 포상제 종료 안내   2019.10.23
공지 [중요!] Object 클래스의 이름 변경 안내(PHP 7.2 버전 호환성) [7] 2020.08.16 by 천재 2017.11.27
XE 오픈 세미나 - XE 레이아웃 제작 실습 (2014년 7월 26일) [2] file 2014.07.25 by 큰성565 2014.07.22
XE 1.5 캐시 사용으로 성능 극대화 [5] file 2014.07.26 by seren 2012.02.22
XE 오픈 세미나 <반응형 레이아웃 제작 실습> 스케치 - 7월 26일 [4] file 2014.07.28 by 밥로스 2014.07.28
XECon 2014(구 XE캠프) - 지역별 수요 조사 [12] 2014.08.04 by 해피라이브 2014.07.21
XE Open Office Day - 8월 8일 개최 안내 [10] file 2014.08.06 by 간지횽 2014.08.01
XpressEngine Core 1.7.5.7 Release   2014.08.07
XE 하반기 워크샵 스케치 [10] file 2014.09.04 by monet 2014.09.02
9월 13일 프로파일러 모듈 개발자 모임 스케치 [10] file 2014.09.16 by BJ람보♡羅仕茹羅小白 2014.09.15
XE 1.5 업데이트 가이드 [11] file 2014.09.21 by geoever 2012.05.09
XpressEngine Core 1.7.6 Release (보안패치) [14] 2014.09.22 by 스무스스 2014.09.18
XE Open Seminar - Tools for PHP 안내 (2014. 9. 27) [3] file 2014.09.22 by ToFinder 2014.09.19
캐시 설정 가이드 - XE 1.5 버전 이후 [5] file 2014.09.24 by 듀애즈 2012.06.01
XpressEngine Core 1.7.7 Release (보안패치 & 1.7.6 로그인 문제 수정) [2] 2014.09.27 by EnterTM 2014.09.23
XE Open Seminar - Tools for PHP 스케치 file   2014.09.29
XE Open Office Day - 2014. 10. 11 개최 안내 [1] file 2014.10.09 by 키스투엑스이 2014.10.07
Coding Convention [5] file 2014.10.29 by 올데이럭키 2014.08.13
XpressEngine Core 1.7.5.6 Release (보안패치) [1] 2014.10.30 by 올데이럭키 2014.07.28
XE Open Office Day - 2014. 10. 11 행사 스케치 [2] file 2014.10.30 by 올데이럭키 2014.10.11
XECon + PHPFest 2014 개최 안내 [접수 마감] [22] file 2014.11.12 by 노에르 2014.10.27
프로필 페이지를 추가했습니다 [6] 2014.11.12 by 별을사랑했네 2014.08.22