programing

PHP 코드의 속도가 느려지는 위치를 확인합니다(성능 문제).

cafebook 2023. 10. 10. 20:57
반응형

PHP 코드의 속도가 느려지는 위치를 확인합니다(성능 문제).

SO에서의 첫 번째 질문입니다.

최근에 유지를 요청받은 회사 내부 지원서가 있습니다.응용프로그램은 PHP로 구축되어 있으며 WTF-ish가 아닌 상당히 잘 코딩된(OO, OO, DB Abstraction, Smarty).

문제는 응용 프로그램이 매우 느리다는 것입니다.

애플리케이션의 속도를 늦추는 원인을 파악하려면 어떻게 해야 합니까?저는 DB 쿼리를 거의 만들지 못하도록 코드를 최적화했기 때문에 실행에 시간이 걸리는 PHP 코드인 것으로 알고 있습니다.나는 이것을 도와줄 수 있는 몇 가지 도구를 구해야 하고 내 코드를 확인하는 전략을 고안해야 합니다.

제가 직접 점검/전략 작업을 할 수는 있지만, 제 앱이 어디서 망가지는지 알아내려면 PHP 도구가 더 필요합니다.

생각은?

최근 XDebug 프로파일링을 사용한 적이 있습니다.많은 일반 프로파일링 앱에서 읽을 수 있는 전체 프로파일 보고서를 출력합니다(리스트를 제공할 수는 없지만 슬랙웨어와 함께 제공된 목록을 사용했습니다).

Juan이 언급했듯이 xDebug는 훌륭합니다.Windows(윈도우)를 사용하는 경우 WinCacheGrind(윈캐시그린드)를 통해 보고서를 검토할 수 있습니다.

Rasmus Lerdorf(PHP 제작자)의 이 프레젠테이션을 보십시오.그는 PHP 속도와 무엇을 찾아야 하는지 테스트하는 몇 가지 좋은 예와 일의 속도를 늦출 수 있는 내부 사례를 살펴봅니다.XDebug은 그가 사용하는 도구 중 하나입니다.또한 프레임워크를 사용할 때 어떤 성능 비용이 발생하는지에 대해서도 확실히 알고 있습니다.

비디오: http://www.archive.org/details/simple_is_hard

슬라이드 (영상에서 보기 어려우니) : http://talks.php.net/show/drupal08/1

응용프로그램의 성능에 영향을 미칠 수 있는 여러 변수가 있습니다.즉시 PHP가 문제라고 생각하지 말 것을 권합니다.

첫째, PHP는 어떻게 서비스하고 있습니까?Apache나 IIS 자체의 기본적인 최적화를 시도해 보셨습니까?서버가 다른 종류의 요청을 처리하느라 바쁜가요?당신은 PHP 코드 가속기를 이용해 본 적이 있습니까?서버가 병목현상인지 테스트하는 한 가지 방법은 다른 서버에서 응용프로그램을 실행해 보는 것입니다.

둘째, 전체 애플리케이션의 성능이 느린가요, 아니면 특정 페이지에만 영향을 미치는가요?이를 통해 성능 분석을 시작할 위치를 알 수 있습니다.전체 애플리케이션 속도가 느릴 경우 기본 서버/플랫폼이나 모든 요청(예: 사용자 인증)의 일부인 글로벌 SQL 쿼리에서 문제가 발생할 가능성이 높습니다.

셋째, SQL 질의의 수를 최소화하는 것을 말씀하셨는데, 기존 질의를 최적화하는 것은 어떻습니까?MySQL을 사용하는 경우 각 스토리지 시스템의 다양한 장점을 활용하고 있습니까?가장 중요한 쿼리에 대해 설명을 실행하여 제대로 색인이 되어 있는지 확인했습니까?이는 큰 테이블에 액세스하는 쿼리에서 매우 중요합니다. 데이터 세트가 클수록 색인이 좋지 않은 영향을 더 많이 알 수 있습니다.다행히도 EXPROFENT 사용법을 설명하는 글들이 많이 있습니다.

넷째, 일반적인 실수는 데이터베이스 서버가 시스템에 사용 가능한 모든 리소스를 자동으로 사용한다고 가정하는 것입니다.데이터베이스 응용프로그램에 충분한 리소스를 명시적으로 할당했는지 확인해야 합니다.예를 들어 MySQL에서는 키 버퍼, 임시 테이블 크기, 스레드 동시성, innodb 버퍼 풀 크기 등에 대한 사용자 지정 설정(my.cnf 파일에 있음)을 추가할 수 있습니다.

위의 모든 것을 다시 확인했지만 여전히 병목 현상을 찾을 수 없다면 Xdebug와 같은 코드 프로파일러가 분명히 도움이 될 수 있습니다.개인적으로 젠드 스튜디오 프로파일러를 선호하지만, 이미 젠드 플랫폼 스택의 나머지 부분을 활용하지 않는 한 최적의 옵션은 아닐 수 있습니다.하지만 제 경험으로는 PHP 자체가 느린 성능의 근본 원인이라는 것은 매우 드문 일입니다.코드 프로파일러를 사용하면 어떤 DB 쿼리의 책임인지 보다 정확하게 판단할 수 있습니다.

APD(Advanced PHP Debugger)를 사용할 수도 있습니다.

그것을 작동시키는 것은 꽤 쉽습니다.

$ php apd-test.php

$ pprofp -l pprof.SOME_PID

Trace for /Users/martin/develop/php/apd-test/apd-test.php
Total Elapsed Time = 0.12
Total System Time  = 0.01
Total User Time    = 0.07


         Real         User        System             secs/    cumm
%Time (excl/cumm)  (excl/cumm)  (excl/cumm) Calls    call    s/call  Memory Usage Name
--------------------------------------------------------------------------------------
71.3 0.06 0.06  0.05 0.05  0.01 0.01  10000  0.0000   0.0000            0 in_array
27.3 0.02 0.09  0.02 0.07  0.00 0.01  10000  0.0000   0.0000            0 my_test_function
 1.5 0.03 0.03  0.00 0.00  0.00 0.00      1  0.0000   0.0000            0 apd_set_pprof_trace
 0.0 0.00 0.12  0.00 0.07  0.00 0.01      1  0.0000   0.0000            0 main

APD를 컴파일하고 이를 사용하여 프로파일링을 수행하는 좋은 튜토리얼이 있습니다. http://martinsikora.com/compiling-apd-for-php-54

phpED(http://www.nusphere.com/products/phped.htm) 는 또한 훌륭한 디버깅과 프로파일링, PHP 코드에 시계, 중단점 등을 추가하는 기능을 제공합니다.통합 프로파일러는 IDE 내에서 각 함수 호출 및 클래스 방법에 대한 시간 내역을 직접 제공합니다. 브라우저 플러그인은 Firefox 또는 IE와의 빠른 통합도 가능합니다(즉, 브라우저로 느린 URL을 방문한 후, 프로파일링 또는 디버그를 위해 버튼을 클릭).

대부분의 코딩 작업을 집중하기 위해 앱 속도가 느린 위치를 지적하는 데 매우 유용했으며 이미 빠른 코드를 최적화하는 데 시간을 낭비하지 않습니다.젠드와 이클립스를 사용해 본 결과 pphED의 사용 편의성에 대해 판매하게 되었습니다.

Xdebug와 phpED(DBG 포함)는 웹 서버에 대한 디버깅을 수행할 때 추가 PHP 모듈을 설치해야 합니다.phpED는 로컬 디버깅 옵션도 제공합니다(저는 시도하지 않았습니다).

Xdebug 프로필은 확실히 가야 할 길입니다.또 다른 팁 - Wincache Grind는 좋지만 최근에 업데이트되지 않았습니다.http://code.google.com/p/webgrind/ - 브라우저에서 쉽고 빠른 대안이 될 수 있습니다.

하지만 가능성은 여전히 데이터베이스에 있습니다.관련 인덱스를 확인하고 작업 데이터를 최대한 많이 캐시할 수 있는 충분한 메모리를 가지고 있는지 확인합니다.

만약 그것이 큰 코드 베이스라면 당신이 아직 아니라면 apc를 시도해보세요.

http://pecl.php.net/package/APC

당신은 또한 php.의 register_tick_function 함수를 사용해 볼 수 있습니다. 이것은 php가 당신의 코드 전체에 걸쳐 주기적으로 특정 함수를 호출하도록 지시합니다.그런 다음 현재 실행 중인 기능과 통화 간의 시간을 추적할 수 있습니다.시간이 많이 걸리는 걸 알 수 있을 겁니다http://www.php.net/register_tick_function

우리는 젠드 개발 환경(window)을 사용합니다.어제 프로세스 탐색기를 실행하는 동안 디버거를 통해 메모리/cpu/disk 작업을 모니터링하여 각 라인이 실행되는 동안 메모리 사용량이 급증하는 현상을 해결했습니다.

프로세스 탐색기: http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx .

ZDE에는 페이지 요청 중에 각 함수 호출에 소요된 시간을 보여줄 수 있는 기본 성능 프로파일러가 포함되어 있습니다.

PEAR Benchmarklog4php를 조합하여 사용합니다.

프로파일링할 스크립트의 맨 위에서 Benchmark_Timer 개체를 감싸는 개체를 만듭니다.코드 전체에 걸쳐, 나는 추가합니다.$object->setMarker("name");특히 용의자 코드를 둘러싼 전화들입니다

wrapper 클래스는 logging 정보를 가져와 log4php에 쓰는 destroy 메서드가 있습니다.일반적으로 syslog(많은 서버, 하나의 서버에 있는 하나의 로그 파일로 집계)로 전송합니다.

디버그에서는 로그 파일을 보고 개선해야 할 부분을 확인할 수 있습니다.나중에 생산 과정에서 로그 파일을 파싱하고 성능 분석을 할 수 있습니다.

xdebug는 아니지만 항상 켜져 있고 코드의 실행 두 가지를 비교할 수 있는 기능을 제공합니다.

또한 서버 성능 저하가 애플리케이션 처리 속도 저하의 원인인 경우 HA Proxy 또는 기타 로드 밸런싱 솔루션을 살펴볼 수 있습니다.

언급URL : https://stackoverflow.com/questions/55720/find-out-where-your-php-code-is-slowing-down-performance-issue

반응형