Tek bir sunucu site veri önbelleğe alma için APC vs memcache

6 Cevap php

Ben günde 200k unqiues iterek tek bir sunucu sitesi thats var ve trafik (zaten son 5 aydır) kabaca her 40 günde iki katına çıkar.

Ben hemen hemen sadece bir saat ya da öylesine için mysql_query fonksiyonların çıkış önbelleğe planlıyoruz. Önbellek daha eski ise, koşmak sorgu, bir saat için önbelleğe geri sonucu koydu.

Benim mysql DB boyutu 200 mb (belki 10-20mb/month yetişir) ilgili.

HTML çıkışları yazma ve birkaç dakika için onları kullanarak ve daha sonra html yenileyici tarafından dosya önbelleği bir sürü yapıyor Im.

Ne yazık ki, pek çok sıralama için izin veren bir veritabanı sitesi, arama ve yöntemlerinin yanı sıra sayfalamayı sipariş beri .... 150.000 'den fazla önbelleğe sayfaları vardır. Im de yükün en çok neden arama sorgularını, önbelleğe değil.

Ben bir önbellek sistemi uygulamak istiyorum, ve ben bir hızlı olduğunu bilmek istiyordu. Bazı kriterler görmek isterdim.

6 Cevap

Google APC Memcached 5 kat daha hızlı olduğunu söylemek, benim deneyim .. APC yaklaşık 7-8 kat daha hızlı Memcached fazla olduğunu söylüyorlar ama, memcanched (farklı servisler tarafından erişilebilir örneğin, apache ve delegeler bazı trafik esas çalıştırırsanız , lighttpd gibi başka bir web hizmeti) görüntüleri ya da saf html gibi örneğin statik içeriği, o, gerçekten yararlı vazgeçilmez değilse olabilir.

APC memcached daha az özelliğe sahip, kullanımı ve optimize tefriş, ama bu sizin ihtiyaçlarınıza bağlıdır.

Bahsettiğiniz gibi önbelleğe birkaç farklı yönleri vardır. Ben muhtemelen php app önbelleğe aşağıdaki yönleri üzerinde durulacak:

  • opcode caching which caches the compiled bytecode of php scripts. You can see a benchmark here (albeit an older article): http://itst.net/654-php-on-fire-three-opcode-caches-compared Note: I strongly recommend using opcode caching.

  • Önbelleğe alma kullanıcı verileri - APC ve diğerleri bunu. Bu referans verileri ya da oldukça statik ve genellikle değişmez veri olacaktır. Bu referans veri değişiklikleri, temiz bir önbellek her gün önbelleğini temizleyin veya tetikleyebilir. Genellikle veri sık kullanılan ve genellikle değişmez referans çünkü bu da şiddetle tavsiye edilir.

  • Sql sorguları önbelleğe - Ben Zend basit bir kurulum ile bu görevi kolaylaştırır biliyoruz. Bu sorgular değişmez beri (Bahsettiğiniz gibi) bu başka belirgin olanıdır

Ek (eğer mümkünse):

  • önbelleğe alma html sayfaları - Açıkçası statik bir sayfa önbelleğe oluşturulan bir daha hızlıdır ve uygulamalar çoğu sayfaları bu kadar dinamik olduğundan, genellikle bunu yapmak zordur. Lütfen sorguları önbelleğe ve SQL basit eğer ben bu odaklanmak olmaz, ancak bunu eğer buna değer.

  • önbelleğe alma sql sonuçları - ben şahsen bu uzakta kalmak. Ben veritabanı çalışmalarını ve ne DBMS genellikle önbelleğe beri en iyi yaptığı yapsın. Ben (yani, ben sadece bu yüzden tekrar yapmayın alınan) yürütme iş parçacığı için sonuçları önbelleğe olabilir ama ben o kadar öteye gitmez.

Ben başarılı bir APC ve eaccelerator kullandım (Ben şahsen APC ile çalışmak ister ve opcode önbelleğe alma ve benim referans veri ve SQL sorguları için kullanıcı verileri önbelleğe alma gerekiyordu). Kodunuzu profile XDebug kullanın.

Haklısınız Memcache vs APC anahtar-değer mağaza karşılaştırmak istiyorsunuz? APC da farklı bir şey opcode önbellek, yok çünkü.

Peki, tek bir makinede, APC kv önbellek memcache daha yol hızlıdır. APC sadece tek sunucuları üzerinde çalışırken memcache, daha fazla işlevsellik vardır, ancak dağıtılmış ortamlar için tasarlanmıştır.

Ben kurmak ve daha sonra hem 1 milyon anahtarlarını almak için son zamanlarda bir kriter yaptım, her anahtar bir sıralı tamsayı oldu ve değerler 32byte dize vardı.

Localhost üzerinde, memcache tek bir iplik 12k tuşları / saniye almak olabilir. APC 90K/second döndü. Eğer çoklu konuları veya memcache ile "multi_get" kullanmak Ancak, bu APC performansı çok yakın olur.

Kriter Slicehost bir 1GB vps koştu.

benim durumumda APC memcache daha 59 kat daha hızlıdır

<?php
ini_set('apc.enable_cli','1'); //if u run in cli you may need to do changes in php.ini
error_reporting(E_ALL);
$mem=new Memcache();
$mem->connect('127.0.0.1',11211);
$mem->replace('testin','something');
$i=0;
$time=time()+microtime();
apc_store ( 'testin','something');
$num=1000000;
while($i<$num){
 $mem->get('testin');
$i++;
}
echo "memcache took: ",time()+microtime()-$time," for 1 million gets","\n";
$time=time()+microtime();
$i=0;
print_r(apc_fetch('testin'));
while($i<$num) {
apc_fetch('testin');
$i++;
}
echo "apc took: ",time()+microtime()-$time,"for 1 million gets \n";

burada çıktı

memcache took: 37.657398939133 for 1 million gets
somethingapc took: 0.64599800109863for 1 million gets

Bu doğru hızlı olacağını tahmin etmek neredeyse imkansız. Ben benzer verilere sahip bir geliştirme ortamında hem de testler olacaktır.

Performans önemlidir, her zaman bir profilcisini kullanmak.

Im kullanımı IPB onsuz sonra justy iki kat daha hızlı çalışıyor APC ile 3.1.4.

Requests per second:    43.46 [#/sec] (mean)
Requests per second: 24.23 [#/sec] (mean)

Henüz memcached IPB test etmeyin