Program/PHP

[튜닝] eAccelerator설치와 PHP 성능 향상 분석

나이트로 2007. 6. 21. 09:48
제  목 : eAccelerator설치와 PHP 성능 향상 분석
작성자 : 좋은진호(truefeel, http://coffeenix.net/ )
작성일 : 2005.6.21(화)
정리일 : 2005.8.2(화), 8.9(화)~12(금)

대형 사이트로 갈수록 0.01초의 시간이라도 응답속도 단축하기 위해 함수 선정이나, 메모리 사용량을
체크하고 줄이기 위한 노력과 DB 쿼리 튜닝하는 경우는 다반사다. 본인이 운영하는 사이트도 마찬가지
로 이런 노력은 계속되어 왔으나 이러한 튜닝에는 한계가 발생하기 마련이다.

php의 성능 향상을 위해서 Zend Optimizer, Turck MMCache, APC, ionCube PHP Accelerator 등을 사용
했거나 들어보기는 했을것이다. 이중 2003년 말을 마지막으로 개발이 중단된 Turck MMCache으로 성능
향상의 재미를 봤다는 얘기는 심심치 않게 들었을 것이다. 바로 이 Turck MMCache의 뒤를 잇는
eAccelerator에 대해 알아보자.
eAccelerator에 대한 소개는 몇몇 분들에 의해 이미 되어서, 이 글은 간단한 설치 방법과 어느 정도의
성능 향상이 있었는지에 초점을 맞출 것이다.

eAccelerator 홈페이지 : http://sourceforge.net/projects/eaccelerator/

1. Linux에서 설치

* 설치환경 : CentOS 3.5(Redhat AS 기반), Apache 1.3.x, PHP 4.3.x (Apache, PHP 설치된 상태)

eAccelerator 소스 컴파일을 한다.

 
# tar xvfz eaccelerator-0.9.3.tar.gz
# cd eaccelerator-0.9.3
#
# export PHP_PREFIX="/usr" <-- php 설치된 디렉토리 지정
# $PHP_PREFIX/bin/phpize
# ./configure \
  --enable-eaccelerator=shared \
  --with-php-config=$PHP_PREFIX/bin/php-config

# make
# make install
 


2. FreeBSD에서 설치

* 설치환경 : FreeBSD 4.x, Apache 1.3.x, PHP 4.3.x (Apache, PHP 설치된 상태)

1) 최신 Ports 시스템으로 update한다. (필수 아님)

  
 
   # cd /usr/share/examples/cvsup
   # cvsup -g -L 2 ports-supfile
  
 


2) eaccelerator ports를 설치한다.

  
 
   # cd /usr/ports/www/eaccelerator
   # make
   # make install clean
  
 


3) /usr/local/etc/php/extensions.ini 파일의 마지막에 eaccelerator 모듈을 추가한다.
   반드시 extension=session.so 설정이 있을 경우 이보다 아래에 추가해야 한다.

  
 
   extension=eaccelerator.so
  
 


3. eAccelerator 설정과 웹인터페이스 (Linux, FreeBSD 공통)

1) 캐싱 파일이 저장될 디렉토리를 생성한다. (www 권한으로 웹서버 실행한 경우임)
   /tmp 보다 /var/tmp 를 사용하는 것은 /tmp 공간 부족할 경우 대체할만한 공간으로 적당
   했기 때문이며 기본 설치 문서에는 /tmp 아래에 설치하는 것으로 되어 있다.

  
 
   # cd /var/tmp
   # mkdir eaccelerator
   # chown www eaccelerator
   # chmod 0700 eaccelerator
  
 


2) php.ini 마지막에 다음을 설정한다.

  
 
zend_extension="/usr/lib/php4/eaccelerator.so" <-- Linux인 경우만 추가. 설치경로와 맞게 지정
eaccelerator.shm_size="16"
eaccelerator.cache_dir="/var/tmp/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"
  
 


   - eaccelerator.shm_size   = eAccelerator가 사용할 공유 메모리량. 단위 MBytes.
     0을 지정하면 OS 기본값. default = 0
   - eaccelerator.cache_dir  = 캐싱 디렉토리를 지정. precompiled code, session data, content
     등이 저장된다.
   - eaccelerator.enable     = eAccelerator 사용 여부. 당연히 1
   - eaccelerator.optimizer  = 최적화 여부. 1= enable, 0 = disable
   - eaccelerator.check_mtime= php 파일 변경시간을 체크하여 반영할 것인지 여부
   - eaccelerator.debug      = debug 로깅 여부
   - eaccelerator.filter     = 캐싱할 php 파일을 지정한다. *.php *.html *.php3 처럼 지정할 수
     있으며 "" 로 비워두면 모든 php 파일이 캐싱된다.

   - eaccelerator.shm_max    = eaccelerator_put() 함수 사용할 때 최대 할당할 수 있는 공유
     메모리 크기를 bytes단위로 표시한다. (예. 10240, 10K, 1M).  0은 제한 없음
     eaccelerator_put() 함수는 공유메모리에 특정 데이터를 지정한 시간동안 넣어두는
     eAccelerator 자체함수이다.
   - eaccelerator.shm_ttl    = 새 스크립트 파일을 캐싱할만한 공유 메모리가 없다면,
     ssh_ttl 초동안 액세스가 없는 모든 스크립트를 삭제한다. default = 0. 0은 삭제안함을 의미
   - eaccelerator.shm_prune_period= 이 설정은 위의 shm_ttl 설정과 비슷하다.
     지정한 초보다 오래전에 만들어진 스크립트를 제거한다.
     즉, shm_ttl은 액세스시간에, shm_prune_period는 생성시간에 따라 삭제한다.
     default = 0. 0은 삭제안함을 의미
   - eaccelerator.shm_only   = 컴파일된 스크립트를 디스크에 캐싱할 것인지 여부.
     session data와 content 캐싱은 이설정과 무관. default = 0.
     0이면 캐싱을 위해 디스크와 메모리를 모두 사용한다.

   - eaccelerator.compress = 캐시된 내용 압축 여부
   - eaccelerator.compress_level= 압축 레벨 지정. 9는 최대 압축 레벨

3) Apache 재실행으로 설정을 적용하면 /var/tmp/eaccelerator 캐싱 디렉토리에는 아래와 같은
   형태의 캐싱 파일들을 확인할 수 있다.

  
 
eaccelerator-704431.376589      eaccelerator-704431.869578
eaccelerator-704431.377819      eaccelerator-704431.869698
eaccelerator-704431.378249      eaccelerator-704431.871469
eaccelerator-704431.378369      eaccelerator-704431.871919
eaccelerator-704431.379369      eaccelerator-704431.872469
  
 


4) 자~ 이제 웹인터페이스를 만나보자.

   tar로 푼 eAccelerator 소스를 보면 eaccelerator_password.php과 eaccelerator.php 볼 수
   있다. eaccelerator_password.php 은 웹인터페이스용 관리 password를 설정하는 파일이다.
   웹이나 쉘에서 실행 후 사용할 ID/PW 입력하면 다음과 같은 결과를 얻을 것이다.
   내용처럼 2줄의 설정을 php.ini 에 추가한다.

 
Add the following lines into your php.ini and restart HTTPD

eaccelerator.admin.name="admin"
eaccelerator.admin.password="$1$...생략..."
 


   Apache를 재실행하고, eaccelerator.php 페이지를 보면 다음과 같은 화면이 캐싱된 파일목록
   과 히트수, 메모리 사용량 등을 확인할 수 있다. 버튼 클릭으로 설정 변경도 가능하다.
   각각 캐싱 사용안함(Disable), 최적화 사용안함(Disable Opt.), 사용안하는 스크립트나 파일
   은 캐싱에서 삭제(Clear), expire된 스크립트나 파일은 캐싱에서 삭제(Clean)를 의미한다.

 

4. 성능향상 결과는?

적용 환경은 이렇다.

10여대 이상의 웹서버(정확히 숫자를 밝히기는 힘들다. ^^)를 L4 Switch로 로드 발런싱하면서
서비스되고 있는 중대형 사이트이다. 이미지 파일은 여러 대형 사이트가 그러하듯이 별도 이미지
웹서버 통해서 이뤄지며, 여기 10여대의 서버에는 순수 php, html 등으로만 웹서비스가 되고 있다.
이 들 서버중 40~50%의 서버에 몇주간의 시간간격으로 두고 차근차근 eAccelerator를 설치했다.

- OS : FreeBSD 4.x 환경
- 운영환경 : Apache 1.3.x, PHP 4.3.x
- 각 서버의 메인메모리 : 2GB 또는 4GB
- CPU : Xeon 2.xGhz X 2개

아래 이미지에서 CPU load는 sar로 얻은 최근 5분, 최근 15분 평균 Load에 100을 곱하여
5분 이상 간격으로 MRTG로 그런 것이며, 실제 서비스에 투입된 상태이다.

1) 설치되지 않은 서버와 설치된 서버의 CPU load 비교 (일일그래프, 약 50% 감소)
   실제 서비스에 투입된 상황에서 서버별로 약간의 request의 차이가 생길 수 있으며,
   서버에 따라 50%이상 감소된 서버도 있다.
   (eAccelerator가 설치안된 서버는 Zend Optimizer와 함께 운영중이다.)

 
 

2) 설치 서버의 CPU load의 변화 (월간그래프)

 

3) 설치 서버의 CPU %user  (월간그래프, 절반정도 감소)

 

4) 설치 서버의 CPU %system (월간그래프, 변화 거의 없음)

 

5) 설치 서버의 CPU %idle (월간그래프)

 

6) 설치 서버의 Active 메모리 사용량 변화 (월간그래프, 150~200MB 사용량 감소)

 

ab 툴을 사용한 벤치마크 결과를 살펴보자.

웹서버는 서비스중인 상태에서 측정했으며 로드발런싱되더라도 서버별로 Request의 차이가
생길 수 있음을 감안하고 살펴보기 바란다. 단, 동일시간대에 동일기종을 대상으로 측정을 했다.
약 91KB의 php 페이지를 200회 요청해서 결과를 얻어낸 것이다.

 
/usr/local/sbin/ab "http://Server_Real_IP/Directory/index.html" -n200 -c1 -dS
 


1) eAccelerator
----------------------------  -------------------------------------------------
           횟수                 1회       2회       3회       4회       5회
           서버                 W1        W1        W2        W3        W3
----------------------------  --------  --------  --------  --------  ---------
Time taken for tests [sec]      18.685    20.759    27.090    18.853    21.151
Requests per second [#/sec]     10.70      9.63      7.38     10.61      9.46
Time per request  [ms]          93.42    103.80    135.45     94.27    105.75
Transfer rate     [ms]         977.61    879.97    674.12    968.88    863.63
Connect Time(avg) [ms]              8         7        24         6        21
Processing(avg)   [ms]             85        96       111        87        84
Total(avg)        [ms]             93       103       135        94       105
----------------------------  --------  --------  --------  --------  ---------

2) Zend Optimizer
----------------------------  -------------------------------------------------
           횟수                 1회       2회       3회       4회       5회
           서버                 W1_1      W1_1      W2_1      W3_1      W3_1
----------------------------  --------  --------  --------  --------  ---------
Time taken for tests [sec]      36.986    34.545    40.728    32.364    27.857
Requests per second [#/sec]      5.41      5.79      4.91      6.18      7.18
Time per request  [ms]         184.93    172.72    203.64    161.82    139.28
Transfer rate     [ms]         493.76    528.68    448.42    564.33    655.69
Connect Time(avg) [ms]             23        22        23         8         9
Processing(avg)   [ms]            162       150       180       153       130
Total(avg)        [ms]            185       172       203       161       139
----------------------------  --------  --------  --------  --------  ---------
※ W1과 W1_1은 같은기종이나 물리적으로 다른 서버임을 표시한 것이다.

RPS(Requests per second)를 기준으로 했을 때 평균 5.89RPS에서 9.55RPS로 62%의 증가를 보였다.

 

5. 결론

eAccelerator 설치 결과에 대해 결론적으로 말하면

- CPU load가 절반이상 낮아지고
- 메모리 사용량이 줄어들었으며
- 응답속도도 보다 빨라졌다.

또한 순간적으로 비정상적일만큼 과한 요청에 대해서도 CPU load가 치솟는 현상이 거의없이
안정적인 모습을 보였으며, 투입 서버의 대수를 줄일 수 있는 상황까지 고려할 수 있게됐다.

대형사이트나, 한 서버에 비교적 많은 웹호스팅을 하여 Apache 튜닝을 해도 하루를 버티기
힘든 사이트에도 테스트해보기를 권장한다. 그러나 개인홈페이지 등에서는 효과를 찾아보기
힘들 것이다.


6. 참고 자료

1) cron이나 부팅시 자동실행시 optimizer/caching이 disable 된다면
   (실제로 겪어본 적 없음)

http://sourceforge.net/forum/forum.php?thread_id=1332963&forum_id=416742
 
-------------------------------------------------------
By: Christian Meisinger - em_gotcha
restarting apache disables optimizer/caching  
2005-08-10 04:55
-------------------------------------------------------

following problem:
when i restart apache1.3 via a crontab entry, eAccelerator optimizer and
caching is disabled.
when i use the same command as root, everything is ok. NO error message
neither in apache logs nor system logs.
i have absolutely no idea what's going on here :)

both is done as root. it's exactly the same command.
i don't understand it...

has someone a hint for me?

-------------------------------------------------------
      "Try to change the 32 into 64 on line 1153 in mm.c"
      and
      "...adding the line "kernel.shmmax=67108864" in "/etc/sysctl.conf"
file."
      solved the problem.
 



7. 참고 사이트

* eAccelerator 홈 (설치 & 설정 방법, Download, ...)
  http://sourceforge.net/projects/eaccelerator/
  http://eaccelerator.net/

* PHP실행을 빠르게!! eAccelator! (글 행복한고니, eAccelerator에 대한 간단한 소개글)
  http://mygony.com/tt/index.php/154&ct1=7

* HOWTO: PHP eAccelerator on Ensim (eAccelerator 설치)
  http://forum.ev1servers.net/printthread.php?t=54479
  Accelerating PHP with eAccelerator
  http://linuxweblog.com/node/230

* Faster PHP Benchmarks (eAccelerator 사용과 미사용시 벤치마크 결과)
  http://programmin.prim8.net/archives/5-Faster-PHP-Benchmarks.html

* Turck MMCache 홈
  http://turck-mmcache.sourceforge.net/

출처 : Tong - polomini님의 Web Program통