Kohana 기반 웹사이트의 속도와 확장성 최적화
어제 Kohana와 함께 만든 사이트가 엄청난 트래픽으로 인해 한 발짝 물러서서 디자인을 평가하게 되었습니다.Kohana 기반의 어플리케이션을 최적화하기 위한 표준기술에는 어떤 것이 있나요?
벤치마킹에도 관심이 있습니다.「 「 」를 설정할 ?Benchmark::start()
★★★★★★★★★★★★★★★★★」Benchmark::stop()
모든 페이지의 실행 시간을 확인하기 위해 컨트롤러 방식별로 또는 벤치마킹을 글로벌하고 신속하게 적용할 수 있습니까?
앞으로 캐시 라이브러리를 더 많이 사용할 예정이지만, 현재로선 제가 전혀 알지 못하는 많은 것들을 할 수 있다고 확신하기 때문에 더 많은 제안을 받아들일 수 있습니다.
이 답변에서 말하는 것은 Kohana만의 것이 아니라 많은 PHP 프로젝트에 적용할 수 있을 것입니다.
퍼포먼스, scalability, PHP 등에 대해 이야기할 때 떠오르는 몇 가지 포인트는 다음과 같습니다.
저는 여러 프로젝트를 진행하면서 많은 아이디어를 사용했습니다.이치노그래서 아마 여기서도 도움이 될 거예요
우선 퍼포먼스에 관해서는 고려해야 할 많은 측면/질문이 있습니다.
- 서버의 설정(Apache, PHP, MySQL, 기타 가능한 데몬 및 시스템)을 실시합니다.ServerFault에서 더 많은 도움을 받을 수 있습니다.
- PHP 코드,
- 데이터베이스 쿼리,
- 웹 서버를 사용하고 있습니까?
- 어떤 종류의 캐싱 메커니즘도 사용할 수 있습니까?아니면 웹사이트의 최신 데이터가 항상 필요합니까?
역방향 프록시 사용
가장 먼저 도움이 될 수 있는 것은 웹 서버 앞에서 바니스와 같은 역프록시를 사용하는 것입니다.그것은 가능한 한 많은 것을 캐시하도록 하기 위해 PHP/MySQL 계산을 필요로 하는 요청(그리고 물론 프록시의 캐시에 없는 다른 요청)만 Apache/PHP/MySQL로 만듭니다.
- 우선, CSS/Javascript/Images--음, 정적인 것은 모두 Apache가 항상 제공할 필요는 없습니다.
- 역방향 프록시를 모두 캐시할 수 있습니다.
- 이러한 정적 파일을 처리하는 것은 Apache에게 큰 문제가 되지 않지만, Apache가 덜 작동할수록 PHP로 더 많은 작업을 수행할 수 있습니다.
- 주의:Apache는 한 번에 한정된 수의 요청만 서버할 수 있습니다.
- 그런 다음 캐시에서 가능한 한 많은 PHP 페이지를 리버스 프록시로 처리하도록 합니다.아마 자주 변경되지 않고 캐시에서 처리될 수 있는 페이지가 있을 것입니다.PHP 기반 캐시를 사용하는 대신 다른 가벼운 서버가 이러한 캐시를 처리하도록 하는 것은 어떨까요? (그리고 PHP 서버에서 수시로 가져와 항상 최신 상태로 유지되도록 합니다.)
- 예를 들어, RSS 피드가 자주 요구되고 있는 경우(퍼포먼스를 최적화하려고 할 때 일반적으로 이러한 피드는 잊어버리는 경향이 있습니다) 몇 분 동안 캐시에 저장하면 Apache+에 대한 요청을 수백, 수천 개 줄일 수 있습니다.PHP+MySQL!
- 사이트에서 가장 많이 방문하는 페이지도 마찬가지로 몇 분 이상 변경되지 않으면(예: 홈페이지) 사용자가 요청할 때마다 CPU를 다시 생성할 필요가 없습니다.
- 익명 사용자에게 제공되는 페이지(모든 익명 사용자에게 동일한 페이지)와 식별된 사용자에게 제공되는 페이지(예를 들어 "안녕하세요 X님, 새로운 메시지가 있습니다" 등)에는 차이가 있을 수 있습니다.
- 이 경우 익명 사용자에게 제공되는 페이지를 캐시하도록 역방향 프록시를 설정할 수 있습니다(일반적으로 세션쿠키 등의 쿠키를 기반으로 함).
- Apache+는PHP는 취급할 수 있는 것이 적습니다.특정된 사용자만 있습니다.이것은 사용자의 극히 일부일 수 있습니다.
예를 들어 역프록시를 캐시로 사용하는 것에 대해서는 PHP 어플리케이션의 경우 Benchmark Results Show 400%-700% In Server Capabilities with APC 및 Squid Cache를 사용하여 서버 기능 증가를 볼 수 있습니다.
또 가능성일 하고 있습니다.) (네, 오징어)그것은 또 다른 가능성일 뿐입니다^^ Vanish는 보다 최신이지만 캐싱에 전념하고 있습니다.)
잘 몇 많은 하는 것을 ,
...그리고 너무 많은 전제하에 있지 않을 때는 항상 최적화를 수행하는 것이 좋습니다.
과 같이 : OP 에에 음 as에 、 OP 음음 、 OP 음음음 。
어제 코하나와 함께 만든 사이트가 엄청난 트래픽으로 꽉 막혔어요
웹 사이트가 2초까지 최신 상태가 되지 않는 것을 대처할 수 있다면, 이것은 문자 그대로 역프록시가 문제를 해결할 수 있는 갑작스러운 상황입니다.
- 설치, 구성, 항상 (평소 매일) 실행되도록 합니다.
- PHP 페이지를 캐시에 보관하지 않거나 짧은 기간 동안만 보관하도록 구성합니다. 이렇게 하면 항상 최신 데이터가 표시됩니다.
- 「 」 、 「 」 、 「 」:
- PHP 페이지를 캐시로 유지하도록 역프록시를 설정하세요.또는 더 오랜 시간 동안 당신의 페이지가 최신이 아닐 수도 있습니다.그러나 당신의 웹사이트는 dig-effect에서 살아남을 수 있습니다.
그것에 대해 어떻게 하면 '슬래시닷'이 되는 것을 감지하고 살아남을 수 있을까요?재미있는 읽을거리가 될 수도 있어요
PHP 측면에서는:
우선, 최신 버전의 PHP를 사용하고 있습니까?새로운 버전에서는 정기적으로 속도가 향상됩니다;-)
예를 들어 PHP 브런치 3.0~5.3-CVS의 Benchmark를 참조하십시오.
퍼포먼스는 PHP 5.3을 사용하는 충분한 이유임을 주의해 주십시오(프랑스어로 벤치마크를 몇 가지 작성했습니다만, 결과는 훌륭합니다).
물론 PHP 5.2가 수명을 다해서 더 이상 유지보수가 되지 않는 것도 좋은 이유입니다!
opcode 캐시를 사용하고 있습니까?
- APC - 대체 PHP Cache에 대해 생각하고 있습니다.예를 들어 (pecl, manual)는 제가 가장 많이 사용한 솔루션이며, 제가 작업한 모든 서버에서 사용되고 있습니다.
- 서버의 CPU 부하를 크게 낮출 수 있는 경우도 있습니다(APC를 설치하고 opcode-cache 기능을 활성화하는 것만으로 일부 서버의 CPU 부하가 80%에서 40%로 상승하는 것을 보았습니다).
- 기본적으로 PHP 스크립트의 실행은 다음 두 단계로 이루어집니다.
- PHP 소스 코드를 opcodes로 컴파일(JAVA의 바이트 코드와 동일)
- 이러한 opcode의 실행
- APC는 이들을 메모리에 보관하기 때문에 PHP 스크립트/파일이 실행될 때마다 수행해야 할 작업이 줄어듭니다. RAM에서 opcode를 가져와 실행하기만 하면 됩니다.
- 덧붙여서 APC의 구성 옵션을 확인해야 할 수도 있습니다.
- 그 중에는 속도, CPU 부하, 사용 편의성 양쪽에 큰 영향을 주는 것도 있습니다.
- 를 들어, 「」를 디세블로 .
[apc.stat](https://php.net/manual/en/apc.configuration.php#ini.apc.stat)
시스템 로드에 적합할 수 있습니다.단, opcode-cache 전체를 플러시하지 않는 한 PHP 파일의 변경은 고려되지 않습니다.자세한 내용은 예를 들어 To stat() 또는 Not To stat()를 참조하십시오.
데이터에 캐시 사용
가능한 한 같은 일을 반복하는 것은 피하는 것이 좋다.
물론 SQL Queries에 대해 생각하고 있습니다.여러 페이지의 대부분은 같은 쿼리를 실행하고 있으며, 그 중 일부는 거의 항상 같은 결과를 얻을 수 있습니다.즉, 데이터베이스에 대해 "쓸데없는" 쿼리가 많이 생성되어 동일한 데이터를 반복적으로 서비스해야 합니다.
물론 이는 웹 서비스 호출, 다른 웹사이트에서 정보 가져오기, 과도한 계산 등 다른 작업에도 해당됩니다.
다음 사항을 확인하는 것이 매우 흥미로울 수 있습니다.
- 항상 동일한 데이터를 반환하는 자주 실행되는 쿼리
- 항상 같은 결과를 반환하는 많은 시간을 실행하는 다른(중요한) 계산은 무엇입니까?
또한 이러한 데이터/결과를 캐시에 저장하여 보다 쉽게 얻을 수 있도록 하고 SQL Server에 "아무것도 필요 없음"으로 이동할 필요가 없습니다.
예를 들어 다음과 같은 캐싱 메커니즘이 있습니다.
- APC: 앞서 말씀드린 opcode-cache 외에 데이터를 메모리에 저장할 수 있습니다.
- memcached(및 그 양쪽 모두 참조)는, 문자 그대로 데이터가 많은 경우나, 복수의 서버를 사용하고 있는 경우에 매우 편리합니다.
- 물론, 당신은 파일에 대해 생각할 수 있다; 그리고 아마도 다른 많은 아이디어들.
사용하시는 프레임워크에는 캐시 관련 내용이 포함되어 있을 것입니다.OP에서 "앞으로 캐시 라이브러리를 더 많이 사용할 예정"이라고 말한 것처럼 이미 알고 있을 것입니다.
프로파일링
Xdebug 확장을 사용하여 응용 프로그램을 프로파일링하는 것이 좋습니다.대부분의 경우, 적어도 시간이 걸리는 함수가 있는 경우, 취약 스팟을 쉽게 찾을 수 있습니다.
적절하게 구성되면 다음과 같은 그래픽 도구를 사용하여 분석할 수 있는 프로파일링 파일이 생성됩니다.
- KCachegrind: 마음에 들지만 Linux/KDE에서만 작동
- Windows용 Wincache Grind. 안타깝게도 KCache Grind보다 작업량이 조금 적습니다.통상은 콜그래프가 표시되지 않습니다.
- 웹그라인드는 PHP 웹 서버에서 실행되므로 어디에서나 작동하지만 기능은 더 적을 수 있습니다.
예를 들어 KCache Grind의 스크린샷을 몇 개 나타냅니다.
(출처: pascal-timeout).fr)
(출처: pascal-timeout).fr)
(BTW, 두 번째 스크린샷에 표시되는 콜그래프는 일반적으로 WinCacheGrind도 Webgrind도 할 수 없는 작업입니다.제 기억이 맞다면 ^^ )
(@Mikushi 코멘트 감사합니다)또 다른 가능성은 xhprof 확장기능입니다.프로파일링에도 도움이 되고 콜그래프도 생성할 수 있지만 Xdebug보다 가볍기 때문에 프로덕션 서버에 설치할 수 있습니다.
데이터를 시각화하는 데 도움이 되는 XHGui를 항상 사용할 수 있어야 합니다.
SQL 측면:
PHP에 대해 조금 언급했으므로, 당신의 병목은 PHP 측면의 문제가 아니라 데이터베이스 측면의 병목일 가능성이 매우 높습니다.
적어도 두세 가지는 여기 있습니다.
- 하다
- 응용 프로그램에서 가장 자주 수행하는 쿼리는 무엇입니까?
- MySQL을 사용하는 경우 지침을 사용하여 이러한 인덱스가 최적화되는지 여부(주로 올바른 인덱스 사용?)
- 다음 항목도 참조하십시오.SELECT 및 기타 문의 최적화
- 예를 들어, 를 활성화하여 "너무 많은" 시간이 걸리는 요청 목록을 가져오고 해당 요청별로 최적화를 시작할 수 있습니다.
- 이러한 쿼리 중 일부를 캐시할 수 있는지 여부(앞에서 말씀드린 내용을 참조하십시오)
- MySQL?자세한 것은 모릅니다만, 몇개의 설정 옵션이 영향을 줄 가능성이 있습니다.
그러나 가장 중요한 두 가지는 다음과 같습니다.
- 필요 없는 경우 DB로 이동하지 마십시오. 가능한 한 많이 캐싱하십시오.
- DB로 이동해야 할 경우 효율적인 쿼리를 사용하십시오. 인덱스 사용 및 프로파일 사용!
이제는 또 뭔가?
아직 읽고 있는 경우, 그 밖에 무엇을 최적화할 수 있습니까?
음, 아직 개선의 여지가 있습니다...아키텍처 지향 아이디어는 다음과 같습니다.
- n's 'n's 'n's 'n's 'n's 'n's 's'
- Apache apache " 율율효효 apache apache apache apache apache apache apache apache apache apache apache apache apache apache apache apache apache apache?
- 저는 nginx에 대해 점점 더 자주 듣습니다.이것은 PHP나 대용량의 웹 사이트에서는 매우 좋은 것으로 생각됩니다.저 자신도 그것을 사용해 본 적은 없지만, 인터넷에 흥미로운 기사가 게재되어 있을지도 모릅니다.
- 예를 들어 PHP performance III -- nginx 실행.
- 참고 항목: PHP-FPM - FastCGI Process Manager(PHP > = 5.3.3과 함께 번들되고 nginx에서 놀라운 성능을 발휘합니다.
- 저는 nginx에 대해 점점 더 자주 듣습니다.이것은 PHP나 대용량의 웹 사이트에서는 매우 좋은 것으로 생각됩니다.저 자신도 그것을 사용해 본 적은 없지만, 인터넷에 흥미로운 기사가 게재되어 있을지도 모릅니다.
그런 중 는 당신의 좀이 될 ^^ 、 러 、 well 、 러 、 well 、 ^^ 、 ^^ 、 ^^ ^^ ^^
경우를 대비해서 해 보는 은 어떨까요 ;-) )혹혹 ; ; ; ;? ;-)
코하나 씨는요?
처음에 질문하신 것은 Kohana를 사용하는 어플리케이션의 최적화에 관한 것이었습니다.PHP 어플리케이션에 맞는 아이디어를 올렸습니다.즉, 코하나에게도 해당됩니다;-)
특정))))))^^)
캐시를 사용하라고 했습니다.Kohana는 캐시를 지원하는 것 같습니다(당신이 직접 언급했기 때문에 새로운 것은 없습니다).
할 수 해 보세요
또, 필요 없는 것은 하지 말아 주세요만, 코하나에서는 디폴트로 유효하게 되어 있는 것이 있습니까?
인터넷 열람을 해보니 적어도 XSS 필터링은 뭔가 있는 것 같은데 필요하신가요?
여기에도 도움이 될 만한 링크가 몇 개 있습니다.
결론?
그리고 결론적으로, 다음과 같은 간단한 생각이지만,
- 회사에서 5일치 급여를 받는 데 얼마나 들까요?--최적화를 하는 데 상당한 시간이 걸린다는 점을 고려하면요.
- 두 번째 서버 구입(비용 지불)과 유지보수에 드는 비용은 어느 정도입니까?
- 더더큰면면면면면면면면면면면면면면면?
- 열흘이면 얼마나 들까요? 더 들까요?어플리케이션의 모든 비트를 최적화하고 있습니까?
- 서버 몇 대를 증설하는 데 얼마죠?
최적화를 하지 말라는 것이 아니라, 최적화를 해야 한다는 것입니다.
단, 우선 큰 효과를 얻을 수 있는 '빠른' 최적화를 목표로 합니다.opcode 캐시를 사용하면 서버의 CPU 부하를 10~50% 절감할 수 있습니다.셋업에는 몇 분밖에 걸리지 않습니다.-) 반대로, 2%에 3일을 소비하고 있습니다.
아, 그리고 어떤 작업을 수행하기 전에 모니터링 기능을 배치하여 어떤 개선이 이루어졌는지, 어떻게 이루어졌는지 알 수 있습니다.
감시 없이는, 당신이 한 일의 결과를 알 수 없을 것이다...비록 그것이 진정한 최적화인지 아닌지는 몰라도!
예를 들어 RRDtool + 선인장 같은 것을 사용할 수 있습니다.
CPU 가 40%하는 멋진 훌륭합니다 CPU "40 % " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "
어쨌든, 그리고 정말 결론적으로 말하자면, 재미있게 놀아라!
( 「 」 、 「 」 、「 」…을사용하다다른 때에 도움이 될 수도 있습니다...)
XDebug 및 WinCacheGrind 또는 WebCacheGrind를 사용하여 느린 코드 실행을 프로파일링 및 분석합니다.
(출처 : jokke.dk )
XDebug를 사용하는 프로파일코드
캐시를 많이 사용합니다.페이지가 비교적 정적인 경우 리버스 프록시를 사용하는 것이 가장 좋습니다.
Kohana는 데이터베이스 오브젝트를 사용하는 것을 제외하고 매우 빠르게 사용할 수 있습니다.좀비 또는 "결과 배열 대신 데이터베이스 결과 개체를 사용하여 메모리 사용량을 줄일 수 있습니다."라고 인용합니다.그 때문에, 혹독한 사이트의 퍼포먼스가 크게 다릅니다.메모리 사용량이 많을 뿐만 아니라 스크립트 실행 속도도 느려집니다.
또한 - 캐시를 사용해야 합니다.저는 memcache를 선호하며 제 모델에서 다음과 같이 사용합니다.
public function get($e_id)
{
$event_data = $this->cache->get('event_get_'.$e_id.Kohana::config('config.site_domain'));
if ($event_data === NULL)
{
$this->db_slave
->select('e_id,e_name')
->from('Events')
->where('e_id', $e_id);
$result = $this->db_slave->get();
$event_data = ($result->count() ==1)? $result->current() : FALSE;
$this->cache->set('event_get_'.$e_id.Kohana::config('config.site_domain'), $event_data, NULL, 300); // 5 minutes
}
return $event_data;
}
이로 인해 퍼포먼스도 비약적으로 향상됩니다.위의 두 가지 기술을 통해 사이트 성능이 80% 향상되었습니다.
병목현상이 어디에 있는지 좀 더 알려주시면 더 좋은 아이디어를 드릴 수 있을 것 같습니다.
다른 퍼포먼스 힌트에 대해서는, yslow(구글 검색)를 참조해 주세요.
Kohana와 엄격히 관련됨(이미 이 작업을 수행했거나 수행하지 않았을 수 있음)
프로덕션 모드:
- 내부 캐시를 활성화합니다(Kohana::find_file 결과만 캐시되지만 실제로는 많은 도움이 됩니다).
- 프로파일러 비활성화
단 2센트 :)
XDebug와 캐싱에 전적으로 동의합니다.가장 빠른 속도와 규모의 병목 현상을 파악할 때까지 최적화를 위해 Kohana 계층을 검토하지 마십시오.
XDebug는 사용자가 대부분의 시간을 소비하고 코드의 '핫스팟'을 식별했음을 알려줍니다.성능 향상을 기준으로 측정하고 측정할 수 있도록 이 프로파일링 정보를 보관하십시오.
문제 및 해결 방법 예시:매번 데이터베이스에서 고가의 오브젝트를 빌드하고 있지만 실제로 자주 변경되지 않는 경우에는 memcached 또는 다른 메커니즘으로 캐슁하는 것을 검토할 수 있습니다.이러한 퍼포먼스 수정은 모두 시간이 걸리고 시스템이 복잡해집니다.그러므로 수정하기 전에 병목 현상을 확인해야 합니다.
언급URL : https://stackoverflow.com/questions/1260134/optimizing-kohana-based-websites-for-speed-and-scalability
'source' 카테고리의 다른 글
2개의 조인 및 구별로 그룹화된 mysql 쿼리 최적화 (0) | 2022.12.13 |
---|---|
PHP는 T_PAAMAYIM_NEKUDOTAYIM을 기대합니까? (0) | 2022.12.13 |
배열에서 처음 N개의 요소를 가져오는 방법 (0) | 2022.12.13 |
uniqid는 얼마나 고유합니까? (0) | 2022.12.13 |
MySQL에서 어제 날짜 선택 (0) | 2022.12.13 |