Cent OS: Bellek fazla taahhüdünü nasıl kapatabilirim veya azaltabilirim ve bunu yapmak güvenli mi?


20

Zaman zaman "benim" sunucu durur, çünkü hem bellekte hem de takas alanında yer kalmaz. (ping'e cevap vermeye devam ediyor ama bundan başka bir şey değil, ssh bile değil).

Linux'a anladığım kadarıyla, bankaların parayla yaptığı gibi, bellek fazla taahhüdü yaptığı söylendi: çoğu işlemin aslında istedikleri tüm belleği kullanmayacağını varsayarak, gerçekte mevcut olandan daha fazla bellek işlemeye izin veriyor en azından hepsi aynı anda değil.

Lütfen bunun aslında sistemimin zaman zaman askıda kalmasının sebebi olduğunu varsayalım, durumun böyle olup olmadığını burada tartışmayalım (bkz . Bir sunucudaki TÜM hizmetlerin neden düşmesine neden olabilir, ancak yine de ping'e yanıt veriyor? Ve nasıl çözüleceği ). .

Yani,

  1. CentOS'ta aşırı bellek tüketimini nasıl devre dışı bırakabilirim veya azaltabilirim? Ben vm.overcommit_memory (0, 1 veya 2 değerleri) ve vm.overcommit_ratiom denilen iki ayar var okudum ama onları bulmak ve değiştirmek zorunda hiçbir fikrim yok (umarım bazı yapılandırma dosyası), hangi değerleri denemek gerekir ve değişiklikleri etkili hale getirmek için sunucuyu yeniden başlatmam gerekip gerekmediğini.

  2. ve güvenli mi? Hangi yan etkileri bekleyebilirim? Overcommit_memory için googling zaman ben onların sunucu artık önyükleme olamaz diyerek insanlar gibi korkunç şeyler bulmak ....

Ne bellek kullanımı ani artış neden mysql çünkü sırayla http isteklerini sunarken çağrılır php tarafından yapılan sorgular nedeniyle, ben sadece bazı php komut dosyası tamamlamak için başarısız ve bu nedenle zaman zaman bazı 500 yanıt beklenir sunucu çok meşgul, hangi bir risk alabilir (kesinlikle daha iyi olan tüm sunucu erişilemez hale ve sert yeniden başlatmak zorunda).

Ya da yanlış ayarları seçersem sunucumun yeniden başlatılamamasına neden olabilir mi?


1
Aşırı yüklemeyi devre dışı bırakmak, gerçekten hafızanız bittiğinde size yardımcı olmaz . Ancak sunucuya RAM eklemek yardımcı olabilir.
Michael Hampton

2
Aşırı devreyi devre dışı bırakmak son çözüm olmayacak, ancak sunucunun belleği tükeniyorsa (birkaç saniye boyunca her seferinde sadece bir kez) çok fazla yardımcı olacak, sadece birkaç http isteği reddedildi (ya da kötü hizmet), sunucum tamamen ve sonsuza kadar DIE sahip olmak yerine (yeniden
başlatana

Yanıtlar:


30

Aşırı bellek kapasitesi, vm.overcommit_memory=2

0, varsayılan ayırma modudur, burada çekirdek, yapılan ayırma isteğine kıyasla boş belleği hesaplayarak ayırmayı sezgisel olarak belirler. Ve 1 olarak ayarlamak, çekirdeğin her zaman ayırma için yeterli boş belleğe sahip olduğunu bildirdiği sihirbaz modunu etkinleştirir. 2 olarak ayarlanması, işlemlerin yalnızca yapılandırılabilir miktarda ( overcommit_ratio) RAM ayırabileceği ve bu miktarın ötesine geçtiğinde ayırma hatası veya OOM mesajları almaya başlayacağı anlamına gelir .

Bunu yapmak güvenli mi, hayır. İş yükü ve donanım kapasitesinden% 100 emin olmadığınız sürece, aşırı bellek devre dışı bırakmanın gerçekten yardımcı olduğu herhangi bir uygun kullanım durumu görmedim. İlgileniyorsanız, kernel-docspaketi yükleyin ve /Documentation/sysctl/vm.txtdaha fazlasını okumak veya çevrimiçi okumak için adresine gidin .

Ayarladıysanız vm.overcommit_memory=2, yapılandırılan fiziksel RAM yüzdesine kadar aşırı yüklenir vm.overcommit_ratio(varsayılan% 50'dir).

echo 0/1/2 > /proc/sys/vm/overcommit_memory 

Bu yeniden başlatmadan kurtulamaz. Kalıcılık için bunu /etc/sysctl.confdosyaya yerleştirin:

vm.overcommit_memory=X

ve koş sysctl -p. Yeniden başlatmaya gerek yok.


cevap vermediğin kısım, hangi dosyada o vm.memory_overcommit ayarını değiştirdiğim ve özellikle de etkili olması için yeniden başlatmam (veya başka bir şey) gerekip gerekmediğidir
matteo

2
echo 0/1/2> / proc / sys / vm / overcommit_memory Bu yeniden başlatmadan sağlanmaz. Kalıcı olması için bunu /etc/sysctl.conf dosyasına vm.overcommit_memory = X dizinine koyun ve sysctl -p komutunu çalıştırın. Yeniden başlatmaya gerek yok
Soham Chakraborty

Çok teşekkürler. Resmi olarak "kabul" edebilmem için lütfen bunu cevap gövdesine ekleyebilir misiniz?
matteo

1
Yeni bölüm eklendi.
Soham Chakraborty

4
"overcommit_ratio", overcommit_memory = 2 kullanılırken önemli bir etkiye sahiptir - tahsis edilmesine izin verilen fiziksel RAM'in yüzdesini belirler! Eğer oran <100 ise, belki de disk önbelleği veya benzeri için bazı RAM'leri ayrılmamış olarak bırakırsınız. Varsayılan oran% 50'dir, bu yüzden bunu değiştirmezseniz fiziksel RAM'in yalnızca% 50'sini kullanırsınız!
David Gardner

6

Tamamen kalifiye olmayan ifade: Hafızadaki fazla devreyi devre dışı bırakmak, onu etkinleştirmekten kesinlikle "daha güvenlidir".

$ müşteri birkaç yüz web sunucusunda ayarladı ve istikrar sorunlarına çok yardımcı oldu. Eğer hiç devre dışı DEĞİLSE yangın gerçek yüksek sesle çağıran bir Nagios kontrol bile var.

Öte yandan, insanlar, sadece küçük bir koçu aşırı işlemek istediklerinde ve bunu asla gerçekten kullanmayacakları zaman, işlemlerinin hafızadan çıkmasını "güvenli" olarak düşünmeyebilirler. (yani SAP çok iyi bir örnek olacaktır)

Yani, sizin için bir şey geliştirip geliştirmediğini görmeye geri döndünüz. İlgili sorunlardan kurtulmak için zaten araştırdığınızdan - bunun size yardımcı olabileceğini düşünüyorum.

(Bazı huysuz bir kişi tarafından bir aşağı oyu riske atacağımı biliyorum)


3

Aşırı taahhüdü devre dışı bırakmanın, bazı durumlarda etkinleştirmekten daha güvenli olduğunu kabul ediyorum. Sunucu yalnızca birkaç büyük bellek işi çalıştırıyorsa (benim durumumda devre simülasyonları gibi), bir OOM olayını beklemek yerine uygulamayı kısa bir süre için bellek isteğini reddetmek çok daha güvenlidir. OOM katili işini yaptıktan sonra sorun yaşıyor.

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.