프로파일링은 프로그램 성능을 관찰하는 데 사용되는 기술로, 프로그램 병목 현상이나 부족한 리소스를 발견하는 데 매우 적합합니다. 프로파일링은 프로그램에 깊이 들어가 요청 처리 프로세스에서 코드의 각 부분의 성능을 보여줄 수 있으며 동시에 문제가 있는 요청(요청)을 식별할 수도 있으며 성능 문제가 있는 위치도 확인할 수 있습니다. 요청 내에서 발생합니다. 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 install xhprof-beta
명령줄에서는 php.ini에 새 줄을 추가하라는 메시지를 다시 표시합니다. 위와 동일한 방법을 사용하여 /etc/php5/mods-available/xhprof.ini 파일을 생성하고 여기에 다음 내용을 추가합니다.
extension=xhprof.so
XHGui 설치
XHGui 자체는 주로 웹 페이지로 구성되어 있으며, 이는 XHPrf 확장으로 수집된 데이터에 대해 보다 친숙한 인터페이스를 제공합니다. GitHub 리포지토리에서 복제할 수 있으며 zip 파일을 직접 다운로드하여 압축을 풀 수도 있습니다. 프로그램을 얻은 후 웹 서버가 파일 쓰기 권한을 가질 수 있도록 캐시 디렉토리에 충분한 권한이 있는지 확인하십시오. 마지막으로 설치 스크립트를 실행하세요.
php install.php
이것은 프로그램 설치에 필요한 모든 것이며, 예외가 발생하면 일부 종속 프로그램이 자동으로 설치되며 설치 프로그램에서도 메시지를 표시합니다.
가상 호스트에 XHGui를 설치하는 것을 선호합니다. 이를 위해서는 .htaccess 파일의 권한이 필요하며 RUL 재작성을 활성화해야 합니다. URL 재작성을 시작하면 mod_rewrite 모듈을 시작해야 함을 나타내며 다음 명령을 전달합니다.
a2enmod rewrite
(不要忘记重启Apache)。如果一切顺利,你可以正常访问XHGui的URL并且可以看到如下内容:
在虚拟主机中启动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를 다시 방문하면 이제 일부 데이터가 저장되었습니다.
이 그래프는 XHGui가 분석한 각 요청을 보여줍니다. 최신 요청이 먼저 나열되고 각 요청에 대한 몇 가지 추가 정보가 표시됩니다. 이 정보에는 다음이 포함됩니다.
각 요청('실행')에 대한 자세한 정보를 보려면 관심 있는 각 요청의 열을 클릭하세요. URL을 클릭하면 해당 URL에 대한 모든 요청에 대한 자세한 정보를 얻을 수 있습니다. 어느 쪽이든 요청에 대한 자세한 정보를 얻을 수 있습니다.
이 페이지는 매우 길고 매우 상세한 페이지이므로 두 개의 스크린샷을 인용했습니다(모든 정보를 표시하려면 스크린샷 5개가 필요합니다). 위 그림의 왼쪽 부분은 이러한 통계가 어떤 측면과 관련되어 있는지 추적하는 데 도움이 되는 요청과 관련된 일부 정보를 보여줍니다. 오른쪽의 주요 부분은 가장 시간이 많이 걸리는 부분과 요청 중 각 함수 호출에 소요된 시간을 보여줍니다. 프로세스. 그래프 아래에는 각 열을 나타내는 기본 키가 있습니다.
두 번째 이미지는 요청의 각 구성 요소에 대한 자세한 정보를 보여줍니다. CPU, 메모리 정보 등 각 부분의 호출 횟수와 시간 소모를 확인할 수 있습니다. 포함 정보와 배타적 정보가 모두 자세히 표시됩니다. 배타적이란 메서드 호출로 인한 소비만 의미하며, 포함은 이 함수로 인해 발생한 소비뿐만 아니라 이 함수에서 호출된 다른 함수로 인해 발생한 소비도 포함한다는 의미입니다.
XHGui의 또 다른 기능은 "Callgraph"입니다. "Callgraph"는 생생한 가상 방식으로 시간이 어떻게 소모되는지 보여줍니다.
이는 함수 호출의 계층 구조를 잘 보여줍니다. 가장 좋은 점은 다이어그램이 대화형이며 드래그하여 연결을 더 잘 볼 수 있다는 것입니다. 또한 얼룩 위로 마우스를 가져가면 더 많은 정보를 볼 수 있습니다. 상호 작용할 때 장난스럽게 튕기고 움직입니다. 이는 크게 중요한 기능은 아니지만 저에게는 정말 재미있었습니다.
데이터 이해
통계를 많이 갖는 것도 중요하지만 어디서부터 시작해야 할지 알기 어려울 수 있습니다. 성능이 예상만큼 좋지 않은 페이지의 경우 다음 단계를 따르세요. 먼저 각 함수의 전용 CPU 시간을 정렬하고 가장 많은 시간을 소비하는 함수 목록을 확인합니다. 시간이 많이 걸리는 이러한 함수 호출을 분석하고 리팩토링하고 최적화하십시오.
변경이 이루어지면 프로파일링 도구를 사용하여 프로그램의 새 버전을 다시 검사하여 성능 개선을 테스트하도록 하세요. XHGui에는 두 실행을 비교하는 데 완벽한 도구가 내장되어 있습니다. 세부 정보 페이지 오른쪽 상단에 있는 "이 실행 비교" 버튼을 클릭하세요. 이 버튼을 누르면 이 URL에 대한 각 테스트 결과가 표시되며, 여기에서 비교하려는 개체를 선택할 수 있습니다. 비교하려는 개체에 대해 "비교" 버튼을 클릭하면 XHGui가 아래와 같이 비교 보기로 전환됩니다.
통계표에는 각 정보 변경의 실제 횟수와 비율을 포함하여 새 버전과 이전 버전의 통계 간의 주요 차이점이 표시됩니다. 위 그림을 보면 새 버전의 요청 대기 시간이 이전 버전의 8%에 불과한 것을 알 수 있습니다. 통계표에는 각 통계 정보의 변경 사항이 자세히 표시되며, 이는 '세부정보' 페이지에서 자주 볼 수 있으며, 원하는 정보를 찾기 위해 열을 정렬할 수 있습니다.
한 영역에서 리팩토링을 성공적으로 마쳤으면 세부정보 페이지에서 새 버전이 실제로 작동하는지 확인한 다음 최적화할 다른 영역을 선택하세요. 전체 애플리케이션 성능을 최대화하는 기능을 선택하고 최적화하려면 메모리 사용량이나 독점 벽 시간을 정렬해 보세요. 동시에 호출 횟수를 확인하는 것을 잊지 마십시오. 반복적으로 호출되는 함수는 최적화 후 프로그램 성능을 기하급수적으로 향상시킬 수 있습니다.
최적화 방법
결과를 정량화하기 전에는 얼마나 개선되었는지 알기 어렵습니다. 이것이 바로 우리가 애플리케이션을 최적화하기 전에 종종 테스트하는 이유입니다. 그렇지 않으면 애플리케이션이 실제로 최적화되었는지 어떻게 알 수 있습니까? 또한 실제 데이터 세트를 어떻게 표현해야 하는지 생각해야 합니다. 그렇지 않으면 불가능한 목표를 향해 나아가게 될 수도 있습니다. 매우 유용한 방법은 가장 적합한 데이터 구조와 사용해야 하는 가장 작은 저장 공간을 찾기 위해 최선을 다하는 것입니다. 당신이 잘하는 작업 환경에서 "Hello world" 프로그램을 0.5초 안에 실행할 수 없다면, 동일한 도구로 구축된 웹 페이지가 얼마나 잘 수행될지는 기대하지 마십시오.
위 설명은 프로그래밍 프레임워크를 무시하는 것이 아닙니다. 프로그래밍 프레임워크는 사용하기 쉽고, 빠른 개발을 지원하며, 유지 관리가 쉽기 때문에 존재합니다. 손으로 코드를 작성하는 것과 비교할 때 프로그래밍 프레임워크의 성능 감소는 모든 측면에서 타협의 결과입니다. 애플리케이션 개발을 위해 프로그래밍 프레임워크를 사용하는 것은 가능한 한 빨리 이를 온라인으로 전환하는 좋은 방법입니다. 필요한 경우 프로파일링 도구를 사용하여 프로그램 성능을 분석하고 개선할 수 있습니다. 예를 들어 Zend Framework 1의 많은 모듈은 매우 강력한 기능을 제공하지만 매우 느립니다. 프로파일링 도구를 사용하면 성능이 낮은 부품을 식별하고 교체할 수 있습니다. 다른 모든 프레임워크에는 비슷한 문제가 있으며 XHGui는 문제가 있는 위치를 보여주고 문제가 애플리케이션에 정량화 가능한 영향을 미치는지 확인할 수 있습니다.
프로그램 외부에서 조만간 우위를 확보하기 위해 다른 전략이 도움이 될 수 있습니다.
XHGui는 당신의 친구입니다
XHGui는 설치도 쉽고, 사용도 간편하며, 이사회에서 발표해도 될 정도로 출력이 좋습니다. 이는 앱의 버그를 식별하고 앱이 실제로 작동하는지(또는 작동하지 않는지) 확인하는 데 도움이 됩니다. 이는 몇 가지 반복적인 프로세스를 거칠 수 있지만 이전에 XHProf 또는 XHGui를 사용해 본 적이 있는지 여부에 관계없이 시간을 내어 응용 프로그램에서 사용해 보시기 바랍니다. 발견한 내용에 놀라게 될 것입니다.