>  기사  >  백엔드 개발  >  xhprof를 사용하여 php7에서 PHP 성능을 테스트하는 방법은 무엇입니까? (방법 소개)

xhprof를 사용하여 php7에서 PHP 성능을 테스트하는 방법은 무엇입니까? (방법 소개)

青灯夜游
青灯夜游앞으로
2020-07-15 17:11:474571검색

xhprof를 사용하여 php7에서 PHP 성능을 테스트하는 방법은 무엇입니까? (방법 소개)

Introduction

1 배경

  • PHP의 xhprof 확장 Facebook은 더 이상 업데이트 및 유지 관리되지 않습니다. Faceboo는 HHVM을 완전히 사용하고 더 이상 PHP zend 엔진을 사용하지 않기 때문입니다.

  • xhprof는 새 버전의 PHP(PHP7)를 지원하지 않습니다.

  • tideways는 UI 서비스에 대해서만 비용을 청구합니다. 실제로 xhgui는 일상적인 요구 사항을 완벽하게 충족할 수 있습니다.

2 기능

Tideways는 PHP 성능을 테스트하는 데 사용되는 확장 프로그램입니다. PHP 실행 전 과정에서 호출되는 함수, 함수 호출 횟수, 실행 시간, CPU 시간, 메모리 사용량, 메모리 피크 값, 총 실행 시간, 총 CPU 시간, 총 메모리 사용량, 총 메모리 피크 값을 얻을 수 있습니다. 위의 데이터를 통해 PHP의 성능 병목 현상을 파악하고, PHP 실행 과정을 분석하는 등의 데이터를 분석할 수 있습니다.

3 장점

tideways는 xhgui와 결합된 PHP 확장이므로 코드를 모니터링하기 위해 PHP 코드에 코드를 묻어둘 필요가 없습니다.
  • 실행 빈도를 설정할 수 있습니다(예: 1/100), 모든 요청이 실행 로그를 생성할 때마다 수행할 필요가 없으므로 성능 손실이 발생하며 요청 매개변수를 통해 실행 로그 생성 여부를 적극적으로 제어할 수도 있습니다(debug=1)
  • 간단한 방법이 있습니다. 그리고 데이터를 변환하는 다이렉트 UI
  • 특정 인터페이스 분석, 특정 기간의 인터페이스 요청 분석 등 조건에 따라 데이터를 자유롭게 필터링할 수 있습니다.
4 단점

비록 비침해적이므로 각 인터페이스 로그에 대해 실행이 생성되면 CPU 및 메모리 소비를 무시할 수 없습니다.

5 구현 원칙

tideways 확장 프로그램은 실행 로그 생성을 담당합니다.

    nginx는 fastcgi_param PHP_VALUE auto_prepend_file로 구성되며, auto_prepend_file로 구성된 PHP 파일은 요청이 시작되기 전에 실행됩니다. Tideways 임베딩을 구현하기 위해 Tideways_disable을 호출하면 실행 로그가 mongodb 또는 mysql 또는 파일에 저장되고 xhgui로 분석된 후 표시됩니다. 표시 형식에는 히스토그램, 폭포 및 Flame 그래프가 포함됩니다.
애플리케이션

다음으로 두 가지 애플리케이션 방법을 소개합니다: Intrusive

Non-intrusive Intrusive는 코드에 코드를 추가하는 것을 의미하고 Intrusive는 기본 UI를 사용합니다. 침입적이란 코드를 변경하지 않고 nginx/apache를 변경하여 코드 삽입이 이루어짐을 의미합니다. intrusive:

git clone "https://github.com/tideways/php-xhprof-extension.git"
cd php-xhprof-extension
phpize
./configure --with-php-config=/usr/local/php7/bin/php-config
make
sudo make install
여기서 생성된 .xhprof 파일은 tmp 디렉터리에 있으며 기본 UI도 tmp 디렉터리에서 .xhprof 파일을 검색합니다.

데이터를 찾으려면 기본 UI를 설치하세요

<?php
tideways_xhprof_enable();

// your application code

$data = tideways_xhprof_disable();
file_put_contents(
    sys_get_temp_dir() . "/" . uniqid() . ".yourapp.xhprof",
    serialize($data)
);

  // $data = tideways_xhprof_disable();
  // file_put_contents(
  //     sys_get_temp_dir() . "/" . date(&#39;His&#39;, time()) . ".material.xhprof",
  //     serialize($data)
  // );

이 저장소에서 추적 목록을 확인하세요. 함수 호출 메모를 보려면 Callgraph를 설치해야 합니다

Install Callgraph

Callgraph는 실제로 세 가지 도구로 구성됩니다. 하나는 C 함수 호출 트리를 생성하는 데 사용되는 cflow 또는 calltree입니다. 다음은 주로 cflow를 소개합니다.

graphviz로 강화된 도트 텍스트 그래픽 언어 처리 도구입니다. xhprof_libxhprof_html目录安装到您的Web文件夹中,并导航xhprof_html/index.php

C 함수 호출 트리를 도트 형식으로 변환하는 스크립트: tree2dotx

Ubuntu를 예로 들어 각각 설치합니다.

git clone git@github.com:phacility/xhprof.git
다음으로 기본적으로 /usr/local/bin에 설치되는 tree2dotx와 Callgraph를 설치합니다.
sudo apt-get install cflow graphviz
다음 두 렌더링이 표시됩니다.

침투적:

xhgui를 침입적으로 사용하려면 xhgui

를 설치하려면 mongodb

가 필요합니다. reee

Nginx 구성

wget -c https://github.com/tinyclub/linux-0.11-lab/raw/master/tools/tree2dotx
wget -c https://github.com/tinyclub/linux-0.11-lab/raw/master/tools/callgraph
sudo cp tree2dotx callgraph /usr/local/bin
sudo chmod +x /usr/local/bin/{tree2dotx,callgraph}

여기서 의미하는 바는 프로젝트 PHP 코드를 실행하기 전에 header.php를 실행하여 비침해적 탐지 성능의 목적을 달성한다는 것입니다

xhgui 구성(로그 생성 빈도)

xhgui의 구성에서 /config.default.php에서 샘플링 히트 수를 설정할 수 있습니다

return rand(1, 100) === 42; 为1%的采样率,改成return True;则标识每次都采样

&#39;profiler.enable&#39; => function() {
   // url 中包含debug=1则百分百捕获
   if(!empty($_GET['debug'])){
       return True;
   }else{
       // 1%采样
       return rand(1, 100) === 42;
   }
}

mongodb的配置

   xhgui/config/config.default.php

// Can be either mongodb or file.
   /*
   'save.handler' => 'file',
   'save.handler.filename' => dirname(__DIR__) . '/cache/' . 'xhgui.data.' . microtime(true) . '_' . substr(md5($url), 0, 6),
   */
   'save.handler' => 'mongodb',
   // Needed for file save handler. Beware of file locking. You can adujst this file path
   // to reduce locking problems (eg uniqid, time ...)
   //'save.handler.filename' => __DIR__.'/../data/xhgui_'.date('Ymd').'.dat',
   'db.host' => 'mongodb://127.0.0.1:27017',
   'db.db' => 'xhprof',

mongo服务器的配置

mongo
 > use xhprof
 > db.results.ensureIndex( { 'meta.SERVER.REQUEST_TIME' : -1 } )
 > db.results.ensureIndex( { 'profile.main().wt' : -1 } )
 > db.results.ensureIndex( { 'profile.main().mu' : -1 } )
 > db.results.ensureIndex( { 'profile.main().cpu' : -1 } )
 > db.results.ensureIndex( { 'meta.url' : 1 } )

最后展示几张xhgui的效果图

 

 

 

 相关学习推荐:PHP编程从入门到精通

위 내용은 xhprof를 사용하여 php7에서 PHP 성능을 테스트하는 방법은 무엇입니까? (방법 소개)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제