source

Kohana 기반 웹사이트의 속도와 확장성 최적화

manysource 2022. 12. 13. 20:10

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-CVSBenchmark를 참조하십시오.

퍼포먼스는 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의 스크린샷을 몇 개 나타냅니다.

KCache Grind : 메인 화면
(출처: pascal-timeout).fr)
KCache Grind : 이미지로 내보낸 콜그래프
(출처: pascal-timeout).fr)

(BTW, 두 번째 스크린샷에 표시되는 콜그래프는 일반적으로 WinCacheGrind도 Webgrind도 할 수 없는 작업입니다.제 기억이 맞다면 ^^ )


(@Mikushi 코멘트 감사합니다)또 다른 가능성은 xhprof 확장기능입니다.프로파일링에도 도움이 되고 콜그래프도 생성할 수 있지만 Xdebug보다 가볍기 때문에 프로덕션 서버에 설치할 수 있습니다.

데이터를 시각화하는 데 도움이 되는 XHGui를 항상 사용할 수 있어야 합니다.


SQL 측면:

PHP에 대해 조금 언급했으므로, 당신의 병목은 PHP 측면의 문제가 아니라 데이터베이스 측면의 병목일 가능성이 매우 높습니다.

적어도 두세 가지는 여기 있습니다.

  • 하다
    • 응용 프로그램에서 가장 자주 수행하는 쿼리는 무엇입니까?
    • MySQL을 사용하는 경우 지침을 사용하여 이러한 인덱스가 최적화되는지 여부(주로 올바른 인덱스 사용?)
      • 다음 항목도 참조하십시오.SELECT 및 기타 문의 최적화
      • 예를 들어, 를 활성화하여 "너무 많은" 시간이 걸리는 요청 목록을 가져오고 해당 요청별로 최적화를 시작할 수 있습니다.
    • 이러한 쿼리 중 일부를 캐시할 수 있는지 여부(앞에서 말씀드린 내용을 참조하십시오)
  • MySQL?자세한 것은 모릅니다만, 몇개의 설정 옵션이 영향을 줄 가능성이 있습니다.
    • MySQL Server를 최적화하면 이에 대한 몇 가지 흥미로운 정보를 얻을 수 있습니다.

그러나 가장 중요한 두 가지는 다음과 같습니다.

  • 필요 없는 경우 DB로 이동하지 마십시오. 가능한 한 많이 캐싱하십시오.
  • DB로 이동해야 할 경우 효율적인 쿼리를 사용하십시오. 인덱스 사용 및 프로파일 사용!


이제는 또 뭔가?

아직 읽고 있는 경우, 그 밖에 무엇을 최적화할 수 있습니까?

음, 아직 개선의 여지가 있습니다...아키텍처 지향 아이디어는 다음과 같습니다.

  • n's 'n's 'n's 'n's 'n's 'n's 's'
    • MySQL을 다른 서버에 배치합니다(2계층: 하나는 PHP용, 다른 하나는 MySQL용).
    • 여러 PHP 서버 사용(및 이들 서버 간의 사용자 로드밸런싱
    • 스태틱 파일에는 다음과 같은 가벼운 웹 서버를 사용하여 다른 머신을 사용합니다.
      • 라이트
      • 또는 nginx -- 이것은 점점 더 인기를 얻고 있습니다.
    • MySQL용 여러 서버, PHP용 여러 서버 및 그 앞에 여러 리버스 프록시를 사용합니다.
    • 물론 사용 가능한 RAM이 있는 모든 서버에 memcached 데몬을 설치하여 가능한 한 많은 양의 캐시에 사용합니다.
  • Apache apache " 율율효효 apache apache apache apache apache apache apache apache apache apache apache apache apache apache apache apache apache apache?
    • 는 nginx에 대해 점점 더 자주 듣습니다.이것은 PHP나 대용량의 웹 사이트에서는 매우 좋은 것으로 생각됩니다.저 자신도 그것을 사용해 본 적은 없지만, 인터넷에 흥미로운 기사가 게재되어 있을지도 모릅니다.

그런 중 는 당신의 좀이 될 ^^ 、 러 、 well 、 러 、 well 、 ^^ 、 ^^ 、 ^^ ^^ ^^
경우를 대비해서 해 보는 은 어떨까요 ;-) )혹혹 ; ; ; ;? ;-)


코하나 씨는요?

처음에 질문하신 것은 Kohana를 사용하는 어플리케이션의 최적화에 관한 것이었습니다.PHP 어플리케이션에 맞는 아이디어를 올렸습니다.즉, 코하나에게도 해당됩니다;-)
특정))))))^^)

캐시를 사용하라고 했습니다.Kohana는 캐시를 지원하는 것 같습니다(당신이 직접 언급했기 때문에 새로운 것은 없습니다).
할 수 해 보세요

또, 필요 없는 것은 하지 말아 주세요만, 코하나에서는 디폴트로 유효하게 되어 있는 것이 있습니까?
인터넷 열람을 해보니 적어도 XSS 필터링은 뭔가 있는 것 같은데 필요하신가요?

여기에도 도움이 될 만한 링크가 몇 개 있습니다.


결론?

그리고 결론적으로, 다음과 같은 간단한 생각이지만,

  • 회사에서 5일치 급여를 받는 데 얼마나 들까요?--최적화를 하는 데 상당한 시간이 걸린다는 점을 고려하면요.
  • 두 번째 서버 구입(비용 지불)과 유지보수에 드는 비용은 어느 정도입니까?
  • 더더큰면면면면면면면면면면면면면면면?
    • 열흘이면 얼마나 들까요? 더 들까요?어플리케이션의 모든 비트를 최적화하고 있습니까?
    • 서버 몇 대를 증설하는 데 얼마죠?

최적화를 하지 말라는 것이 아니라, 최적화를 해야 한다는 것입니다.
단, 우선 큰 효과를 얻을있는 '빠른' 최적화를 목표로 합니다.opcode 캐시를 사용하면 서버의 CPU 부하를 10~50% 절감할 수 있습니다.셋업에는 몇 분밖에 걸리지 않습니다.-) 반대로, 2%에 3일을 소비하고 있습니다.

아, 그리고 어떤 작업을 수행하기 전에 모니터링 기능을 배치하여 어떤 개선이 이루어졌는지, 어떻게 이루어졌는지 알 수 있습니다.
감시 없이는, 당신이 한 일의 결과를 알 수 없을 것이다...비록 그것이 진정한 최적화인지 아닌지는 몰라도!

예를 들어 RRDtool + 선인장 같은 것을 사용할 수 있습니다.
CPU 가 40%하는 멋진 훌륭합니다 CPU "40 % " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "


어쨌든, 그리고 정말 결론적으로 말하자면, 재미있게 놀아라!

( 「 」 、 「 」 、「 」을사용하다다른 때에 도움이 될 수도 있습니다...)

XDebugWinCacheGrind 또는 WebCacheGrind를 사용하여 느린 코드 실행을 프로파일링 및 분석합니다.

Web Cache Grind
(출처 : jokke.dk )
WinCache Grind

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와 엄격히 관련됨(이미 이 작업을 수행했거나 수행하지 않았을 수 있음)

프로덕션 모드:

  1. 내부 캐시를 활성화합니다(Kohana::find_file 결과만 캐시되지만 실제로는 많은 도움이 됩니다).
  2. 프로파일러 비활성화

단 2센트 :)

XDebug와 캐싱에 전적으로 동의합니다.가장 빠른 속도와 규모의 병목 현상을 파악할 때까지 최적화를 위해 Kohana 계층을 검토하지 마십시오.

XDebug는 사용자가 대부분의 시간을 소비하고 코드의 '핫스팟'을 식별했음을 알려줍니다.성능 향상을 기준으로 측정하고 측정할 수 있도록 이 프로파일링 정보를 보관하십시오.

문제 및 해결 방법 예시:매번 데이터베이스에서 고가의 오브젝트를 빌드하고 있지만 실제로 자주 변경되지 않는 경우에는 memcached 또는 다른 메커니즘으로 캐슁하는 것을 검토할 수 있습니다.이러한 퍼포먼스 수정은 모두 시간이 걸리고 시스템이 복잡해집니다.그러므로 수정하기 전에 병목 현상을 확인해야 합니다.

언급URL : https://stackoverflow.com/questions/1260134/optimizing-kohana-based-websites-for-speed-and-scalability