Performans ayarlama CakePHP uygulaması

4 Cevap php

Ben sadece çok temiz değil, bu oldukça büyük CakePHP uygulaması (kod yaklaşık 20k satır), var ve hiç belge yoktur. Uygulama üretimde çalışıyor, ama gerçekten performans ile büyük problemleri var.

Sunucu 8GB RAM ile Quad core olduğunu, ancak uygulaması çok çok kötü olduğunu, sadece yaklaşık 3-4 istekleri / s hizmet edebilir. Her istek dört işlemcilerin yaklaşık% 20-30 alır.

Ben gibi hatta biraz yük testi çalıştığınızda ab -n 100 -c 10 ..., ortalama tepki 7000ms kadar gider. Ancak, 800MB RAM üzerine asla, yani bazı verdiği için en az 6GB RAM ücretsiz var.

Sorun henüz çalışma geliştirme örneği oluşturmak mümkün olmamıştır ki,, bu yüzden üretimde ayarlama yapın var ...

Eğer çok fazla kaynak koduna kazma olmadan, easy performansını arttırmak için ne tavsiye edersiniz?

4 Cevap

Step 1: Make sure it's the application, and not the web server

Kek hiyerarşi dışında, basit bir merhaba dünya dosyası oluşturun

<?php
echo 'Hello World';

Ve bu çalıştırmak için ne kadar uzun sürdüğünü görüyoruz. Bazen sunucu / ağ düzeyinde oluyor şey için uygulamayı suçlamak kolaydır.

Iki adıma geçmek, test.php zaman makul miktarda işler varsayarsak.

Step 2: Back Everything Up

Üretim kodu ile işe yaramaz, her zaman tehlikeli bir oyundur. Eğer tamir edilemeyecek bozuk bir şey durumunda bir tam veritabanı yedekleme yapmak ve bütün pasta dizin ağacını kopyalamak başlamadan önce. Eğer (bir GUI aracı veya komut satırını kullanarak) üretim dizin ve kopya içeriğini diff, günün bitti zaman

diff -r production-cake copy-of-cake

Step 3: The Database is Almost Always your First Bottleneck With the LAMP Stack

PHP uygulamalarında insanlar gerçek SQL sorgulama çok gizler bir ActiveRecord tarzı modelini kullanıyorsanız, özellikle SQL sorguları bir sürü oluşturur. Sen bir dosyaya ve / veya veritabanı tablo sorguları oturum Cake kurmak isteyeceksiniz. Ben yerine veritabanı düz bir dosya ve / veya syslog çıkıyor tavsiye ederim, ancak bunu yaparken bazı talimatlar here, var. Veritabanına DB istekleri açılıyor sayfa yük başına sorgu sayısını iki katına çıkacak.

Sadece IP adresinden gelen istekleri kaydeder bu yüzden ben de bir IP kontrol ekleyerek tavsiye ederim. Bu şekilde önemli ölçüde da günlük uygulamanın normal çalışma ile karışmaz.

Bu yerde bir kez, tek bir istek yapmak ve daha sonra oluşturulan ediliyor SQL bakmak. Bir performans artışı elde etmek için bazı önbelleğe alma bırakabileceğiniz bir yer olarak ve tekrar tekrar tekrarlanan aynı sorguları arayın. Ayrıca sıralı sorguları için bakmak

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

Hangi birisi perde arkasında neler olup bittiğini anlamadan bir döngü içinde modellerini yüklüyor gösterir.

Step 4: If its not the Database, it's System Calls

Veritabanı yoru darboğaz değildir ve PHP / Apache düzgün ise, bakmak için sonraki şey system calls. Bombardımanı halletmek için hızlı ve kirli bir yol, ama onun bir derece pahalı bir işlemdir. Birini veya bir döngü içinde bu iki almak ve sizin için bitti.

Run top veya ps üretim sunucusuna başlangıç ​​ve durdurma programlar için bakmak, daha sonra bu komutları için kod tabanında arama.

Step 4: Copy Every Controller

Sen denetleyicileri bir dizi var gidiyoruz

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

URL'ler karşılık hangi

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

Eğer denetleyici bir kopyasını yapmak, why o kadar yavaş anlamaya belirli bir isteği hata ayıklama için ihtiyaç duyarsan.

/app/controllers/debugposts_controller.php

ve elle talepte

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

Eğer denetleyici dosyasının içine istediğiniz kadar sonra birçok hata ayıklama / yazdırma ifadeleri atabilir. Eğer "şanslı" iseniz, orijinal geliştiriciler muhtemelen denetleyici dosyaları mantık bir çok sıkışmış. Bu durum ise, "yarım kod dışında bir açıklama" oyunu oynamak için bir konumda artık sensin.

Sen app/config/core.php olarak DEBUG düzeyini ayarlamak ve neler olduğunu görebilirsiniz. Dezavantajı böylece tüm kullanıcıların olduğunu. Üzerinde hata ayıklama ile kolayca yavaş sorguları görmek mümkün olacak. (Kek görünüşte basit sorulara cevap için pek çok sorguları yapmak seviyor çünkü) o Kısıtlama, SQL Yavaş Sorgu Girişi açmak ve nispeten düşük cutoff ayarlayın.

Korkarım, biraz kazma etrafında almazsınız düşünüyorum. Sen yük neden olan en azından bileşenleri, darboğaz (ler) tespit etmek gerekir. Örneğin kötü endeksli mySQL tabloları büyük girişler bir sunucu gerçekten çılgın sürücü olabilir. Bu benim deneyim performans sorunları için sık nedenidir.

Yapmak için gerçekten iyi şey bir hata ayıklama / profil ortamı kurmak olacaktır, ancak sunucu süreç listesi size zaten böyle gerginlik neden olan kim kaba bir resim vermek gerekir. Gerçekten PHP süreçler, ya da herhangi bir veritabanı aktivite var mı?

Sorun henüz çalışma geliştirme örneği oluşturmak mümkün olmamıştır ki, bir

Bu çözmek için gereken konudur. Bu app (tüm çevre yapılandırma tek bir dosyada yatıyor emin olun, örneğin, ve bu dosya sadece ortam yapılandırmasını içeren) çevresine agnostically çalışıyor olsun. Bunu çözmek sonra, size geliştirme gibi her şeyi uzakta kesmek olabilir.