PHP, MySQL topluluk sitesi performansını optimize

5 Cevap php

Ben yaklaşık 12.000 kullanıcı (ağır yazma), 1Gb'dan tek bir VPS 100 eşzamanlı kullanıcıların maksimum bir topluluk web sitesi sahibi. Yük nadiren 3 yukarıda gider ve yanıt oldukça iyidir.

Şu anda basit bir dosya önbellek DB üzerindeki yükü hafifletmek için DB sorgu sonuçlarını saklamak için, ama web sitesi hala 220 eşzamanlı kullanıcılar (yük testi) üzerinde yavaşlatabilir kullanılır.

Nasıl darboğaz ne öğrenebilirim?

Ben önbellek iyi çalışıyor gibi DB ince olduğunu varsayalım, ancak Disk IO soruna neden olabilir. Her pageload yaklaşık 10 olan içerir ve DB veya dosya önbelleği, artı php işleme sürü 10-20 querys.

Ben memcache yerine dosya önbelleğini kullanarak çalıştı, ama benim sürpriz yük testi dosya önbelleği daha fazla gibi görünüyordu.

Ben Alternatif PHP Cache kullanmayı planlıyorsanız, ama ben yine de gerçekten bu önbellek geçersiz nasıl anlamıyorum. Ben tüm istekleri işleyen bir ateşten index.php var. Önbellek her istek için sonucu saklayacak? Sesimin bir değişim (önbellek veya sorgu sonucu) içeriyorsa otomatik önbelleğini temizleyin olacak?

Darboğazları bulmak için başka öneriler (XDebug denedim)?

Thanks, Hamlet

5 Cevap

I plan to use Alternative PHP Cache, but I still don't really understand how that cache is invalidated. I have a singe index.php that handles all requests. Will the cache store the result for each individual request? Will it clear the cache automatically if one of my includes (or query result from cache) change?

APC çıktı önbelleğe almaz. Bu derlenmiş bayt kodu önbelleğe alır.

Esasen, normal bir PHP isteği bu gibi görünüyor:

  1. PHP dosyaları baytkoduna ayrıştırılır ve derlenir
  2. PHP yorumlayıcı bayt kodunu çalıştırır

APC ilk adım sonucunu önbelleğe alır, böylece tekrar tekrar aynı kodu recompiling / yeniden çözümlenerek değildir. Böylece kod herhangi bir değişiklik otomatik olarak önbelleğe alınmış kopyasını geçersiz olacak - Varsayılan olarak, hala stat() kendi önbelleğe alınan kopya derlenmiş yana dosyanın değiştirilmiş olup olmadığını görmek için, her istek üzerine PHP dosyaları var.

Eğer memcached kullanmak istiyorum gibi siz de keyfi kullanıcı verilerini depolamak için çok APC kullanabilirsiniz. Ancak, aklınızda bulunsun:

  1. Bir memcached sunucu birden sunucularına veri hizmet edebilir; APC önbelleğe alınan veriler sadece gerçekten lokal olarak kullanılabilir. Daha iyi her bir sunucuda APC verilerin bu konser 4 kopyalarını daha, dört sunucularına bir memcached kutusundan veri konser hizmet etmek.
  2. Memcached, benim deneyim, tek bir önbellek anahtarının eşzamanlı yazma sayıda işleme daha iyidir.
  3. APC önbellek dolduruyor ile çok iyi başa görünmüyor. Parçalanma artar ve performans düşer.

Ayrıca, dikkat: Eğer kilitleme mekanizması çeşit kurdum sürece, dosya tabanlı önbellek nedeniyle eşzamanlı yazma bozuk hale gelebilecektir. Eğer kilitlemeyi hayata varsa, o kendi başına bir darboğaz haline gelebilir. IMO, eşzamanlılık zor - memcached / APC / veritabanı anlaşma onunla edelim.

Yapmanız mümkün değil ne oldu - Eğer kullandığınız XDebug bahsetti? Tipik olarak, bir istek profil etkinleştirin ve ardından KCacheGrind veya WinCacheGrind yılında çıkan "cachegrind" dosyayı görüntülemek darboğaz aşağı izlemeye başlamak için.

Bir önbellek sistemi kullanarak gelince, sizinki gibi bir dinamik script genellikle böyle bir şey yapacak

  • script benzersiz girişlerden bir önbellek "anahtar" inşa
  • bu anahtar için veri varsa önbellek sistemi isteyin. Varsa, gitmek için iyi bir konum!
  • Aksi takdirde, veri oluşturmak için tüm zor işleri yapmak ve gelecek zaman için istenen anahtarının altında saklamak için önbellek sistemi isteyin.

APC Cache PHP kod çözümlü sürümünü önbelleğe alarak başka şeyler hızlandırmak için yardımcı olabilir.

MySQL kendi sorgu önbelleği vardır.

Sen query_cache_size daha fazla ayarlayarak bunu etkinleştirebilirsiniz 0.

Sorgu aynen tekrarlanır ve non-deterministik fonksiyonları, oturum değişkenleri ve diğer bazı şeyler anlatmak gibi bazı şeyler içermiyorsa Sorgu sonuçları önbellekten alınır here:

Bir sorgu için önbellek yatan sorguları herhangi birine karşı herhangi bir DML çalışmasını yayımlayarak tarafından geçersiz.

Ben açık ve APC ile yapılandırılmış test sunucusu üzerinde ve yaklaşık% 400 bir performans artışı var

Tepki süresi 1,4 saniye max :) bir başlangıç ​​için iyi 300 eşzamanlı kullanıcılar.


Güncelleme:

Live sunucu test sonuçları

Orijinal:

No APC: 220 eşzamanlı kullanıcılar, sunucu yük 20, tepki süresi 5000ms

No APC: 250 eşzamanlı kullanıcılar, sunucu yük 20 +, site kullanılamıyor

Yeni:

APC enabled: 250 eşzamanlı kullanıcılar, sunucu yük 2, tepki süresi 600ms olduğunu

APC enabled: 350 eşzamanlı kullanıcılar, sunucu yük 10, tepki süresi 1500ms olduğunu

APC enabled: 500 eşzamanlı kullanıcılar, sunucu yük 20, tepki 5000ms + site tamamen operasyonel, ama biraz yavaş ama normal olarak kullanılabilir

Öneriler için teşekkürler, bu oldukça büyük bir gelişmedir.

Site böylece önbellek bütün tablolar için sürekli geçersiz olacaktır ağır yazmak gibi sorgu önbellek devre dışı bırakılır.

Ben bir "VPS" tam olarak ne olduğunu bilmiyorum, bu sizin veritabanı GÇ bağlı olduğu olasılıkla olduğunu söylüyorlar, ama bu VM çeşit ise, o zaman çok kötü IO sahne neredeyse garantili orada olacaktır.

Kısa sürede gerçek donanım onu ​​alın; ve (1G küçük; 16G daha makul geliyor) ram mantıklı bir miktar olsun.

Sonra ayar db düzgün davranmaya böylece mümkün olabilir. Toplam veri ne kadar büyük? Eğer veritabanı önbellek (değil tehlikeli sorgu önbellek, uygun InnoDB ara bellek havuzuna biri), uyum (bunların çoğu ya) hepsini alabilirsiniz Eğer o zaman bunu.

Ben innodb motorunu kullanarak varsayarak yaşıyorum; Eğer (! Hayır, gerçekten), yeterli ram var Yapmanız kadar fazla almayın eğer - eğer öyleyse, sonra tüm veriler için yeterince büyük olması için tampon havuzu kurmak.

Sonra db sorguları onlar (evet) oldukça kötü olsa bile hızlı olmalıdır.

Web sunucusu (Apache varsayıyorum), sen prefork ve MaxClients yönergesi çok kullanırsanız, özellikle ram yükleri kadar kullanabilir ve mahrum olabilir - zor bit nasıl MySQL ve PHP arasındaki ram kullanımını bölmek için tek bir makine varsa, bir Lütfen bunu veritabanı.

Işte bazı iyi izleme (gidişli) alın ve dikkatli değişiklik yapmak ve bunları yaparken tam olarak kaydedebilir.