it-swarm-tr.com

Unix web sunucusunda bellek kullanımı nasıl azaltılır

Şu anda webapps'ları barındırmak için bir Joyent Accelerator kullanıyorum ve iyi çalışıyor, ancak mevcut planımı düşürdüğüm için maliyetleri düşürmem gerekiyor ve bu da bazı yeni bellek sınırları (256M rss, 512M takas) getiriyor. Dün onlar üzerinde çok uzak değildim, ancak bugün birkaç kez Apache'yi yeniden başlattıktan sonra, şimdi 411M rss, 721M takasıyım (prstat -Z -s cpu).

Sunucu Hatası'nda arama yapmak, sunucuyu izlemem için yalnızca birçok yol ve belirli araçlar sağlar, ancak bellek kullanımını azaltma/optimize etme konusunda herhangi bir öneri yoktur. Ben de gördüm bu sor , ama bu belirli (ya da genel diyebilirim?) Durum için iyi olduğunu düşünmüyorum.

Sunucu Solaris'i paylaşılan bir CPU üzerinde çalıştırıyor ve Apache + MySQL + PHP yığınını kullanıyorum.

Bu sorunu çözmek ve sorunları çözmek için atılabilecek adımları bilmekle ilgileniyorum. Ancak, bellek ayağımı bastırmak ve mevcut bitmeden önce planı düşürmek için de zamanım bitiyor, bu yüzden sihir ve günü kurtarabilecek her şey de hoş geldiniz :)

36
lima

Yanıtlarınız için herkese teşekkürler ! Önerilerinizi takiben, bellek kullanımımı koduma dokunmadan 195M SWAP ve 108M RSS'ye indirebildim (kesinlikle yakında optimize edeceğim, ancak bu beni derdinden hızlı bir şekilde çıkarmak için bir çözüm olması gerekiyordu).

İşte yaptığım şeylerin listesi:

VirtualHost girişlerinde kullanılan joker karakterden kurtuldum. *: 80 ve *: 443 yerine, sunucumun gerçek IP'sini kullandım.

Apache'nin prefork MPM'sini değiştirdi. Bunlar, kullandığım değerler:

 StartServers 1 
 MinSpareServers 1 
 MaxSpareServers 5 
 ServerLimit 16 
 MaxClients 16 
 MaxRequestsPerChild 0 
 ListenBacklog 100 

Bunlar hiçbir şekilde sihirli sayılar değildir. Farklı değerleri ve kombinasyonları denemek için biraz zaman harcadım ve daha sonra bunları sunucumun gerçek kullanımına karşı test ettim ve herkes kendi ortamında aynı şeyi yapmalıdır. Kayıt için, sunucum ayda 2 milyon pvs'ye yaklaşıyor ve hem dinamik sayfaları hem de varlıkları düzenli bir oranda sunuyor - kazma etkisi yok. Amaç, performansı veya HA'yı iyileştirmek için değil, bellek ayak izini azaltmaktı.

Referans:

Apache'nin KeepAlive'i ayarlandı. KeepAliveTimeout değerini daha düşük bir değere (benim durumumda 2) ayarlayarak daha az sunucu işleminin beklemesini bekleyebilirim daha fazla içerik istemeyebilecek boştaki istemcilerle bağlantılar.

Referans: http://httpd.Apache.org/docs/2.0/mod/core.html#keepalivetimeout

MySQL'in kullanılmayan modülünü kaldırdı. skip-innodb MySQL'in my.cnf dosyasına. Büyük bellek tüketimi azaltma.


Kişisel olarak yapamayacağım bazı iyi öneriler de var:

  • Kaldır PHP modüller. PHP var Çoğu mod zaten derlenmiş, muhtemelen kendi minimal PHP diğer VPS üzerinde çalışacağım.
  • php-fastcgi ile nginx'e geçin. Bu, yakında deneyeceğim başka bir iyi tavsiye, ama şu anda kesinti süresini riske atamıyorum.
23
lima

Buldum Apache ve MySQL için düşük bellek yapılandırmaları hakkındaki bu makale

Düşük bellek yapılandırmaları için gereken yapılandırma değişikliklerini düzenlemede çok yararlı olmak. Onları kendi durumum için ayarladım, ancak çevrenize en uygun olanı bulmak için gerekli araçları sağlamalılar

6
Kevin Kuphal

Kaç tane Apache sunucu işleminin çalıştığını sınırlamanız gerekecek ve sizin kadar sınırlara yakın olmakla, çok fazla trafiği kaldıramayacaksınız. Normal kullanım koşullarında maksimize edilmiş bir web sunucusuna sahip olmak, genellikle kötü bir Fikirdir (tm), çünkü web trafiği, kesikli veya kazılana veya ateş topu olana kadar ya da her neyse.

Ana sorunlar, herhangi bir noktada çalışan Apache işlemlerinin sayısıdır - burada önkol varsayarak, sadece PHP uygulamalar ve PHP İşçi MPM'sini boyutlandırma deneyimim yok Paylaşılan bellekte bazı öğeler ve her işlemin belleğinde olan bazı öğeler var.

İhtiyacınız olmayan paylaşılan modülleri dışarıda bırakarak toplam bellek alanını azaltabilirsiniz. Temel olarak, Apache çoğu ana bilgisayardan Güneş altında hemen hemen her şeyi yapacak şekilde yapılandırılmış olarak gelir. Mod_userdir kullanmıyorsanız, Apache yapılandırmanızdan yorum yapın. Ne kadar çıkardığınıza dikkat edin, çünkü ihtiyacınız olabilecek bazı şeyler veya bağımlılıkları sezgisel değildir! Tüm modüller Apache.org web sitesinde belgelenmelidir. İşlem başına ayak izinin küçülmesi daha zordur; günümüzde çoğu Apache yapılandırması yalnızca derlenmiş dört temel modülle birlikte gelir. Bu dört modülün ötesinde, bellek kullanımının çoğu sızıntılardan veya uygulamadan gelir RAM bu etkili bir şekilde toplanan çöp değildir, bu yüzden her işlem tarafından ele alınan istek sayısını düşük ayarlamak isteyebilirsiniz.

Siz gerçekten bellek kullanımınızı RAM kendi içinde tutmak ve takas etmek istemiyorsanız) Takas I/O demektir. G/Ç yavaştır ve CPU kullanımınızı artırır Bir şeyin takastan çıkarılmasını beklerken süreçler bloke olurken çatı boyunca.

4
Karl Katzke

Hedefinize zaten ulaştığınızdan, fazladan birkaçı:

Gereksiz tüm php modüllerini kaldırdığınızdan, Apache için de aynısını yapabilirsiniz. Varsayılan olarak (kuruluma bağlı olarak) Apache bir sürü ekstra modül yükler ve bunların çoğu normal günlük kullanım için gerçekten gerekli değildir. Örneğin, her zaman yüklenmiş bir dizi kimlik doğrulama modülü vardır. bant genişliği kullanımınızı sınırlamaya çalışmadığınız sürece deflate işlemi genellikle gerekli değildir. Otomatik indeks ve durum geçişleri de sorgulanabilir.

Diğeri ise php.ini dosyasında php için kullanılabilir bellek miktarını sınırlayabilmenizdir: memory_limit = xxxM

2
rasjani

Apache için kullanmadığınız modülleri kaldırın, çünkü bunlar sadece ek bellek kullanır. MySQL için innodb/bbdb'yi kullanmıyorsanız kaldırın ve PHP gerekli olmayan modülleri kaldırın.

Ardından, Apache MaxClients'ı bir işlemin boyutuna ve Apache'ye vermek istediğiniz bellek miktarına göre yapılandırmalısınız. Aynı MySQL maksimum bağlantıları için de geçerlidir (Ben mükemmel MySQL Tuning Primer Script öneririz.

PHP uygulama üzerinde kontrolünüz varsa, çok fazla bellek kullanmadığından emin olun (örneğin, değişkenlerde, özellikle statik olanlarda).

Daha ileri gitmek isterseniz, Apache + mod_php yerine nginx + fcgi kurulumunu kullanabilirsiniz, bu da bellekte daha fazla azalmaya neden olacaktır.

Son bir şey - gerçekten bir web sunucusunda takas etmek istemezsiniz. Sadece biraz, gereksiz şeyleri kaldırmak, ancak bir web sunucusunda düzenli olarak değiştirmek, yanıt vermeyen bir web sitesine neden olacaktır.

2
yhager

Sunucu Solaris'i paylaşılan bir CPU üzerinde çalıştırıyor ve Apache + MySQL + PHP yığınını kullanıyorum.

Solaris ile deneyimim yok, ancak yapabileceğiniz en iyi şey Apache/mod_php kullanmamaktır.

  • Php-fastcgi ile nginx'e geçin.
  • Eklentileri minimum miktarda kullanmak için php'yi yeniden derleyin.
  • Ntpd (ntpdate kullanın), ftp (scp kullanın) vb. Gibi gereksiz işlemlerden kurtulun.
0
Unknown

Elbette Apache'nin çatabileceği süreç sayısını sınırlayabilirsiniz, ancak bu sadece bellek kullanımınızda Sudo-hard bir limit olarak çalışır. Daha düşük bir seviyeden bakıldığında, bir işlem için kullanılabilir kaynakları kısıtlamak üzere plimit kullanabilirsiniz. Bunu ebeveyn ve çocuk süreçlerine uyguladığına inandığım miras.

Ancak, bir web sunucusu yapılandırma açısından, kodunuzun gerçekten nasıl çalıştığına inebilir! Ancak, .htaccess dosyalarını kullanmak gibi küçük şeylerin, merkezi Apache yapılandırma dosyalarını kullanmaktan daha fazla kaynak kullandığını unutmayın (her istek geldiğinde okundukları için, daha fazla ek yüke neden olurlar), büyük web sitelerinde anlamdır.

0
Coops

Zaman içinde bellek büyümesine yardımcı olabilecek bir şey, httpd kaliteyi düşürmektir, ancak uygulamanızın daha uzun ömürlü süreçlere ihtiyaç duyması durumunda bunu dikkatlice test ederim.

0
D.F.