성능 최적화를 위해 모델 계층의 어떤 부분을 무시할 수 있습니까?


28

현재 매우 간단한 스키마 (약 5 개의 필드)가있는 데이터베이스 테이블의 경우 로컬 개발 환경 (SSD 드라이브)에서 초당 50 회 미만의 삽입 속도로 새 레코드를 삽입하고 있음을 알았습니다. 연관된 테이블을 채우는 모델에는 관찰자가 없습니다.

직접 SQL을 사용하면 ~ 1800 삽입 / 초가 크게 향상되었습니다. 우리는 모델의 성능을 최적화하려고 시도하고 있지만, 물론 Magento 코어가 제공하는 훌륭한 안정성과 유연성을 모두 잃고 싶지는 않습니다.

누군가이 경로를 이전에 사용했는지 여부와 모델 레이어의 구성 요소 측면에서 비교적 안전하게 우회 할 수있는 성능이 크게 향상되는지 여부에 대해 궁금합니다.

같은 것들:

  • 클래스 이름 확인
  • 저장 이벤트 전후
  • 이벤트 파견
  • 업무
  • 기타

업데이트 : 실제로 관찰자 또는 afterSave ()에서 추가 쿼리가 발생하여 데이터베이스 쿼리 로그를 검사 할 때 보았습니다. 완전히 간단한 엔티티에 대한 벤치마킹은 실제로 Magento 모델에서 초당 300 행을 제공합니다-MySQL 오버 헤드 만 트랜잭션입니다.


1
모델 객체를 재사용하여 데이터를 쓰려고 했습니까? 즉, 그것을 지우고 setData를 저장하십시오. 이것은 getModel 호출과 PHP 고유의 객체 인스턴스화 오버 헤드를 피할 것입니다.
davidalger

또한 여기에 병목 현상이 드라이브가 아닌 CPU에 있다고 생각합니다. 필요한 모든 코드 파일이 첫 번째 통과시로드되므로.
davidalger

고마워, 데이빗! 나는 그것을 시도 할 것이다. 실제로 나는 우리가 여전히 실행중인 쿼리의 수에 따라 I / O에 구속되어 있다고 생각합니다. 주어진 모델 저장에 대해 실행중인 약 20 개의 쿼리가 있습니다.이 중 일부는 유지해야합니다 (관련 테이블 채우기, 저장 전에 존재를 확인하기위한 SELECT). ()는 응용 로직에서 피할 수 있습니다)
kalenjordan

쉽게 찾을 수 있습니다. 전체 루트 디렉토리와 MySQL DB를 RAM 디스크에 마운트하십시오. 그러나 나는 것 강하게 I / O는 서버 수준의 장비에 문제가 의심한다. 아마도 "저장시 인덱스"를 비활성화하는 것만으로도 더 많은 이점을 보게 될 것입니다.
Ben Lessani-Sonassi

답변:


17

전체 사이트의 속도를 높일 수있는 한 가지는 Varien_Profiler프로덕션 사이트에서 모든 참조를 제거하는 것 입니다. 프로파일 러가 비활성화되어 있어도 항상 활성화되어 있는지 확인하여 호출 할 때마다 Varien_Profiler::추가 if명령문이 생성됩니다. 물론 이러한 통화를 모두 제거하면 더 이상 프로파일 러를 사용할 수 없게됩니다. 그러나 이로 인해 전체 사이트 속도가 5 % 정도 빨라질 수 있습니다 (주관적인 eperience이지만 Varien_ProfilerMagento 전역에 대한 많은 호출이 있습니다 ). 실제로 모든 파일에서 이러한 호출을 자동으로 주석 처리하는 작은 쉘 스크립트를 작성했으며 내일 직장에서 코드를 준비 할 때 내 게시물에 추가 할 것입니다.

약속했듯이 코드는 이러한 호출을 주석 처리합니다.

grep -l "Varien_Profiler" * -R > profiler.txt 
for x in `cat profiler.txt` 
do 
sed -i '/Varien_Profiler/s/^/\/\//' $x
done

이것은 lib / 폴더뿐만 아니라 app /에서도 리눅스 콘솔에서 실행되어야합니다. 나중에 /lib/Varien/Profiler.php 파일을 수동으로 조정해야 할 수도 있습니다. 또한 라이브 환경을 만들기 전에 안전한 환경에서 철저히 테스트해야합니다.


와우! 비활성화 된 경우 Varien_Profiler 호출에 대해서만 5 %에 ​​가까운 것을 상상하지 못했습니다. 감사합니다!
kalenjordan

@sparcksoft 약속 한대로 지금 코드를 추가했습니다.
mpaepper

1
그것이 바로 C 프리 컴파일러 조건 이 정말 좋은 곳입니다. PHP에는 그것들이 없기 때문에 너무 나쁘지만, 물론 그것은 내장 된 사전 컴파일 및 캐싱 방법을 가지고 있어야한다는 것을 의미합니다. :)
davidalger

2
find . -type f -exec grep -qF 'Varien_Profiler' {} \; -exec sed -i '/Varien_Profiler/d' {} \;빠른 oneliner를 선호한다면 그것을 쓸 수도 있습니다 .
kojiro

14

Magento 모델에서 많은 저장을 실행할 때 Magento 인덱서를 비활성화하여 프로세스 속도를 저하시키는 것이 가장 좋습니다.

$processes = Mage::getSingleton('index/indexer')->getProcessesCollection();
$processes->walk('setMode', array(Mage_Index_Model_Process::MODE_MANUAL));
$processes->walk('save');

그리고 당신이 할 때 그것을 활성화 :

$processes->walk('setMode', array(Mage_Index_Model_Process::MODE_REAL_TIME));
$processes->walk('save');

아 알았어 많은 customer_entity 레코드를 저장하고 각 저장마다 고객 인덱싱이 발생하는 것을 피하고 싶습니까? 내 경우에는 실제로 인덱싱이없는 사용자 지정 엔터티에 대해 실제로이 작업을 수행하고 있습니다. 우리는 아마이 팁을 사용할 몇 가지 맞춤 색인을 가지고 있습니다!
kalenjordan

고객 인덱싱이 없다고 생각하지만 많은 제품 등을 수정할 때 도움이 될 것입니다. 어느 쪽이든 시도해 볼 가치가 있습니다!
Rick Kuipers

예, EAV 제품 데이터 등이 죄송합니다. 감사.
kalenjordan

이봐! 그 후에 (부분적으로) 색인을 다시 작성해야 할 수도 있습니까?
Alex

@Alex 예, 인덱서는 MODE_REAL_TIME으로 재설정되므로 일정에 따라 다시 인덱싱됩니다. 물론 원한다면 강요 할 수도 있습니다.
Rick Kuipers
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.