XHGui를 사용하여 PHP 성능을 테스트하는 방법에 대한 튜토리얼

WBOY
풀어 주다: 2016-05-16 20:12:00
원래의
1120명이 탐색했습니다.

프로파일링은 프로그램 성능을 관찰하는 데 사용되는 기술로, 프로그램 병목 현상이나 부족한 리소스를 발견하는 데 매우 적합합니다. 프로파일링은 프로그램에 깊이 들어가 요청 처리 프로세스에서 코드의 각 부분의 성능을 보여줄 수 있으며 동시에 문제가 있는 요청(요청)을 식별할 수도 있으며 성능 문제가 있는 위치도 확인할 수 있습니다. 요청 내에서 발생합니다. PHP의 경우 다양한 프로파일링 도구가 있습니다. 이 기사에서는 주로 매우 뛰어난 도구인 XHGui에 중점을 둡니다. XHGui는 XHProf(XHProf는 Facebook에서 출시됨)를 기반으로 구축되었지만 분석 결과를 위한 더 나은 저장 공간과 더 나은 정보 수집 인터페이스를 추가합니다. 이런 점에서 XHGui는 완전히 새로운 도구에 가깝습니다.

XHGui는 여러 번의 반복을 거쳤지만 현재 버전은 더 아름다운 사용자 인터페이스를 제공하고 MongoDB를 사용하여 프로파일링 결과를 저장합니다. 이러한 모든 측면은 이전 버전에 비해 크게 개선되었습니다. 이전 버전은 파일을 사용하여 데이터를 저장하는 개발자 디자인에 가까웠기 때문에 수집된 데이터를 사용하기가 매우 어려웠습니다. XHGui 2013은 관리자와 개발자 모두를 위한 매우 포괄적인 프로파일링 도구이며, XHGui 2013은 프로덕션 환경에서 실행할 수 있을 만큼 가볍도록 설계되었습니다.

이 기사에서는 프로그램 설치를 단계별로 설명하고 이 도구를 사용하여 수집할 수 있는 정보의 모든 측면을 보여줍니다.

1단계: 종속성 설치

XHGui에는 일부 종속성이 있으므로 첫 번째 단계는 이 문제를 해결하는 것입니다. 아래의 모든 튜토리얼은 Ubuntu 13.04 플랫폼을 기반으로 합니다. 물론 이를 조정하여 자신의 플랫폼에 적용할 수 있어야 합니다. 지금은 MongoDB, PHP를 설치하고 PECL 확장을 설치할 수 있는 기능이 필요합니다.

먼저 MongoDB를 설치해야 합니다. 여기에 공식 설치 튜토리얼이 있으며 시스템과 관련된 세부 정보를 찾을 수 있지만 지금은 APT를 통해 간단히 설치하겠습니다.

aptitude install mongodb
로그인 후 복사

이 방법을 통해 얻은 MongoDB의 버전은 업데이트가 매우 빠르게 이루어지기 때문에 최신 버전이 아닐 수 있습니다. 그러나 최신 버전으로 유지하려면 MongoDB에서 제공하는 라이브러리를 패키지 관리자에 추가하여 최신 버전을 얻을 수 있습니다.


동시에 PHP용 Mongo 드라이버도 필요합니다. 저장소에 있는 드라이버 버전은 약간 오래되었으므로 오늘 데모에서는 Pecl에서 다운로드하겠습니다. 컴퓨터에 pecl 명령이 없으면 다음 명령을 사용하여 설치할 수 있습니다:

aptitude install php-pear
로그인 후 복사

그런 다음 다음 명령을 통해 MongoDB 드라이버를 PHP에 추가합니다.

pecl install mongo
로그인 후 복사

설치를 완료하려면 마지막으로 php.ini 파일에 새 줄을 추가해야 합니다. 그러나 새 버전의 Ubuntu는 Apache 모듈 설치와 더욱 유사하게 작동하는 PHP 확장 구성을 위한 새로운 시스템을 제공합니다. 모든 구성을 한 곳에 저장한 다음 구성을 시작하기 위한 심볼릭 링크를 생성합니다. 먼저 설정을 저장할 파일을 만듭니다. 하지만 이 예에서는 확장 기능을 활성화하기 위해 설정에 새 줄만 추가하면 됩니다. /etc/php5/mods-available/mongo.ini 파일에 저장하고 다음 줄을 추가합니다:

php5enmod mongo

로그인 후 복사
pecl을 다시 사용하여 xhprof 확장을 설치하세요. 이 프로그램은 현재 베타 버전이므로 설치 명령은 다음과 같습니다.

pecl install xhprof-beta
로그인 후 복사

명령줄에서는 php.ini에 새 줄을 추가하라는 메시지를 다시 표시합니다. 위와 동일한 방법을 사용하여 /etc/php5/mods-available/xhprof.ini 파일을 생성하고 여기에 다음 내용을 추가합니다.

extension=xhprof.so

로그인 후 복사
이 시점에서 명령줄에서 php -m 명령을 실행하여 이러한 모듈이 올바르게 설치되었는지 확인할 수 있습니다. 웹 인터페이스에서 이러한 확장을 활성화할 수 있도록 Apache를 다시 시작하는 것을 잊지 마십시오.

XHGui 설치

XHGui 자체는 주로 웹 페이지로 구성되어 있으며, 이는 XHPrf 확장으로 수집된 데이터에 대해 보다 친숙한 인터페이스를 제공합니다. GitHub 리포지토리에서 복제할 수 있으며 zip 파일을 직접 다운로드하여 압축을 풀 수도 있습니다. 프로그램을 얻은 후 웹 서버가 파일 쓰기 권한을 가질 수 있도록 캐시 디렉토리에 충분한 권한이 있는지 확인하십시오. 마지막으로 설치 스크립트를 실행하세요.

php install.php
로그인 후 복사

이것은 프로그램 설치에 필요한 모든 것이며, 예외가 발생하면 일부 종속 프로그램이 자동으로 설치되며 설치 프로그램에서도 메시지를 표시합니다.

가상 호스트에 XHGui를 설치하는 것을 선호합니다. 이를 위해서는 .htaccess 파일의 권한이 필요하며 RUL 재작성을 활성화해야 합니다. URL 재작성을 시작하면 mod_rewrite 모듈을 시작해야 함을 나타내며 다음 명령을 전달합니다.

a2enmod rewrite
로그인 후 복사

(不要忘记重启Apache)。如果一切顺利,你可以正常访问XHGui的URL并且可以看到如下内容:

201573145850225.png (300×210)

在虚拟主机中启动XHGui

此时,我们希望启动XHGui以便检验我们网站的性能。注意,性能测试最好在进行任何优化之前执行一次,以便检测优化的效果。最简单的方法是在虚拟主机中增加auto_prepend_file声明,如下图所示:

 <VirtualHost *:80>
  ServerName example.local
 
  DocumentRoot /var/www/example/htdocs/
  php_admin_value auto_prepend_file /var/www/xhgui/external/header.php
 
  <Directory /var/www/example/htdocs/>
    Options FollowSymLinks Indexes
    AllowOverride All
  </Directory>
 
</VirtualHost>
로그인 후 복사

모든 것이 준비되면 웹사이트 요청 프로파일링을 시작할 수 있습니다. XHGui는 웹 사이트 요청의 1%만 프로파일링하므로 XHGui가 의미 있는 데이터를 얻으려면 XHGui를 일정 기간 동안 실행하거나 Apache Bench와 같은 테스트 도구를 사용하여 일괄 요청을 일괄 제출해야 합니다. XHGui가 100개의 요청 중 하나만 구문 분석하는 이유는 무엇입니까? XHGui는 프로덕션 환경에서 사용하기에 충분히 가볍도록 설계되었으며 각 요청에 대해 추가 오버헤드가 발생하는 것을 원하지 않기 때문에 1% 샘플링 비율은 이미 웹 사이트의 전체 트래픽에 대한 보다 명확한 개요를 제공할 수 있습니다.

데이터 만족

저는 Joind.in API를 테스트 코드로 사용하여 이 기사의 모든 예제를 실행하기 위해 테스트 가상 머신을 사용합니다. 트래픽을 생성하기 위해 API 테스트 사례를 몇 번 실행했습니다. 부하 상태에서도 데이터를 수집할 수 있으므로 스트레스 테스트 중에 XHGui를 사용할 수 있으며 XHGui를 사용하여 라이브 사이트에서 데이터를 수집할 수도 있습니다(이상하게 들리지만 Facebook은 공식적으로 이 애플리케이션을 위해 이 도구를 개발했습니다). 애플리케이션에 특정 요청을 보낸 후 XHGui를 다시 방문하면 이제 일부 데이터가 저장되었습니다.

201573145913073.png (300×210)

이 그래프는 XHGui가 분석한 각 요청을 보여줍니다. 최신 요청이 먼저 나열되고 각 요청에 대한 몇 가지 추가 정보가 표시됩니다. 이 정보에는 다음이 포함됩니다.

  • URL: 요청이 방문한 URL
  • 시간 : 요청 시작 시간
  • wtor: "Wall Time" – 요청이 완료될 때까지 사용자가 기다린 시간을 의미하는 "wall clock"의 약어입니다.
  • CPU: 이 요청에 소요된 CPU 시간
  • mu: 요청에 의해 소비된 메모리
  • pmu: 요청 처리 중 소비되는 최대 메모리

각 요청('실행')에 대한 자세한 정보를 보려면 관심 있는 각 요청의 열을 클릭하세요. URL을 클릭하면 해당 URL에 대한 모든 요청에 ​​대한 자세한 정보를 얻을 수 있습니다. 어느 쪽이든 요청에 ​​대한 자세한 정보를 얻을 수 있습니다.

201573145938626.png (300×210)

201573145957832.png (300×210)

이 페이지는 매우 길고 매우 상세한 페이지이므로 두 개의 스크린샷을 인용했습니다(모든 정보를 표시하려면 스크린샷 5개가 필요합니다). 위 그림의 왼쪽 부분은 이러한 통계가 어떤 측면과 관련되어 있는지 추적하는 데 도움이 되는 요청과 관련된 일부 정보를 보여줍니다. 오른쪽의 주요 부분은 가장 시간이 많이 걸리는 부분과 요청 중 각 함수 호출에 소요된 시간을 보여줍니다. 프로세스. 그래프 아래에는 각 열을 나타내는 기본 키가 있습니다.

두 번째 이미지는 요청의 각 구성 요소에 대한 자세한 정보를 보여줍니다. CPU, 메모리 정보 등 각 부분의 호출 횟수와 시간 소모를 확인할 수 있습니다. 포함 정보와 배타적 정보가 모두 자세히 표시됩니다. 배타적이란 메서드 호출로 인한 소비만 의미하며, 포함은 이 함수로 인해 발생한 소비뿐만 아니라 이 함수에서 호출된 다른 함수로 인해 발생한 소비도 포함한다는 의미입니다.


XHGui의 또 다른 기능은 "Callgraph"입니다. "Callgraph"는 생생한 가상 방식으로 시간이 어떻게 소모되는지 보여줍니다.

201573150016938.png (300×210)

이는 함수 호출의 계층 구조를 잘 보여줍니다. 가장 좋은 점은 다이어그램이 대화형이며 드래그하여 연결을 더 잘 볼 수 있다는 것입니다. 또한 얼룩 위로 마우스를 가져가면 더 많은 정보를 볼 수 있습니다. 상호 작용할 때 장난스럽게 튕기고 움직입니다. 이는 크게 중요한 기능은 아니지만 저에게는 정말 재미있었습니다.

데이터 이해

통계를 많이 갖는 것도 중요하지만 어디서부터 시작해야 할지 알기 어려울 수 있습니다. 성능이 예상만큼 좋지 않은 페이지의 경우 다음 단계를 따르세요. 먼저 각 함수의 전용 CPU 시간을 정렬하고 가장 많은 시간을 소비하는 함수 목록을 확인합니다. 시간이 많이 걸리는 이러한 함수 호출을 분석하고 리팩토링하고 최적화하십시오.

변경이 이루어지면 프로파일링 도구를 사용하여 프로그램의 새 버전을 다시 검사하여 성능 개선을 테스트하도록 하세요. XHGui에는 두 실행을 비교하는 데 완벽한 도구가 내장되어 있습니다. 세부 정보 페이지 오른쪽 상단에 있는 "이 실행 비교" 버튼을 클릭하세요. 이 버튼을 누르면 이 URL에 대한 각 테스트 결과가 표시되며, 여기에서 비교하려는 개체를 선택할 수 있습니다. 비교하려는 개체에 대해 "비교" 버튼을 클릭하면 XHGui가 아래와 같이 비교 보기로 전환됩니다.

201573150035219.png (300×210)

통계표에는 각 정보 변경의 실제 횟수와 비율을 포함하여 새 버전과 이전 버전의 통계 간의 주요 차이점이 표시됩니다. 위 그림을 보면 새 버전의 요청 대기 시간이 이전 버전의 8%에 불과한 것을 알 수 있습니다. 통계표에는 각 통계 정보의 변경 사항이 자세히 표시되며, 이는 '세부정보' 페이지에서 자주 볼 수 있으며, 원하는 정보를 찾기 위해 열을 정렬할 수 있습니다.

한 영역에서 리팩토링을 성공적으로 마쳤으면 세부정보 페이지에서 새 버전이 실제로 작동하는지 확인한 다음 최적화할 다른 영역을 선택하세요. 전체 애플리케이션 성능을 최대화하는 기능을 선택하고 최적화하려면 메모리 사용량이나 독점 벽 시간을 정렬해 보세요. 동시에 호출 횟수를 확인하는 것을 잊지 마십시오. 반복적으로 호출되는 함수는 최적화 후 프로그램 성능을 기하급수적으로 향상시킬 수 있습니다.

최적화 방법

결과를 정량화하기 전에는 얼마나 개선되었는지 알기 어렵습니다. 이것이 바로 우리가 애플리케이션을 최적화하기 전에 종종 테스트하는 이유입니다. 그렇지 않으면 애플리케이션이 실제로 최적화되었는지 어떻게 알 수 있습니까? 또한 실제 데이터 세트를 어떻게 표현해야 하는지 생각해야 합니다. 그렇지 않으면 불가능한 목표를 향해 나아가게 될 수도 있습니다. 매우 유용한 방법은 가장 적합한 데이터 구조와 사용해야 하는 가장 작은 저장 공간을 찾기 위해 최선을 다하는 것입니다. 당신이 잘하는 작업 환경에서 "Hello world" 프로그램을 0.5초 안에 실행할 수 없다면, 동일한 도구로 구축된 웹 페이지가 얼마나 잘 수행될지는 기대하지 마십시오.

위 설명은 프로그래밍 프레임워크를 무시하는 것이 아닙니다. 프로그래밍 프레임워크는 사용하기 쉽고, 빠른 개발을 지원하며, 유지 관리가 쉽기 때문에 존재합니다. 손으로 코드를 작성하는 것과 비교할 때 프로그래밍 프레임워크의 성능 감소는 모든 측면에서 타협의 결과입니다. 애플리케이션 개발을 위해 프로그래밍 프레임워크를 사용하는 것은 가능한 한 빨리 이를 온라인으로 전환하는 좋은 방법입니다. 필요한 경우 프로파일링 도구를 사용하여 프로그램 성능을 분석하고 개선할 수 있습니다. 예를 들어 Zend Framework 1의 많은 모듈은 매우 강력한 기능을 제공하지만 매우 느립니다. 프로파일링 도구를 사용하면 성능이 낮은 부품을 식별하고 교체할 수 있습니다. 다른 모든 프레임워크에는 비슷한 문제가 있으며 XHGui는 문제가 있는 위치를 보여주고 문제가 애플리케이션에 정량화 가능한 영향을 미치는지 확인할 수 있습니다.


프로그램 외부에서 조만간 우위를 확보하기 위해 다른 전략이 도움이 될 수 있습니다.

  • 위험할 정도로 느리지는 않지만 관련된 기능이 페이지에 나타나는 것을 주의하세요. 페이지가 서식 지정 지점을 처리하는 보기 도우미의 일련의 함수에서 50%의 시간을 소비하는 경우(이것은 가상의 예임을 약속합니다) 전체 구성 요소를 리팩토링하는 것이 좋습니다.
  • 덜 하세요. 기능보다 성능이 더 중요하다면 기능을 제거해 보세요.
  • 한 번의 요청으로 생성되었지만 특정 보기에서 사용되지 않은 콘텐츠 또는 변경되지 않았지만 여러 번 다시 생성되는 콘텐츠에 주의하세요.
  • 좋은 캐싱 전략. 이에 대한 또 다른 기사가 되겠지만, PHP에서 OpCode 캐시(PHP 5.5부터 내장)를 사용하고, 웹 서버 앞에 역방향 프록시를 추가하고, 자주 변경되지 않는 콘텐츠를 제공하는 것을 고려해 보세요.
  • 폭력적인 디커플링. 리소스를 많이 사용하는 특수 기능이 있는 경우 웹 서버에서 해당 기능을 제거하세요. 아마도 비동기식으로 처리될 수 있으므로 프로그램이 큐에 메시지를 추가하거나 별도의 서버로 이동되어 별도의 서비스 모델로 액세스될 수 있습니다. 어느 쪽이든 분리하면 웹 서버의 로드를 줄이는 동시에 효율적인 확장이 가능해집니다.

XHGui는 당신의 친구입니다

XHGui는 설치도 쉽고, 사용도 간편하며, 이사회에서 발표해도 될 정도로 출력이 좋습니다. 이는 앱의 버그를 식별하고 앱이 실제로 작동하는지(또는 작동하지 않는지) 확인하는 데 도움이 됩니다. 이는 몇 가지 반복적인 프로세스를 거칠 수 있지만 이전에 XHProf 또는 XHGui를 사용해 본 적이 있는지 여부에 관계없이 시간을 내어 응용 프로그램에서 사용해 보시기 바랍니다. 발견한 내용에 놀라게 될 것입니다.

관련 라벨:
php
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿