Linux: açıkça mümkün olan her şeyi nasıl açabilirim?


59

Çok fazla bellek alan bir şey başlattım ve şimdi her şey çok geriliyor. Sanırım yoğun bellek gerektiren işlemler için yer açmak için tüm uygulamaların belleği takas edildi ve şimdi erişildiğinde yavaş yavaş RAM'e geri dönüyor.

Mümkün olan her şeyi değiştirilip RAM'e geri götürmek için açıkça bir yol var mı? Ya da belki her şey değil, sadece bazı özel veri süreçleri?

Yanıtlar:


59

Normal Linux bellek kontrolünün, kullanılanlar gibi kullanılan şeylerle değiştirilmesine izin vermenizi tavsiye ederim.

Düşünebileceğim tek şey, takas kapatıp tekrar açmak.

sudo swapoff -a
sudo swapon -a

Bu, takastaki her şeyi içerecek kadar yedek fiziksel belleğiniz olduğunu varsayar ...


4
Çok yavaş olsa da çalışıyor :) Teşekkürler! Ama yine de daha şık bir çözüm olduğuna inanıyorum :)
kolypto

7
Bu çözüme dikkat ederek, her şeyi zorla takastan çıkarır ... fiziksel belleğe sığmazsa, çekirdek ölümcül OOM katiline başlayacaktır. Herhangi bir hoş "her şeyi RAM'e taşımayı dene, ancak mümkün değilse zarafetle başarısız" komutunu bilmiyorum.
Juliano

1
Denedim ve çok yavaş çalıştığını öğrendim. Böylece boş RAM izlemek ve swapoffhafıza azalırsa öldürmek mümkündür : bu durumda, takas alanı işlevsel kalacaktır :)
kolypto

2
Bir takası öldürmenin operasyonu durduracağından emin değilim. Nasıl uygulandığına bağlı.
Douglas Leeder

2
Swapoff komutunun "yeni yazmaların takas yapmasına izin verme" gibi bir şey olduğu görülüyor, diğer bir çalışan işlem (takas kullanıyordu / takas ediyor) hala "takas" işlemini bırakabiliyor. Bu yüzden bu kadar yavaş gözüküyor olabilir. OOM'in başka bir kişinin dediği gibi (Ubuntu Bionic kullanıyorum) neden olduğu görülmüyor - muhtemelen "ek (veya varolan) işlemler yeni bellek kullanmaya başlarsa" (yani gerçek OOM'ler) söz konusu olduğunda olabilir. Yani tüm takas / swapon hepsi göründüğü gibi harika bir çözüm. Kararlı / Nazik. Bu, işlemleri kullanarak daha fazla hafıza başlatmadığınızı (veya çalışanlarda tüketimi arttırmadığınızı) varsaymaktadır.
Roel Van de Paar

12

0 ile 100 arasında bir sayı ekleyerek ayarlayabilirsiniz /proc/sys/vm/swappiness.

Bu kontrol, çekirdeğin bellek sayfalarını ne kadar agresif değiştireceğini tanımlamak için kullanılır. Yüksek değerler saldırganlığı arttıracak, düşük değerler takas miktarını azaltacaktır . 0 değeri, çekirdeğe, serbest ve dosya destekli sayfaların miktarı bir bölgedeki yüksek su işaretinden daha az olana kadar takas başlatmama talimatı verir.

Varsayılan değer 60'tır.


13
/ Proc / sys doğrudan kullanmayın, sysctlbunun yerine komutu kullanın. Bu durumda, öyle sysctl vm.swappiness=x.
Juliano

7
Sıfır takas bile olsa, zaten değiştirilmiş sayfaların açıkça ana belleğe getirilmesine neden olacağını sanmıyorum?
Douglas Leeder,

1
@Douglas haklı. vm.swappiness temel olarak bellek istendiğinde bir şeyleri değiş tokuş etmek veya önbellek ve arabellek miktarını azaltmak için hareket ettirme kararını kontrol eder.
Juliano

@Juliano, neden / proc / sys kullanılmamalıdır?
James

@James Çünkü / proc / sys, çekirdek konfigürasyonunu değiştirmek ve sorgulamak için kullanılan alt seviye arayüzdür ("uygulama detayı" dır). Linux, sysctlkullanıcı etkileşimi için üst düzey komut sağlar. Sonuç aynıdır, ancak kullanıcının doğrudan etkileşime girmesi için genellikle daha yüksek seviyeli arayüzler tercih edilir. Sadece anahtarı çevirmek yerine (yüksek seviye) ateşleme tellerini kısa devre yaparak (düşük seviye) motoru çalıştırmak gibi bir şey.
Juliano

5

Linux hafızayı yönetmek için iyi bir iş çıkarır ve yoluna devam etmemelisiniz. Vm.swappiness ayarı (daha önce de belirtildiği gibi) yoluna girmedi. Başka şeyler yaparak garip sorunları yaşamaya daha yatkınsınız.

Hafızada aç olan neyi başlattın? Ayarlanabilir mi? Kendi bellek sınırlama direktiflerine sahip değilse, ulimite de bakabilirsiniz.


Benim durumumda öyleydi convert -density 200 file.pdf jpegs/file.jpg. Bazı nedenlerden dolayı çok fazla bellek kullanıyor, ancak haklısınız: ayarlanabilir. Neyse, durum herhangi bir uygulama ile mümkündür :)
kolypto

1
Bu cevaba katılıyorum - muhtemelen gerekli olanı değiştirmek için makinede normal işlemler bırakmalısınız.
Douglas Leeder,

convert-limithafızasını ve disk kullanımını kontrol etme argümanı var ve onları okumalısınız. Ayar -limit memory 512MBveya benzeri iyi olurdu. Muhtemelen açık bir MAGICK_TEMPORARY_PATH belirtmeniz ve emriniz tamamlandıktan sonra temizlemeniz iyi olur.
Slacy

3

Tüm uygulamalarınız için hafızanız varsa, takasın 0 olarak ayarlanması uygundur, böylece işler değişmeyecektir. Örneğin, qemu-kvm VMM'nin takas edileceği büyük bir hedeftir, çünkü çoğu zaman boşta görünmektedir. Bir qemu-kvm belleğinin% 80'ine kadarının takas için yazıldığını gördüm. Qemu-kvm'de çalışan sanal makineler, takasın tükenmesi nedeniyle yanıt vermeyeceklerdir (konuğun bunun olduğu hakkında hiçbir fikri olmasa da). Konuk VM, gerçekte korkunç bir şekilde sürüklense de, en mükemmel şekilde performans göstereceğini düşünüyor. Çok sayıda VM'yi "uyandırdım" ve bir şeyler yapmaya başladığımda, yüksek hızlı bellek ve diske sahip kurumsal sınıf donanımda bile yük ortalamasını 30'un üzerine çıkarabilir. Sanırım bu, kutunun dışında qemu-kvm tasarımında bir başarısızlık.

Umarım bu birine yardımcı olur.


Korkarım bu tam olarak doğru değil.
Marc.2377

2

VM alt sistemini çekirdekte düşünmeyi denememeyi öneririm. Son derece olasılıkla, olduğundan daha iyi kararlar almak için yeterli bilgiye sahip olmanız pek mümkün değildir. Ve eğer bir şekilde yanlış şeyi yapmaya zorlarsanız, o zaman işleri daha da yavaşlatırsınız.


9
OP'nin istediğini yapmak istediğim bazı durumlar var. Yanlışlıkla bir sürecin isyan etmesine izin verir ve RAM + takas işlemimin tamamını alırsam, uygulamaları hafızasının yerinden çıkması için değiştirdiğimde her seferinde 15 saniye beklerim ya da sadece her şeyi her zaman olduğu kadar hızlı çalıştırır.
Alex

1

Yapması gereken sistemi yeniden başlatabiliyorsanız (ve başka bir çözümü denemekten çok daha az zaman alabilir).


1

Cevabımın bir kısmını bu sorudan kopyalamak için .

Böylece, değiştirilebilinir değişkenin nasıl çalıştığını bilirsiniz. Bu, VM alt sistemine, işlem sayfa tabloları + değiş tokuş değeri ile eşleştirildiğinde belleğin% 'si> 100 olduğunda takas edilecek sayfaları aramasını söyleyerek çalışır. Bu nedenle, 60 ayarının yapılması, sistemin işlem sayfa tablosundan sayfaların eski sayfalarını başlatmasına neden olur Sistem belleğinin% 40'ından fazlasını kullanıyorsa. Programlarınızın önbellek pahasına daha fazla bellek kullanmasına izin vermek istiyorsanız, takas değerini düşürmek istersiniz.


Program hafızasına karşı önbellek sorunu olduğunu sanmıyorum - sanırım uygulama hafızasına karşı kullanılmayan hafıza. Ve değişimin bunu etkileyeceğini sanmıyorum.
Douglas Leeder

0

İşlem hala devam ediyor mu? Bir terminal açın ve başlatılan işlemleri tespit edip edemediğinizi görün. (ps aux | grep processname bunu biraz daha kolaylaştırabilir) Hala çalışıyorlarsa onları öldürmek için kill -9 PID kullanın. Ne öldürdüğüne dikkat et. İşlemin ne olduğunu bilmiyorsanız, öldürmeyin! Ayrıca, free -m çıktısını gönderin, böylece hala çok fazla takas kullanıyorsanız görebilelim.

İşler hala yavaş çalışıyorsa, başlattığınız şeyi hala yayınlamaya devam edebilirsiniz. Ne yaptığınızı gerçekten bilmiyorsanız ya da sınırda yaşamayı sevmiyorsanız, takası asla kapatmam. =)


0

Linux unwap verilerini diskten belleğe zorlamak için gerçekten iyi bir yol olmadığına inanıyorum. Swapoff / swapon çalışan bir çözüm olduğunda, ancak kirli ve kolayca sisteminizi dengesiz hale getirebilir. Takas içerisinde boş hafızadan daha fazla veriye sahip olduğunuz durumlarda, hangi veri parçalarının belleğe taşınacağına ve hangi parçaların diskte tutulacağına karar vermek için Linux'un kullanabileceği etkili bir politika hayal etmek zor olacaktır.

Özet: Linux'un performansını normal şekilde kademeli olarak yükseltmesine izin verin. VM alt sistemi, çaba gösterecek ve sürekli olarak ideal bir dengeli duruma geçecek şekilde düzenlenmiştir.


-2

Arabellek önbelleğini boşaltma

Onları boşaltmak istiyorsanız, bu komut dizisini kullanabilirsiniz.

$ free && sync && echo 3 > /proc/sys/vm/drop_caches && free

             total       used       free     shared    buffers     cached
Mem:       1018916     980832      38084          0      46924     355764
-/+ buffers/cache:     578144     440772
Swap:      2064376        128    2064248
             total       used       free     shared    buffers     cached
Mem:       1018916     685008     333908          0        224     108252
-/+ buffers/cache:     576532     442384
Swap:      2064376        128    2064248

Sayısal argümanı yukarıdaki komuta değiştirerek önbelleklenmiş öğelerin çeşitli yönlerini bırakması için Linux Çekirdeğini işaret edebilirsiniz.

NOT: gereksiz şeylerin belleğini temizleyin (Çekirdek 2.6.16 veya daha yenisi). Her zaman yararlı şeyleri diske atmak için ilk önce senkronizasyonu çalıştırdığınızdan emin olun !!!

  • Sayfa önbelleğini boşaltmak için:

    $ echo 1 > /proc/sys/vm/drop_caches
    
  • Dişçi ve inodeları serbest bırakmak için:

    $ echo 2 > /proc/sys/vm/drop_caches
    
  • Sayfa önbelleğini, diş hekimlerini ve inode'ları serbest bırakmak için:

    $ echo 3 > /proc/sys/vm/drop_caches
    

Yukarıdakilerin root olarak çalıştırılması kastedilmiştir. Bunları sudo kullanarak yapmaya çalışıyorsanız, sözdizimini biraz gibi bir şeyle değiştirmeniz gerekir:

$ sudo sh -c 'echo 1 >/proc/sys/vm/drop_caches'
$ sudo sh -c 'echo 2 >/proc/sys/vm/drop_caches'
$ sudo sh -c 'echo 3 >/proc/sys/vm/drop_caches'
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.