강좌게시판

제목 CI 속도, 메모리, eAccelerator, Memcached
글쓴이 tpae 작성시각 2011/04/30 03:13:54
댓글 : 14 추천 : 1 스크랩 : 1 조회수 : 32535   RSS
우선, 한국말이 많이 서툴러 글이 이상하다면 사과드려요. ㅡㅡ;;

CodeIgniter는 빠르고, MVC를 자랑하는데요, 한가지 중요한건, 많은 model이나 library를 사용하게 돼면, 속도와 메모리 사용도가 빨리 오른다는거죠.

평균 잘만든 CI 페이지는 주로 2MB ~ 4MB 사용하는데요, 만약 5MB~7MB됀다면, 서버에 RAM이 512MB이라면, 73~102명이 한꺼번에 접속하면 서버가 느려지거나, DDoS당한거 처럼 다운됄수도 있습니다. 

주로 사람들이 많이 들어오는 사이트들은 여러가지 방법으로 메모리를 줄이고 하는데요, 제일 중요한건 코드 입니다.

1. Autoload를 주의 합시다.

만약에 많은 model이나 library를 autoload에 사용한다면, 메모리에 사용도가 커집니다. 페이지 열면, 모든 model이랑 library들이 로드 됀다는 거죠. 그래서 항상, model이랑 library를 필할때만 로드해서 쓰는것이 좋습니다.
some_function() {
    $this->load->model('users_model');
    $data = $this->users_model->some_function();
    $this->load->view('page', $data');
}
2. Profiler를 사용해서 문제점인 코드를 발견하기

CI에서 제가 자주 쓰는 Profiler란 툴이 있는데요, 그걸 이용하면 많은 정보를 볼수 있습니다. 
$this->output->enable_profiler(TRUE);
이 코드를 __construct() 에 넣으면, 페이지 로드 할때 많은 정보가 나옵니다. 속도, 메모리, 문제있는 코드등.. 

만약에 SQL Query가 너무 많아도 메모리, 속도에 문제가 있을수 있습니다. 

3. SQL Join 을 사용하여 DB접속률을 줄이기

만약에 여러 테이블에서 정보를 가지고 올때는, SQL join을 사용하면 접속률을 줄일수 있습니다.
$this->db->select('auth_meta.user_id, auth_meta.first_name, auth_meta.last_name, auth_users.email, auth_users.notifications, auth_users.password');
        $this->db->from('project_users');
        $this->db->join('auth_users', 'project_users.user_id = auth_users.id');
        $this->db->join('auth_meta', 'project_users.user_id = auth_meta.user_id');
        $this->db->where("project_users.role_id = $role_id");

        return $this->db->get()->result();
이렇게 하면 테이블 project_users, auth_users, auth_meta 에서 한꺼번에 데이터를 가지고 올수 있는데요, 접속률을 줄일수 있는 방법이기도 하죠. 

4. eAccelerator 사용하기

PHP를 오래 사용하신분들은 아마도 아실겁니다. PHP의 단점은, 코드를 compile 해놓는게 아니라, 볼때마나 compile하는 것입니다. 이렇게 하면, 속도와 메모리 사용도가 많이 오르는데요, 그래서 큰 회사들은 PHP를 안쓸려고 하기도 하죠. ASP.NET같은 경우, compile해서 페이지 로드가 빠른데요, PHP도 같은 기능을 지원해주는 eAccelerator라는 툴이 있습니다.

eAccelerator는 서버에 PHP와 설치 하는것인데요, 설치 해놓으면 5MB~6MB 코드가 갑자기 800KB~2MB로 내려간다는거죠. ㅋㅋ

중요한점은, 서버에 설치만 하면 됀다는 겁니다. 그러면 속도에 차이를 눈으로 볼수 있을겁니다.

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

인스톨 하는 방법은,

윈도우 에서는: http://www.sitebuddy.com/PHP/Accelerators/eAccelerator_windows_binaries_builds
리눅스 에서는: http://eaccelerator.net/wiki/InstallFromSource

5. Memcached 사용하기

Memcached는 사용하는것이 어려워, 주로 많은 접속률을 예상하는 사이트만 사용하는데요. Memcached는 Cache, session등등을 서버 메모리에 저장 해두는 겁니다. 장점은, 속도가 많이 빨라진다는 것입니다.

Memcached는 서버에 인스톨을 해야 하는데요, 하고 코드에도 사용을 해야 합니다. 실은, 저도 인스톨 하는 방법을 잘 몰라서 ;; 

방법은 여기에 적혀 있군요: http://www.php.net/manual/en/memcache.installation.php

CI library는 여기서 받으시구요: http://codeigniter.com/forums/viewthread/72538/

사용하는 법은: 
$this->load->library('cache');
//멤케쉬 로드 하기
$this->cache->useMemcache($iptomemcache, $port); /* 멤케쉬 연결하기 */
$this->cache->save('testkey', 'testdata', NULL, 3600); /* "testdata"를 1시간 저장하기. */
echo $this->cache->get('testkey');

//이렇게 해야 "testdata"를 사용할수 있습니다

$this->cache->useFile();
//etc. 
휴.. 많은 정보이긴 한데요, 혹시 도움 필요하신분 댓글로 남겨 주세요. ^^


 다음글 phpfest 2011 codeigniter 강의 파일 (16)
 이전글 Hook을 이용하여 웹과 모바일웹 만들기 2편 (11)

댓글

무명의시인2 / 2011/05/03 10:16:17 / 추천 0
우와..... 좋은 내용 알려주셔서 감사합니다.

이거 적용해보고 글 남겨 드릴게요^^
최용운 / 2011/05/06 13:01:31 / 추천 0
 한국말 안 어색하시네요.. 유용한 팁 감사드립니다.
한대승(불의회상) / 2011/05/11 14:29:47 / 추천 0
 좋은 정보 감사 합니다.


eAccelerator의 경우는 zend가 대신하는걸로 아는데요..

zend가 기본으로 설치되어 있는경우 eAccelerator 설치 하면 어떻게 되는지 궁금하네요.

tpae / 2011/05/12 06:51:24 / 추천 0
 네. 제가 알기론 같이 사용할수 있는걸로 알거든요. 먼져 eaccelerator 설치 하시고, zend 설치 하시면 돼는걸로 알고 있습니다.
kirrie / 2011/05/19 16:00:44 / 추천 0
ActiveRecord의 편리함을 버릴 용의가 있다면, 데이터베이스 설정에서 ActiveRecord를 false해놓고
쓰면 약 1~2메가 정도의 메모리 절약 효과를 볼 수 있습니다. (경험담)
헛발이 / 2011/05/19 16:11:53 / 추천 0
"평균 잘만든 CI 페이지는 주로 2MB ~ 4MB 사용하는데요" 라는 대목에서 자꾸 맘에 걸려요...
제 개인 홈페이지의 첫페이지가 지금 4.9MB거든요... ㅡ.ㅡ;;
tpae / 2011/05/21 04:45:47 / 추천 0
 헛발이님..

4.9는 보통/평균이라고 생각 하는데요. 아마도 eAcclerator 설치 하시면 2~3메가 정도로 떨어질것 같습니다. 
변종원(웅파) / 2011/05/21 11:23:46 / 추천 0

헛발이// 포럼 메인 캐시 적용됐을 경우 1.9정도 나옵니다.

리스트는 2메가 정도 근방, 뷰는 2.3~2.3정도 나옵니다.

milosz / 2011/05/27 10:08:36 / 추천 0
좋은 글 잘 봤습니다^^ 그런데요... 메모리 사용량을 어떻게 확인할 수 있죠? ;ㅅ;
eitetu / 2011/09/06 15:28:22 / 추천 0
좋은글 잘봤습니다.

헌데, 테클은 아니지만 3번의 경우 잘못쓰면 역효과가 나니 주의 해야합니다.

적절한곳에서 적절하게 join을 사용하면 성능 향상에 도움이 되지만

잘못쓰면 오히려 DB에 엄청난 부하를 줄수 있습니다.

예로 어느 이통사의 CMS랑 DB를 동기화 하는 API를 만들었는데,

업데이트 해야하는 데이터를 확인하는 부분에서 잘못 join해서 Select하는데 10분이 걸렸던적이......
양승현 / 2011/12/05 17:38:04 / 추천 0
Zend는 옵티마이저가 설치가 되지요. eAcclerator와 비교시 eAcclerator의 성능이 좋습니다.
Zend를 설치후 eAcclerator설치하고 설정파일을좀 변경해 주시면 설치가 됩니다.
네이버등 검색하시면 많은 자료가 나옵니다. ^^;
변종원(웅파) / 2011/12/05 18:54:26 / 추천 0
 milosz / $this->output->enable_profiler(true); 하시면 많은 정보를 보실 수 있습니다,
꾸숑 / 2013/01/18 23:15:05 / 추천 0
저는 php5.3을 사용해서 젠더옵티마이저를 설치를 못하고 eAcclerator을 설치해서 맘이 상했는데
eAcclerator이 더 좋다고 하니까 기분이 업  되는군요^^

사실 학습용서버라서 부하가 걸릴일은 없지만 나중에 현장에서 사용할수도 있거든요~~~~~

자료 감사합니다.
2전산2 / 2014/01/13 22:51:06 / 추천 0
늦었지만 좋은 정보 정말 감사합니다 ㅎㅎ