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


36

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

Sunucu Arızasında Arama, sunucuyu izlemem için bana yalnızca birçok yol ve belirli araçlar sunar, ancak hafıza kullanımını nasıl azaltacağınız / optimize edeceğiniz konusunda hiçbir öneride bulunmaz. Bu soruyu da gördüm , ancak bu belirli (veya genel?) Durum için iyi olduğunu sanmıyorum.

Sunucu, paylaşılan bir işlemcide Solaris kullanıyor ve Apache + MySQL + PHP yığını kullanıyorum.

Bu sorunu çözmek ve sorunları çözmek için atılabilecek adımları bilmekle ilgileniyorum. Ancak, bellek ayağımın baskısını düşürmek ve mevcut sona ermeden önce planı düşürmek için zamanım da tükeniyor, bu yüzden sihir yapıp günü kurtarabilecek bir şey de açığız :)


1
Ben sadece bu ayarları kendi başıma googling'den öğrenmiş olmama rağmen, bir dosyadaki ayarları değiştirdiğim ortaya çıktı, ancak daha sonra yüklenmekte olan farklı bir config dosyası ayarları sessizce geçersiz kılıyordu! Önceden MPM ayarlarının ve birkaç başka şeyin ayarlanması işlem sayımı ve hafıza kullanımını kontrol altında tutup en aza indirgemeyi harika bulmuştu. Umarım bu bilgi başkalarına, özellikle de Gentoo'yu sunucularında çalışanlara yardımcı olur.
Pistos

Yanıtlar:


23

Cevaplarınız için hepinize teşekkürler! Önerilerinizi takip ederek kodumu kullanmadan bellek kullanımımı 195M SWAP ve 108M RSS seviyelerine indirmeyi başardım (kesinlikle yakında en iyi duruma getireceğim, ancak bunun beni belaya sokmamak 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.

Değişti Apache'nin prefork MPM'si. Bunlar, kullandığım son değerlerdir:

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

Bunlar kesinlikle sihirli sayılar değil. Farklı değerler ve kombinasyonlar denemek için biraz zaman harcadım ve daha sonra bunları sunucumun gerçek kullanımına karşı test ettim ve herkes ortamlarında aynısını yapmalı. Kayıt için, sunucum ayda 2 milyon pvs'ye yaklaşıyor, hem dinamik sayfalara hem de varlıklara düzenli bir oranda hizmet veriyor - kazı etkisi yok. Amaç, yine, performansı veya HA'yı geliştirmek değil, bellek ayak izini azaltmaktı.

Referans:

Apache'nin KeepAlive'sini indirdim. Daha KeepAliveTimeoutdüşük bir değere ayarlayarak (benim durumumda 2), daha fazla içerik talep etmeyen, boşta çalışan istemcilerle bağlantıda bekleyen daha az sunucu işlemi bekleyebilirim.

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

MySQL'in kullanılmayan modülü kaldırıldı. skip-innodbMySQL'in my.cnf'sine ekledim . Büyük hafıza tüketiminde azalma.


Ayrıca şahsen yapamayacağım bazı iyi öneriler var:

  • İhtiyacınız olmayan PHP modüllerini kaldırın. Sunucumdaki PHP'nin çoğu modları zaten derlendi, muhtemelen diğer VPS'lerde kendi minimal PHP'mi deneyeceğim.
  • Php-fastcgi ile nginx'e geçin. Bu, yakında deneyeceğim bir başka iyi tavsiye, ama şu anda aksama süresini riske atamam.

Nginx ve php-fastcgi (LEMP) kullanıyorum ve benzer bellek sorunlarıyla karşılaşıyorum ... 256 MB'lık bir sunucuda php-fastcgi'nin PHP_FCGI_CHILDREN = 5 ve PHP_FCGI_MAX_REQUESTS = 333 ile iyi çalıştığını biliyorum ... bu değerler iyi bir başlangıç puan!
farinspace

Got rid of the wildcard used in VirtualHost entriesBu gerçekten anlamlı bir şekilde yardımcı oluyor mu? Fark yaratmayacak izlenimindeydim.
Mahn

@Mahn - Memory ile yardımcı olmuyor, ancak düşük bellek ortamında iyi bir şey olan CPU kullanımını geliştiriyor
jsnfwlr

"Php-fastcgi ile nginx'e geç" --- Apache2'yi korumak istiyorsanız daha az etkili ama etkili bir seçenek şöyle olurdu: Apache2 + mod_proxy_fcgi + mod_mpm_event. mpm_event, nginx'e benzer. Php-fpm'ye bağlanmak için bunu kullanın. Bkz dracony.org/stop-using-php-fpm-to-argue-using-nginx-vs-apache
James Johnston


4

Kaç tane apache sunucusu işleminin çalıştığını sınırlamanız gerekecek, ve sınırınız kadar yakın olmanız çok zorlu trafiklerle başa çıkamayacaksınız. Normal kullanım koşullarında maksimuma çıkmış bir web sunucusuna sahip olmak genellikle kötü bir fikirdir (tm), çünkü web trafiği kesilen veya kazılana ya da ateş topuyla ya da her ne olursa olsun, çoğunlukla iyi ve düşüktür.

Başlıca konular, herhangi bir noktada çalışan apache işlemlerinin sayısıdır - burada prefork olduğu varsayılarak, yalnızca PHP uygulamaları kullandım ve PHP iş parçacığı güvenliği olmadığından. İşçi MPM'in boyutlandırılması konusunda deneyimim yok. Paylaşılan hafızada bulunan bazı öğeler ve her işlemin hafızasındaki bazı öğeler vardır.

İ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şin altındaki her şeyi yapmak üzere yapılandırılmış olarak geliyor. Mod_userdir kullanmıyorsanız, apache yapılandırmanızdan yorum yapın. Ne kadar çıkardığınıza dikkat edin, çünkü ihtiyaç duyabileceğiniz şeyler veya bağımlılıkları sezgisel değildir! Tüm modüller apache.org web sitesinde belgelenmelidir. İşlem başına ayak izi küçülmek daha zordur; Bu günlerde çoğu apache konfigürasyonu sadece derlenmiş dört temel modülle gelir. Bu dört modülün ötesinde, bellek kullanımının çoğu, etkin bir şekilde toplanmayan çöp veya uygulama RAM'inden gelir, bu nedenle istek sayısını ayarlamak isteyebilirsiniz. Düşük her işlem tarafından işlenir.

Sen gerçekten RAM kendisinde bellek kullanımınızı tutmak istiyoruz ve takas girmeyeceğim. Değiştirme G / Ç anlamına gelir. G / Ç yavaştır ve bir şeyin değiş tokuş edilmesini beklerken işlemler blok olarak CPU kullanımınızı çatıdan sürecektir.


1
Tavsiyen için teşekkürler Karl! Sunucunun Swap'ı kullanmasını önlemenin bir yolu var mı? Çünkü bellek kullanımını azalttıktan sonra artık RAM'imin üzerinde değilim, ancak hala SWAP belleğinin kullanıldığını gösteriyor.
lima

@ fandelost Takasın kullanılmasının önemi yok, işler takas edildiğinde kötü olan şey. İşletim sisteminiz, bu talimatların ve verilerin orada daha iyi olduğunu düşündüğü (ve çoğu zaman doğru olduğu) olduğu zaman, çok sık çalışmayan işlemlerden gelen talimatları veya verileri değiştiriyor olabilir.
Patrick James McDougle

2

Apache için kullanmadığınız modülleri kaldırın, çünkü yalnızca ek bellek kullanırlar. MySQL için, kullanmazsanız innodb / bbdb'yi kaldırın ve ihtiyacınız olmayan PHP modüllerini kaldırın.

Daha sonra apache MaxClients'ı bir işlemin büyüklüğüne ve apache vermek istediğiniz hafıza miktarına göre yapılandırmalısınız. Aynı MySQL'de maksimum bağlantı için de geçerlidir (Mükemmel MySQL Tuning Primer Script'i tavsiye ederim .

PHP uygulamanız üzerinde denetiminiz varsa, çok fazla bellek kullanmadığından emin olun (örn. Değişkenlerde, özellikle statik olanlarda).

Daha ileri gitmek istiyorsanız, apache + mod_php'yi nginx + fcgi kurulumuyla değiştirebilirsiniz; bu, muhtemelen daha fazla hafıza azalmasına neden olur.

Son bir şey - gerçekten bir web sunucusunda takas etmek istemiyorsunuz. Gereksiz şeyleri kaldırmak için biraz, ancak düzenli olarak bir web sunucusunda takas yanıt vermeyen bir web sitesine neden olacaktır.


Tavsiyeniz için teşekkürler yhager, tuning-primer.sh dosyasını deniyorum, ancak şu hatayı alıyorum: "94. satırdaki sözdizimi hatası:` cnf_socket = $ 'beklenmeyen ". Herhangi bir fikir?
lima

Kabuk ile ilgili olabilir. Bu senaryo muhtemelen Linux ile ilgili olduğundan, ilk satırı / bin / sh yerine bash olarak göstermeye çalışın. Umarım Solaris’e
baskı

2

Hedefinize zaten ulaşmış olduğunuzdan, işte birkaç ekstra

Gereksiz tüm php modüllerini çıkardığınızdan, apache için aynı olabilirsiniz. Öntanımlı olarak (kurulum yerine bağlı olarak) apache, bir sürü ekstra modül yükler ve çoğu normal günlük kullanım için pek gerekli değildir. Örneğin, her zaman yüklü olan bir sürü kimlik doğrulama modülü vardır. Bant genişliği kullanımınızı sınırlandırmaya çalışmadığınız sürece deflate tipik olarak gerekli değildir. Autoindex ve durum gider de sorgulanabilir.

Bir diğeri ise php.ini içindeki php için kullanılabilir hafıza miktarını sınırlayabilmenizdir: memory_limit = xxxM


0

Elbette apache'nin kullanabileceği işlem sayısını sınırlayabilirsiniz, ancak bu yalnızca bellek kullanımınız için zor bir limit olarak işe yarayacaktır. Daha düşük bir bakış açısıyla , bir işlem için mevcut kaynakları sınırlamak için plimit'i kullanabilirsiniz . Bunu, ebeveyne ve çocuk işlemlerine uyguladığına inanıyorum.

Ancak bir web sunucusu konfigürasyon bakış açısından kodunuzun gerçekte nasıl çalıştığını görülebilir! Ancak, .htaccess dosyalarını kullanmak gibi küçük şeylerin, merkezi apache konfigürasyon dosyalarını kullanmaktan daha fazla kaynak kullandığını (her istek geldiğinde okunan, daha büyük yüklere yol açan) büyük web sitelerinde anlamlı olan bir şey olduğunu unutmayın.


0

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


0

Sunucu, paylaşılan bir işlemcide Solaris kullanıyor ve Apache + MySQL + PHP yığını kullanıyorum.

Solaris ile ilgili deneyimim yok, ancak yapabileceğiniz en iyi şey Apache / mod_php kullanmamak.

  • Php-fastcgi ile nginx'e geçin.
  • En az miktarda eklenti kullanmak için php'yi yeniden derleyin.
  • Ntpd (ntpdate kullanın), ftp (scp kullanın) gibi gereksiz işlemlerden kurtulun ...
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.