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


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.