Bol miktarda boş RAMim olmasına rağmen takas neden kullanılıyor?

183

Takasın bütün özünün, RAM doluyken geçici depolama güvenliği ağı olarak işlev gördüğünü sanıyordum, ancak bazen 3 GB boş RAM'e sahibim bile, takas bölümüm sürekli kullanılıyor. Bu normal mi?

    
sordu Mysterio 30.06.2012 00:16

6 cevap

160

"Swap" değerinizi değiştirmeyi deneyebilirsiniz:

Ubuntu’nun Swap SSS’inden :

  

Swappiness nedir ve nasıl değiştiririm?

     

Swappiness parametresi, çekirdeğin işlemleri fiziksel bellekten ve takas diskine taşıma eğilimini denetler. Diskler RAM'den çok daha yavaş olduğundan, süreçler çok agresif bir şekilde bellek dışına taşınırsa sistem ve uygulamalar için daha yavaş yanıt sürelerine neden olabilir.

     
  1. swappiness değeri 0 ile 100 arasında bir değere sahip olabilir

  2.   
  3. swappiness = 0, çekirdeğe mümkün olduğu kadar uzun süre fiziksel bellek dışında işlem yapmayı engeller.

  4.   
  5. swappiness = 100, çekirdeğin fiziksel bellekteki işlemleri agresif olarak değiştirmesini ve bunları önbelleği değiştirmeye geçirmesini söyler

  6.   

Ubuntu'daki varsayılan ayar, swappiness = 60'dır. Varsayılan değiştirilme değerinin azaltılması, tipik bir Ubuntu masaüstü kurulumunun genel performansını artıracaktır. Bir swappiness = 10 değeri önerilir, ancak denemekten çekinmeyin. Not: Ubuntu sunucu yüklemelerinin masaüstü sistemlerine göre farklı performans gereksinimleri vardır ve varsayılan 60 değeri daha uygundur.

     

Takas değerini kontrol etmek için

     

cat /proc/sys/vm/swappiness

     

Değişim değerini değiştirmek için Geçici bir değişiklik (yeniden başlatmada kaybedilen), 10'luk bir swappiness değeriyle yapılabilir

     

sudo sysctl vm.swappiness=10

     

Kalıcı bir değişiklik yapmak için , favori düzenleyicinizle yapılandırma dosyasını düzenleyin:

     

gksudo gedit /etc/sysctl.conf

     

vm.swappiness'i arayın ve değerini istediğiniz gibi değiştirin. Vm.swappiness yoksa, dosyanın sonuna kadar ekleyin:

     

vm.swappiness=10

     

Dosyayı kaydedin ve yeniden başlatın.

Ayrıca kontrol edebilirsiniz: İşte

    
verilen cevap jpetersen 30.06.2012 01:10
83

Sorunuzun birkaç farklı yönü var.

Öncelikle, "özgür" tanımınız nedir? Aslında Linux'taki (veya herhangi bir modern işletim sisteminde) olduğu kadar basit değil.

Linux RAM'i nasıl kullanır (çok basitleştirilmiş)

Her uygulama hafızanızın bir kısmını kullanabilir. Linux, "önbellek" olarak başka türlü kullanılmayan tüm belleği (son birkaç Mb hariç) kullanır. Bu sayfa önbelleği, inode önbellekleri, vb. İçerir. Bu iyi bir şeydir - yığınları hızlandırmaya yardımcı olur. Her ikisi de diske yazma ve diskten okuma, önbellek tarafından büyük ölçüde hızlandırılabilir.

İdeal olarak, tüm uygulamalarınız için yeterli belleğiniz var ve önbellek için hala yüzlerce Mb kaldı. Bu durumda, uygulamalarınız bellek kullanımını artırmıyorsa ve sistem önbellek için yeterli alan almıyorsa, herhangi bir takasa gerek yoktur.

Uygulamalar daha fazla RAM istediğinde, önbellek tarafından daraltılarak önbellek tarafından kullanılan alanın bir kısmına gider. Önceden ayırma önbelleği, gerçek zamanlı olarak gerçekleştirilebilecek kadar ucuz ve kolaydır - önbellekte yer alan her şey ya diskte bulunan bir şeyin yalnızca ikinci bir kopyasıdır, bu yüzden anında ayrılabilir, ya da sonraki birkaç saniye içinde diski temizlemek zorunda kaldı yine de .

Bu, Linux'a özgü bir durum değildir - tüm modern işletim sistemleri bu şekilde çalışır. Farklı işletim sistemleri boş RAM'i farklı bir şekilde rapor edebilir: bazıları önbelleği "ücretsiz" olarak gördüklerinin bir parçası olarak içerir ve bazıları olmayabilir.

Ücretsiz RAM hakkında konuştuğunuzda, include önbellek için çok daha anlamlı, çünkü pratik olarak ücretsizdir - herhangi bir uygulama bunu talep etmelidir. Linux'ta, free komutu bunu iki yolla bildirir - ilk satırda kullanılan RAM sütunundaki önbellek bulunur ve ikinci satırda boş sütunda önbellek (ve tamponlar) bulunur.

Linux takas nasıl kullanır (daha da basitleştirilmiş)

Düzgün çalışan bir önbellek için yeterli miktarda yeterli bellek kalmadığında, Linux kullanılmayan bazı uygulama belleğini RAM'den takas alanına yeniden ayırmaya karar verebilir.

Kesin bir kesime göre bunu yapmaz. Tahsisin belli bir yüzdesine ulaştığınız gibi değil, Linux değiş tokuş etmeye başlar. Oldukça "bulanık" bir algoritmaya sahiptir. “Bellek ayırma için ne kadar baskı var” diye tanımlanabilecek pek çok şey hesaba katılır. Yeni bellek tahsis etmek için bir çok "basınç" varsa, o zaman daha fazla oda yapmak için bazılarının değiştirilmesiyle şans artacaktır. Eğer daha az "basınç" varsa o zaman bu şansı azaltacaktır.

Sisteminizde bu "basınç" ın nasıl hesaplandığını ayarlamanıza yardımcı olan bir "swappiness" ayarı var. Bunu normalde değiştirmeniz kesinlikle tavsiye edilmez ve bunu değiştirmenizi tavsiye etmem. Takas işlemi genel olarak çok iyi bir şeydir - performansa zarar verdiği birkaç kenar durumu olsa da, genel sistem performansına baktığınızda çok çeşitli görevler için net bir avantajdır. Takas miktarını azaltırsanız, önbellek miktarının gerçekten faydalı olabilse bile, aksi halde olduğundan biraz daha fazla küçülmesine izin vermiş olursunuz. Bu, takas ile yaşadığınız her türlü sorun için yeterince iyi bir ticaret olup olmadığını size kalmış. Ne yaptığını bilmelisin, hepsi bu.

Değiştirme işleminin bir masaüstü sistemde performansa gerçekten zarar verdiği bilinen bir durum vardır ve bu, uygulamaların uzun bir süre boşta bırakıldıktan ve IO'da arka plan işlemleri yoğunlaştırıldıktan sonra yeniden kullanıcı girdisine ne kadar hızlı yanıt verebileceğidir. Bir gecede yedekleme gibi) çalıştırın. Bu çok görünür bir durgunluktur, ancak takasın hepsini bir arada kapatarak ve herhangi bir işletim sisteminde önlenmesi çok zor bir şekilde yeterli değildir. Yedekleme / virüs taraması gerçekleşmediği taktirde, takas ve bu başlangıç ​​boşluğunu kapatın, ancak sistem tüm gün boyunca biraz daha yavaş çalışabilir. Bu, Linux ile sınırlı olan bir durum değildir.

Diske takılacak olanı seçerken, sistem aslında kullanılmayan, okunan veya yazılan belleği seçmeye çalışır. Çoğu zaman seçenleri hesaplamak için oldukça basit bir algoritmaya sahiptir.

Çok miktarda RAM'iniz olduğu bir sisteminiz varsa (yazarken, tipik bir Linux dağıtımı için 8GB büyük bir miktardır), çok nadiren takasın gerekli olduğu bir duruma varacaksınız. Takas yapmayı bile deneyebilirsiniz. Bunu yapmayı asla önermem, ama sadece bir uygulamanın çökmesinden daha fazla RAM'in sizi ne zaman kurtaracağını asla bilemezsiniz. Ancak, buna ihtiyacınız olmayacağını biliyorsanız, yapabilirsiniz .

Ancak takas sistemimi nasıl hızlandırabilir? Yavaş şeyler değişmez mi?

RAM'den veri aktarımına aktarma eylemi yavaş bir işlemdir, ancak yalnızca çekirdeğin genel yararının bundan daha fazla olduğundan emin olduğunda çekilir. Örneğin, uygulama belleğiniz neredeyse hiç önbelleğe sahip olmadığınız ve I / O'nuzun bu nedenle çok verimsiz olduğu noktaya yükselmişse bile, biraz bellek boşaltarak sisteminizden çok daha fazla hız alabilirsiniz. Verileri değiştirmek için ilk önce swapping verilerinden sonra.

Ayrıca, uygulamalarınızın gerçekte sahip olduğunuzdan daha fazla daha fazla bellek istese de son çare. Bu durumda, genellikle bir uygulamanın çökmesine veya zorla öldürülmesiyle sonuçlanacak bir bellek yetersizliği durumunun önüne geçmek için takas yapılması gerekir.

Takas sadece sisteminizin yetersiz performans gösterdiği zamanlarla ilişkilidir , çünkü kullanılabilir RAM'inizin tükendiği zamanlarda meydana gelir, bu da sisteminizi yavaşlatır (veya kararsız hale getirir). takasın yoktu. Bu nedenle, işleri basitleştirmek için, takas işlemi olur, çünkü sisteminizin diğer yollardan ziyade batağa dönüştüğünü görür.

Veriler takas edildiğinde, tekrar ne zaman çıkıyor?

Verilerin takas dışına aktarılması, (geleneksel sabit diskler için, en azından) olduğu gibi, onu içine koymak da zaman alıcıdır. Anlaşılır bir şekilde, çekirdeğiniz, özellikle de gerçekte kullanılmıyorsa (örn. Okunduğunda veya yazıldığında), verileri takastan çıkarmak konusunda isteksiz olacaktır. Takas halinde verileriniz varsa ve kullanılmıyorsa, takas olarak kalması iyi bir şeydir, çünkü sisteminizi hızlandıran kullanılan diğer şeyler için daha fazla bellek ayırır.

    
verilen cevap thomasrutter 04.07.2012 05:50
21

Takas değerinin ayarlanması her durumda çalışmaz. Eğer senin için çalışıyorsa, harika. Aksi halde, takas işlemini periyodik olarak kapatmak ve tekrar açmak için bir komut dosyası yazdım.

Dikkatli değilseniz, takas değiştirme işlemi biraz risklidir. Eğer RAM'de her şeyi tutmak için yeterli boş RAM'iniz yoksa artı takastaki her şey, takas devreden çıkarmaya çalışmak sisteminizin yanıt vermemesine neden olur. Komut dosyası ilk önce yeterli boş RAM olup olmadığını kontrol eder (biraz boş alır, gerçek boş RAM miktarı free 'den ne kadar farklı olursa olsun), sonra sadece takas değiştirirse geçiş yapar. Ancak, RAM üzerinde biraz kısasa, komut dosyası çalışırken başka bir önemli işlem başlatmayın. İşte:

#!/bin/bash

# Make sure that all text is parsed in the same language
export LC_MESSAGES=en_US.UTF-8
export LC_COLLATE=en_US.UTF-8
export LANG=en_US.utf8
export LANGUAGE=en_US:en
export LC_CTYPE=en_US.UTF-8

# Calculate how much memory and swap is free
free_data="$(free)"
mem_data="$(echo "$free_data" | grep 'Mem:')"
free_mem="$(echo "$mem_data" | awk '{print }')"
buffers="$(echo "$mem_data" | awk '{print }')"
cache="$(echo "$mem_data" | awk '{print }')"
total_free=$((free_mem + buffers + cache))
used_swap="$(echo "$free_data" | grep 'Swap:' | awk '{print }')"

echo -e "Free memory:\t$total_free kB ($((total_free / 1024)) MB)\nUsed swap:\t$used_swap kB ($((used_swap / 1024)) MB)"

# Do the work
if [[ $used_swap -eq 0 ]]; then
    echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $total_free ]]; then
    echo "Freeing swap..."
    swapoff -a
    swapon -a
else
    echo "Not enough free memory. Exiting."
    exit 1
fi

Bu komut dosyasını root olarak çalıştırmalısınız (ör. sudo ile). Bu betik sisteminizi yanıt vermeyecek; Yetersiz RAM'iniz varsa, takas değiştirmeyi reddeder. Bu senaryoyu şu ana kadar beş yıldan beri problemsiz kullanmıştım.

    
verilen cevap Scott Severance 04.07.2012 04:38
4

Genellikle takas, günümüzün sistemlerinde kullanılmaz. Tecrübemde yoğun operasyonlar olmaksızın uzun süredir devam eden süreçler linux tarafından değiştirilmekte.
Etkilenen birkaç programın yavaş çalışmasını sağlar.
Çok fazla raminiz yoksa, taksiyi çalıştırarak takası kapatabilirsiniz:
swapoff -av (bunun için sudo haklarına ihtiyacınız olacaktır.)
Takastan hoşlanmıyorsanız, simetrik komut kullanarak açabilirsiniz:
swapon -av (yine sudo gereklidir).

    
verilen cevap drake01 30.06.2012 00:24
3

Bir program için swap kullanıldıktan sonra programın ömrü için haritalanmış kalmaya eğilimlidir. Pek çok programda nadiren kullanılan kod (ve veriler) bulunur. Hafıza değiştirildikten sonra değiştirilemez.

Bu sayfaları belleğe zorlamanın bir yolu, takas aygıtını kapatmaktır. İki tane varsa, bir tane kapatabilirsin, tekrar açabilirsin, sonra ikincisini kapatabilirsin. Takas gerçekten gerekli ise, cihazlar arasında hareket edecektir. Takas cihazını (veya dosyayı) kapatabilirsiniz, ancak eğer gerçekten takas alanına ihtiyacınız varsa, çok büyük şeyler olabilir.

Hafızadaki normal şeylerin yanı sıra, tempfs takas alanını kullanır ve kalan bellek gibi değişecektir. Çok fazla geçici disk gerektiren bir şey çalıştırırsanız, sayfaların değiştirilmesine zorlanabilir. Oluşturulduktan sonra temp dosyaları birkaç dakika sonra kullanılamaz ve takas cihazına taşınacak iyi adaylar olabilir.

Bir çimdik içinde bir dosyayı takas cihazı olarak kullanabilirsiniz. Geçici olarak ekstra takas alanına ihtiyacınız varsa bu yararlıdır.

    
verilen cevap BillThor 30.06.2012 06:02
2

Zaten toplam kullanılabilir bellek alanı içeren ücretsiz daha yeni sürümleriyle eşleştirmek için Scott Severance komut dosyasının düzenledim.

#!/bin/bash

free_mem="$(free | grep 'Mem:' | awk '{print }')"
used_swap="$(free | grep 'Swap:' | awk '{print }')"

echo -e "Free memory:\t$free_mem kB ($((free_mem / 1024)) MiB)\nUsed swap:\t$used_swap kB ($((used_swap / 1024)) MiB)"
if [[ $used_swap -eq 0 ]]; then
    echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $free_mem ]]; then
    echo "Freeing swap..."
    sudo swapoff -a
    sudo swapon -a
else
    echo "Not enough free memory. Exiting."
    exit 1
fi
    
verilen cevap derberlinersmurf 03.10.2017 15:37

Etiketlerdeki diğer soruları oku