2012-07-02 2 views
2

저는 최근에 거의 200 개의 테이블을 다루는 대학을위한 합리적으로 복잡한 데이터베이스 응용 프로그램을 만들었습니다. 일부 테이블 (예 : Publications)은 30 개 이상의 필드를 보유하고 10 개의 일대일 FK 관계 및 최대 2 또는 3 개의 다 대다 FK 관계 (crossreference-ref 테이블 사용)를 저장할 수 있습니다. 처음부터 끝까지 정수 ID를 사용하고 정규화가 모든 단계에서 핵심적인 역할을했습니다. AJAX는 최소한이고 대부분의 페이지는 표준 CRUD 양식/프로세스입니다. Symfony + Doctrine의 성능을 어떻게 향상시킬 수 있습니까?

나는 심포니 1.4, 교리 ORM 1.2, MySQL은, PHP를 사용했다. 개발 시간과 유지 보수의 용이성 혜택 (AN MVC와 ORM을 사용하여) 엄청난되었지만

, 우리는 속도에 문제가 있었어요. 즉, 한 번에 몇 명의 사용자가 로그인하고 활성 상태가되면 응용 프로그램이 느려지 게됩니다 (레코드를 저장하거나 편집하는 데 최대 20 초).

우리는 현재 우리의 시스템 관리자와 토론에 종사하고 있지만 그들은 우리가 충분한 전력을 가져야한다고 말한다. 6 명 이상의 사용자가 작업을 수행하면 가상 서버 환경에서 4 개의 CPU를 대기 상태로 유지하면서 메모리 사용량은 적습니다 (번짐 없음).

물론 우리는 우리의 mySQL 애플리케이션을 멀티 스레딩하는 것을 고려하고 있습니다. (도움이된다면), 우리 코드를 수정하고 (비록 MVC에서 생성 된 것이 많지만) 캐시 사용을 개선합니다. 사용 된 화면의 대다수는 사용자 로그인 특정 및 동적입니다. 우리는 APC, 여분의 메모리, 데이터베이스의 조각 모음을 해 놓았습니다. 모든 레코드 세트를 해제하려고 시도했습니다. (ORM 내에서 자동으로 실행됩니다.)

질문 mSQL, PHP 및 Symfony MVC가 실제로이 크기의 응용 프로그램을 개발하는 데 실제로 좋지 않은지 묻습니다. 그렇다면 사람들은 일반적으로 이러한 종류의 크기/복잡성을 가진 웹 기반 데이터베이스 인터페이스 응용 프로그램에 대해 무엇을 사용하고/권장합니까?

+0

죄송합니다. 아마도 우리의 mySQL 데이터베이스를 다중 채널링했음을 의미 할 것입니다. – user982220

+7

그래서 어떤 프로세스가 리소스를 먹을지 결정 했습니까? 무엇이 메모리와 CPU를 손상시키는 지 보지 않고 최적화하는 것은 의미가 없습니다. 또한 귀하의 질의가 최적임을 보장하는 것은 무엇입니까? 테이블의 수는 아무 것도 아니다. 중요한 것은 데이터의 크기, b-tree의 크기와 메모리 사용량을 결정하는 인덱스 방법 (buffer_pool_size가 충분히 큰 InnoDB를 사용한다고 가정 할 때)이다. 그래서 당신의 질문에 대답하는 것은 어렵고 누구나 무엇이 잘못되었는지를 짐작할 수 있습니다. 그것은 교리 또는 PHP에 대한 책임을 비난하는 것은 너무 일찍, 어느 과정이 먼저 자원을 먹는 지 확인하십시오. –

+0

그렇지 않으면 당신의 시스템에 만족한다면 그것을 척하기 전에 그것을 최적화 할 수있을 것입니다. 많은 요소가 있습니다. 먼저 실행중인 쿼리에 대해 데이터베이스에 적절한 인덱스가 없을 수도 있습니다. 느린 쿼리 로그를 켜고 거기에있는 쿼리를 검사하고 explain 명령을 사용하여 느린 쿼리가 인덱싱되지 않은 검색을 수행하는지 여부를 확인하십시오. 필요에 따라 색인을 추가하십시오. – AllInOne

답변

3

Symfony 나 Doctrine에 대한 경험이 없습니다. 그러나 이러한 프로젝트를 기반으로 구축 된 사이트보다 확실히 큰 사이트가 있습니다. 예를 들어 DailyMotion은 둘 다 사용하며 몇 명의 동시 사용자보다 훨씬 많은 기능을 제공합니다.

마찬가지로, PHP와 MySQL은 위키 백과와 같은 큰 사이트에 사용되는, 그래서 확장 성이 문제가되지 않습니다. (BTW, MySQL은은 연결 당 기본 — 하나의 스레드에 의해 다중 스레드해야한다.) 물론

는 합리적인 성능은 상대적입니다. 클로짓에 앉아있는 베이지 색 상자에서 200 개의 동시 요청을 처리하는 사이트를 실행하려는 경우 자신의 데이터 센터가있는 포춘지 500 대 기업보다 훨씬 많은 코드를 최적화해야 할 수도 있습니다.

실제로해야 할 일은 애플리케이션을 프로파일 링하여 병목 현상이 어디에 있는지 확인하는 것입니다. MySQL 쿼리를 프로파일 링하는 것은 매우 간단하며 PHP profiling tools과 같은 정보도 있습니다. Xdebug과 같습니다. 여기에서 프레임 워크, ORM (orm ORM 모두), 데이터베이스 또는 리팩토링 코드를 전환해야하는지 아니면 더 많은 처리 능력에 투자해야하는지 파악할 수 있습니다.

+0

고맙습니다,리스. 이것은 매우 도움이됩니다. 이 스케일에서 무엇인가를 구축 한 것은 이번이 처음이며 병목 현상이 소프트웨어 (PHP, ORM 또는 mySQL) 또는 하드웨어 (서버)인지는 확실하지 않습니다. – user982220

+1

이제 devc 서버에 kcachegrind를 설치하려고합니다. 트릭을해야하는 것 같습니다. – user982220

1

복잡한 데이터베이스 작업 속도를 높이려면 데이터베이스를 호출하지 않는 것이 가장 좋습니다.

그래서 캐시 할 수있는 응용 프로그램의 부분을 분석하십시오.
심포니는 심포니 2에서 꽤 잘 캐싱하는 시스템을 가지고 있습니다. 데이터베이스 측에서는

다른 방법은 집계 된 데이터를 저장하는 플레이 또는 중첩 된 집합을 사용하는 것이다.
이 부분이 적절한 부분을 찾으십시오.

+0

감사합니다, ivoba. 나는 일반적으로 캐싱에 관해서 그렇게 생각하지 않는다. 그것을 더 볼 시간. Symfony 문서가이 문서의 가장 좋은 소스라고 생각합니다. – user982220

관련 문제