문제

방금이 큰 CakePHP 앱 (약 20K 코드)을 얻었습니다. 이는 매우 깨끗하지 않으며 문서가 전혀 없습니다. 이 앱은 생산에서 실행 중이지만 성능에 큰 문제가 있습니다.

서버는 8GB RAM이있는 쿼드 코어이지만 앱은 약 3-4 요청/s 만 제공 할 수 있습니다. 각 요청은 4 개의 CPU의 약 20-30%를 차지합니다.

내가 작은 부하 테스트를 시도 할 때 ab -n 100 -c 10 ..., 평균 응답으로 최대 7000ms까지 올라갑니다. 그러나 나는 800MB 이상의 RAM을 만들지 않았으므로 약간의 조정을 위해 최소 6GB 무료 RAM이 있습니다.

문제는 아직 작업 개발 인스턴스를 만들 수 없었기 때문에 제작에서 조정해야한다는 것입니다.

당신은 무엇을 추천합니까? 쉬운 소스 코드를 너무 많이 파악하지 않고 성능 향상?

도움이 되었습니까?

해결책

1 단계 : 웹 서버가 아닌 응용 프로그램인지 확인하십시오.

케이크 계층 외부에서 간단한 Hello World 파일 만들기

<?php
echo 'Hello World';

그리고 실행하는 데 얼마나 걸리는지보십시오. 때로는 서버/네트워크 수준에서 진행되는 일에 대해 응용 프로그램을 비난하기가 쉽습니다.

가정합니다 test.php 합리적인 시간에 렌더링하고 2 단계로 넘어갑니다.

2 단계 : 모든 것을 백업하십시오

프로덕션 코드를 사용하는 것은 항상 위험한 게임입니다. 시작하기 전에 수리 이상의 것을 손상시키고 전체 케이크 디렉토리 트리를 복사 할 경우 전체 데이터베이스 백업을 수행하십시오. 하루 종일 완료 될 때마다 프로덕션 디렉토리와 사본의 내용 (GUI 도구 또는 명령 줄 사용)을 차단하십시오.

diff -r production-cake copy-of-cake

3 단계 : 데이터베이스는 거의 항상 램프 스택으로 첫 번째 병목 현상입니다.

PHP 응용 프로그램은 특히 사람들이 실제 SQL 쿼리를 숨기는 Activerecord 스타일 모델을 사용하는 경우 많은 SQL 쿼리를 생성합니다. 쿼리를 파일 및/또는 데이터베이스 테이블에 로그인하도록 케이크를 설정하려고합니다. 몇 가지 지침이 있습니다 여기 이를 수행하면 데이터베이스 대신 플랫 파일 및/또는 Syslog에 로그 아웃하는 것이 좋습니다. 데이터베이스에 DB 요청을 로깅하면 페이지로드 당 쿼리 수가 두 배가됩니다.

IP 검사에 추가하여 IP 주소에서 오는 요청 만 로그인하는 것이 좋습니다. 그렇게하면 로깅이 응용 프로그램의 정기적 인 실행을 극적으로 방해하지 않습니다.

이것이 제자리에 있으면 한 번의 요청을 한 다음 생성되는 SQL을보십시오. 성능 향상을 위해 캐싱을 떨어 뜨릴 수있는 장소로 동일한 쿼리를 반복해서 반복하는 것을 찾으십시오. 또한 순차적 쿼리를 찾으십시오

select * from foo where id = 5
select * from foo where id = 6
etc...

이는 누군가가 무대 뒤에서 무슨 일이 일어나고 있는지 이해하지 않고 루프에 모델을로드하는 것을 나타냅니다.

4 단계 : 데이터베이스가 아닌 경우 시스템이 호출됩니다.

데이터베이스가 Yoru 병목 현상이 아니고 PHP/Apache가 제대로 작동하는 경우 다음에 찾을 수있는 것은 IS입니다. 시스템 호출. 껍질을 벗기는 것은 일을 끝내는 빠르고 더러운 방법이지만 매우 비싼 작업입니다. 루프에 한두 가지를 얻으십시오.

운영 top 또는 ps 제작 서버에서 시작 및 중지되는 프로그램을 찾은 다음 해당 명령의 코드 기반을 검색하십시오.

4 단계 : 모든 컨트롤러를 복사하십시오

당신은 많은 컨트롤러를 가질 것입니다

/app/controllers/posts_controller.php
/app/controllers/other_controller.php
etc...

URL에 해당합니다

http://www.example.com/posts/methodName
http://www.example.com/other/methodName
etc...

특정 요청을 디버깅해야 할 때마다 알아 내야합니다. 너무 느립니다. 컨트롤러 사본을 만드십시오.

/app/controllers/debugposts_controller.php

수동으로 요청을합니다

http://www.example.com/debugposts/methodName

그런 다음 컨트롤러 파일에 원하는만큼 디버그/인쇄 문을 던질 수 있습니다. "운이 좋다"라면, 원래 개발자는 아마도 컨트롤러 파일에 많은 논리를 쌓았을 것입니다. 그것이 상황이라면, 당신은 이제 "코드의 절반을 댓글로"게임을 할 수있는 위치에 있습니다.

다른 팁

디버그 레벨을 설정할 수 있습니다 app/config/core.php 그리고 무슨 일이 일어나고 있는지보십시오. 단점은 모든 사용자가 가능하다는 것입니다. 디버깅을 사용하면 느린 쿼리를 쉽게 볼 수 있습니다. 이를 제외하고 SQL 슬로우 쿼리 로그를 켜고 컷오프를 비교적 낮게 설정하십시오 (케이크는 겉보기에 간단한 질문에 대답하기 위해 많은 쿼리를 좋아하기 때문에).

나는 당신이 약간 파고 들지 않을 것이라고 생각합니다. 부하를 일으키는 구성 요소 인 병목 현상을 식별해야합니다. 예를 들어, 색인이 잘되지 않은 MySQL 테이블에 대한 대규모 액세스는 서버를 정말 미쳤을 수 있습니다. 그것이 내 경험에서 성능 문제의 빈번한 이유입니다.

가장 좋은 방법은 디버깅/프로파일 링 환경을 설정하는 것입니다. 그러나 서버의 프로세스 목록은 이미 그러한 긴장을 일으키는 사람에 대한 대략적인 그림을 제공 할 수 있어야합니다. 실제로 PHP 프로세스입니까, 아니면 데이터베이스 활동이 있습니까?

문제는 아직 작업 개발 인스턴스를 만들 수 없다는 것입니다.

이것이 해결해야 할 문제입니다. 해당 앱이 환경에 적절하게 실행되도록하십시오 (예 : 모든 환경 구성이 하나의 파일에 있고 해당 파일에 환경 구성 만 포함되어 있는지 확인하십시오). 이 문제를 해결하면 개발에있는 모든 것을 해킹 할 수 있습니다.

파일 시스템, 메모리 또는 CPU 시험에 묶여 있는지 확인하려면 vmstat 그리고 iostat. 앱의 경우 아직 그렇게하지 않으면 사용하십시오. memcached 또는 APC 속도를 높이기 위해. 또한 설치하십시오 xdebug 코드를 프로파일 링하여 느린 위치를 확인하십시오. 실행 시간이 길고 많은 수의 기능 호출은 항상 비린내입니다. 데이터베이스 인 것으로 나타났습니다. 어쩌면 몇 쿼리에 캐싱을 추가 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top