Performans optimizasyonu için model katmanının hangi kısımları atlanabilir?


28

Şu anda çok basit bir şemaya sahip bir veritabanı tablosu için (yaklaşık 5 alan), yerel geliştirme ortamımda (SSD sürücüsü) ~ 50 ek / saniyenin hemen altında yeni kayıtlar ekliyor - bu Modelde ilgili tabloları doldururken gözlemci yok.

Doğrudan SQL kullanarak oldukça bir gelişme görüyorum - ~ 1800 ekler / saniye. Modellerimizin performansını optimize etmeye çalışmayı düşünüyoruz, ancak elbette Magento çekirdeğinin bize sunduğu tüm güzel stabiliteyi ve esnekliği kaybetmek istemiyoruz.

Birinin daha önce bu rotaya gidip gitmediğini ve model katmanının bileşenleri açısından nispeten daha güvenli bir şekilde atlanabilecek önemli kazanımlar olup olmadığını merak ediyorum.

Gibi şeyler:

  • Sınıf adı çözünürlüğü
  • olayları kaydetmeden önce ve sonra
  • Etkinlik gönderilir
  • işlemler
  • vb.

GÜNCELLEME: Yalan söyledim, aslında gözlemcilerden çıkan bazı sorgulamalar vardı ya da veritabanı sorgu günlüğünü incelediğimde gördükten sonra Save () 'den sonra. Tamamen basit bir varlığa karşı kıyaslama aslında Magento modellerinde bana ~ 300 satır / saniye veriyor - yalnızca MySQL yükü işlemdir.


1
Verileri yazmak için model nesnesini yeniden kullanmayı denediniz mi? Yani, temizleyin, SetData ve sonra kaydedin. Bu, PHP'ye özgü getModel çağrıları ve genel amaçlı nesne başlatmayı önler.
davidalger

Ayrıca, buradaki tıkanıklığın CPU'nuzda olduğunu ve sürücünün değil, gerekli tüm kod dosyalarının ilk geçişte yükleneceği tahmin edilmektedir.
davidalger

Sağol David! Bunu da deneyeceğim. Aslında, halen yürütülen G / Ç işlemlerinin sayısına bağlı olduğumuzu düşünüyorum. Belirli bir model tasarrufu için çalışan yaklaşık 20 sorgumuz var - bunlardan bazılarını tutmamız gerekiyor (ilişkili tabloları doldurma, kaydetmeden önce varlığı kontrol etmek için SELECT'leri) ve muhtemelen kaldırabileceğimiz diğerlerini (yabancı oturum tasarrufu, ek yük () uygulama mantığından kaçınılabilir)
kalenjordan

Kolayca öğrenebilirsin. Tüm root dir ve MySQL DB'yi bir RAM diskine takın. Ancak, G / Ç'nin sunucu sınıfı ekipmanlarda bir sorun olduğuna kesinlikle kuşku duymam. Muhtemelen, yalnızca "Tasarruf İndeksi" ni devre dışı bırakmanın yararlarını göreceksiniz.
Ben Lessani - Sonassi,

Yanıtlar:


17

Tüm siteyi hızlandırabilecek bir şey Varien_Profiler, üretim sitenizdeki tüm referansları kaldırmaktır . Profil oluşturucu devre dışı bırakılsa bile, her zaman etkinleştirilip etkinleştirilmediğini kontrol eder, böylece her çağrı için Varien_Profiler::ek bir ififade verilir. Elbette, tüm bu çağrıları kaldırmak, profilleyiciyi artık kullanamamaktan kaynaklanıyor. Ancak bu, sitenin tamamını% 5 veya daha fazla hızlandırabilir (bu öznel bir deneyimdir, ancak Varien_ProfilerMagento'nun her yerine ÇOK çağrıları vardır ). Aslında tüm dosyalarda bu çağrıları otomatik olarak yorumlamak için küçük bir kabuk betiği yazdım ve işteyken işteyken kodumu hazır hale getirdiğimde bu yazıya ekleyeceğim.

Söz verdiğim gibi bu çağrıları yorumlayacak kod:

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

Bu hem app / hem de lib / klasöründeki linux konsolunda çalıştırılmalıdır. /Lib/Varien/Profiler.php dosyasını daha sonra manuel olarak ayarlamanız gerekebilir. Ayrıca, canlı çekmeden önce bunu güvenli bir ortamda iyice test etmeniz gerektiğini unutmayın - ama bunun açık olması gerektiğini düşünüyorum;)


Vaov! Devre dışı bırakıldığında sadece Varien_Profiler çağrıları için% 5'e yakın bir şey hayal bile edemezdim. Bunu kontrol edeceğim, teşekkürler!
kalenjordan

@ sparcksoft Söz verdiğim gibi, kodu şimdi ekledim.
Ocak'ta mpaepper

1
C ön derleyici koşullarının gerçekten iyi olduğu yer burasıdır . PHP'nin bunlara sahip olmaması çok kötü, ama elbette bu, kendi ön derleme ve önbellekleme yerleşik yöntemine sahip olması gerektiği anlamına geliyor. :)
davidalger

2
find . -type f -exec grep -qF 'Varien_Profiler' {} \; -exec sed -i '/Varien_Profiler/d' {} \;Hızlı bir seçiciyi tercih ediyorsanız da yazabilirsiniz .
kojiro

14

Magento modellerinde çok fazla tasarruf yaparken, işlemi yavaşlatan Magento indeksleyiciyi devre dışı bırakmak en iyisidir:

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

Ve bittiğinde bunu mümkün kılmak:

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

Ah anladım, güzel. Yani çok fazla customer_entity kaydını kurtarıyor olsaydınız ve her bir tasarruf için müşteri endekslemesini önlemek ister miydiniz? Benim durumumda aslında bunu indekslemesi olmayan özel bir varlığa karşı yapıyorum - en azından yaptığım kriter için. Bu ipucunu muhtemelen kullanacağım bazı özel indeksler de var!
kalenjordan

Herhangi bir müşteri endeksleme olduğunu sanmıyorum, ancak birçok ürünü değiştirirken size yardımcı olacaktır. Her iki durumda da denemeye değer!
Rick Kuipers

Üzgünüz, evet EAV ürün verisi ve bunun gibi. Teşekkürler.
kalenjordan

Hey! Bundan sonra (kısmen) reindex yapmak zorunda kalabilirsiniz?
Alex

@Alex Evet, indeksleyiciler MODE_REAL_TIME olarak sıfırlanır, böylece programa göre yeniden indekslenir. Tabii ki istersen zorlayabilirsin.
Rick Kuipers
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.