2011-07-21 16 views
9

Sunucumda memcached çalışıyorum ve 600 + req/s isabet zaman kararsız hale gelir ve büyük bir sorun yüklenmesine neden olur. İstek oranı o kadar yüksek olursa, PHP uygulamalarımız rastgele zamanlarda memcache sunucusuna bağlanamaz, nginx ve php-fpm çığlıklarını yavaşlatır ve bir grup 104 alır: nginx günlüklerimdeki hatalar.600+ memcache req/s sorunları - yardım!

Memcache sunucumda 'hot object' - memcache isteklerinin% 90'ını alan nesneler olduğumu belirtmek isterim. Ayrıca, pek çok isteğin tek bir nesneyi vurduğunda da, genel sayfaya biraz daha fazla yükleme süresi eklediğini fark ettim (yüklendiğinde).

Bu sorunun herhangi bir yardımı için çok memnun olurum. Çok teşekkürler! Saniye başına 600 istek, memcached için son derece düşüktür.

+1

-t <numcores> Eğer ServerFault koymak gereken bir soru gibi geliyor kullanarak etkinleştirin. – Matt

cevap

7

Anahtarı uzağa TCP soketleri kullanarak ve UNIX yuvalarına giderek bir soket ile memcached

Başlat etkin (bir Unix tabanlı sunucu üzerinde olduğunu varsayarsak): kalıcı bağlantılarını kullanarak bağlamak, PHP içinde memcached başlangıç ​​çizgisine

Sonra (Not, prizler ağ devre dışı bırakır destek) -s /tmp/memcached.socket ekleyin ve yeni Memcache'ı sokete:

$memcache_obj = new Memcache; 
$memcache_obj->pconnect('unix:///tmp/memcached.socket', 0); 

Diğer bir öneri, birden varsa önbelleğe alınmış nesnelerin "türleri", her "tür" için bir memcached örneği başlatın ve bunların arasında sıcak öğelerinizi dağıtın.

Drupal bunu yapar, yapılandırma dosyalarının ve memcached init ayarlarının nasıl olduğunu görürsünüz here.

Ayrıca, memcached zaman aşımının YÜKSEK olarak ayarlandığı gibi geliyor. 1 veya 2 saniyenin üzerinde bir şey varsa, komut dosyalarını kilitleyebilirsiniz. Zaman aşımına ulaşılmalı ve betik nesnenin başka bir yöntemle (SQL, dosya, vb.) Alınması için varsayılan olmalıdır.

Diğer bir şey, önbelleğiniz, önbelleğiniz takas dosyanızda değiştirilmediğini doğrulamaktır. ortalama ücretsiz ramdan daha küçüktür, memcache'yi -k seçeneğiyle başlatmayı deneyin, bu her zaman ramda kalmak için önbelleği zorlar ve değiştirilemez. Bir çok çekirdekli sunucu varsa

da emin memcached iplik desteği ile derlenmiş olduğundan emin olun ve

+0

Soketleri kullanmamın bir nedeni, sunucu birkaç dakika boyunca iyi çalıştı ve aşırı yavaşladı. Emin değilim neden... – Aco

1

Her istek için bir bağlantı kuruyorsanız, bağlantı kurmaktan daha fazla zaman harcayacaksınız ve geçici bağlantı noktalarınızı çok hızlı bir şekilde yanacaksınız; bu da gördüğünüz sorun olabilir. deneyebilirsin şeylerin bir çift var

+1

Önerileriniz nelerdir? – Aco

+1

Hiçbir şeyden fazlasını önermek için ne yaptığınızı tam olarak bilmiyorum. Her istek için bir bağlantı kuruyor gibi görünüyorsunuz. Eğer öyleyse, o zaman yukarıdaki sebeplerden dolayı bunu önermem. – Dustin

0

: Eğer yerel olarak çalışan memcached varsa

  • , adlandırılmış soket kullanabilirsiniz 'localhost' yerine '127.0.0.1'
  • Kullanım persisntent bağlantıların
+0

Sorunları azaltmak için bir çözümleyicinin kullanımını zorlamayı beklemem. – Dustin

+0

127.0.0.1 kullanma aslında bir yuva açar, localhost ise localhost yuvası için bir takma addır (ve böylece yeni bir tane açmaz) –

+1

Linux bunu yapmaz. Bunu yapmak için PHP için özel bir MySQL sürücüsü var. Yine de oldukça kötü bir tasarım kararı. Birisi bir TCP/IP soketi yerine bir unix alan soketi istiyorsa, istediklerini sormalılar. İlgili bir notta – Dustin