Çok fazla boş RAM olmasına rağmen neden takas kullanılıyor?


208

Takas işleminin tümünün RAM doluyken geçici bir depolama güvenliği ağı gibi davranmak olduğunu düşündüm, ancak takas bölümüm bazen 3GB kadar boş RAM'im olsa bile sürekli kullanılıyor. Bu normal mi?


3
Aşağıdaki komutların içerik veya çıkış paylaşan Lütfen / dosyaların daha iyi sorununuzu çözmemize yardımcı olacak ( bu yanıtında talimatlar ) : free -m,top -b 1
imsi

Soruyu yarın bu komutların pastebinleriyle güncelleyeceğim Bu :( şu an 0:00 var
Mysterio

Eklemek için başlığını düzenlemeliyim "... ama şu anda bakım için fazla uykum var, bu yüzden siz
ish

Yanıtlar:


188

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

Gönderen Ubuntu'nun Takas SSS :

Değişmezlik nedir ve nasıl değiştiririm?

Değişim parametresi, çekirdeğin, işlemleri fiziksel bellekten ve değiştirme diskine taşıma eğilimini kontrol eder. Diskler RAM'den çok daha yavaş olduğundan, işlemler çok agresif bir şekilde bellekten taşınırsa, sistem ve uygulamalar için daha yavaş yanıt sürelerine neden olabilir.

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

  2. swappiness = 0, çekirdeğe, işlemleri fiziksel bellekten mümkün olduğunca uzun süre değiştirmekten kaçınmasını söyler. Çekirdek 3.5 ve daha yeni sürümler için takas özelliğini devre dışı bırakır.

  3. swappiness = 100, çekirdeğe, işlemleri fiziksel bellekten agresif bir şekilde takas etmesini ve önbellek takas ettirmesini bildirir.

Ubuntu’da varsayılan ayar swappiness = 60’tır. Varsayılan takas değerinin azaltılması, tipik bir Ubuntu masaüstü kurulumunda genel performansı artıracaktır. Bir takas değeri = 10 önerilir, ancak deneme yapmaktan çekinmeyin. Not: Ubuntu sunucu kurulumlarının masaüstü sistemlere göre farklı performans gereksinimleri vardır ve 60'ın varsayılan değeri muhtemelen daha uygundur.

Değişim değerini kontrol etmek

cat /proc/sys/vm/swappiness

Değişkenlik değerini değiştirmek için Değişkenlik değeri 10 olan geçici bir değişiklik (yeniden başlatıldığında kaybedilen) 10

sudo sysctl vm.swappiness=10

Bir değişikliği kalıcı hale getirmek için , en sevdiğiniz editör ile yapılandırma dosyasını düzenleyin:

gksudo gedit /etc/sysctl.conf

Vm.swappiness ifadesini arayın ve değerini istediğiniz gibi değiştirin. Vm.swappiness yoksa, dosyayı sonuna gibi ekleyin:

vm.swappiness=10

Dosyayı kaydedin ve yeniden başlatın.

Ayrıca kontrol edebilirsiniz: https://askubuntu.com/a/103916/54187


1
Boşta spekülasyon: bu aslında performans için faydalı olabilir - bir süredir erişilmemiş olan sayfalar, takas alanına kopyalanabilir, bu da işletim sisteminin belleğe ihtiyacı olursa hızlı bir şekilde tahliye etmesini sağlar, ancak sayfa içeriği bellekte kalır .
Simon Richter

7
@SimonRichter Evet bu fikir. 60'ın takası muhtemelen modern sistemlerde çok saldırgandır, çünkü bu, hala birkaç konser boş hafızaya sahip olduğunuzda takas etmeye başladığınız anlamına gelir.
Brendan Long

1
sudo sysctl --load=/etc/sysctl.confDeğişiklikleri uygulamak için dosyayı düzenledikten sonra çalıştırın
deFreitas

92

Sorunuzun birkaç farklı yönü var.

Öncelikle, "özgür" tanımınız nedir. Aslında Linux'ta (veya herhangi bir modern işletim sisteminde) göründüğü kadar basit değildir.

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

Her uygulama hafızanızın bir kısmını kullanabilir. Linux boş kalan tüm belleği (son birkaç Mb hariç) "önbellek" olarak kullanır. Bu, sayfa önbelleğini, inode önbelleklerini vb. İçerir. Bu iyi bir şeydir - yığın yığınlarını hızlandırmaya yardımcı olur. Hem diske yazma hem de diskten okuma, büyük ölçüde önbellekle hızlandırılabilir.

İdeal olarak, tüm uygulamalarınız için yeterli belleğe sahip olursunuz ve önbellek için hala birkaç yüz Mb kalmış demektir. Bu durumda, uygulamalarınız hafıza kullanımlarını arttırmadığı ve sistem önbellek için yeterli alan almadığı sürece, herhangi bir takas işlemine gerek kalmaz.

Uygulamalar daha fazla RAM talep ettiğinde, önbellek küçülterek önbellek tarafından kullanılan alanın bir kısmına girer. Önbelleği ayırmak, basit ve gerçek zamanlı olarak yapılabilecek kadar ucuz ve kolaydır - önbellekte yer alan her şey, zaten diskte olan bir şeyin ikinci bir kopyasıdır, bu nedenle anında tahsis edilebilir veya Zaten önümüzdeki birkaç saniye içinde diske temizlemek zorunda kaldı .

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

Boş RAM hakkında konuşurken , önbellek eklemek çok daha anlamlı çünkü pratikte ücretsiz - herhangi bir uygulamanın talep etmesi durumunda kullanılabilir. Linux'ta freekomut her iki yolu da bildirir - ilk satır kullanılan RAM sütununda önbellek içerir, ikinci satır ise boş sütunda önbellek (ve tamponlar) içerir.

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

Düzgün çalışan bir önbellek için yeterli alan kalmadığında yeterli miktarda bellek kullandığınızda, Linux kullanılmayan uygulama hafızasını RAM'den değiştirilebilir duruma getirmeye karar verebilir.

Bunu kesin bir kesime göre yapmaz. Belirli bir tahsisat yüzdesine ulaşmak gibi değil, sonra Linux değişmeye başlar. Oldukça "bulanık" bir algoritması var. En çok "hafıza tahsisi için ne kadar baskı var" ile tanımlanabilecek birçok şeyi dikkate alır. Yeni bellek tahsis etmek için çok fazla "baskı" varsa, o zaman daha fazla yer açmak için bazılarının değişme olasılığı artacaktır. Daha az "baskı" varsa, bu şansı azaltacaktır.

Sisteminizde, bu "baskının" nasıl hesaplanacağını ayarlamanıza yardımcı olacak bir "takas" ayarı vardır. Normalde bunu tamamen değiştirmeniz tavsiye edilmez ve değiştirmenizi tavsiye etmem. Değişim genel olarak çok iyi bir şey - performansa zarar verdiği birkaç yeni durum olmasına rağmen, genel sistem performansına bakarsanız, çok çeşitli görevler için net bir avantajdır. Değişimi azaltırsanız, önbellek miktarının, gerçekten yararlı olsa bile, diğerlerinden biraz daha fazla küçülmesine izin verirsiniz. Bunun değiş tokuşla ilgili sorunlarınız için yeterince iyi bir takas olup olmadığı size bağlıdır. Sadece ne yaptığını bilmelisin, hepsi bu.

Bir takasın bir masaüstü sistemindeki algılanan performansı gerçekten zedelediği ve uygulamaların uzun süre boşta kaldıktan ve arka plan işlemlerini IO'da ağır tuttuktan sonra kullanıcı girişine tekrar cevap verebildiği iyi bilinen bir durum vardır (örneğin, gecede yedekleme). Bu çok göze çarpan bir durgunluk, ancak tüm işletim sistemlerinde değiş tokuşun bir arada yapılmasının gerekçesini haklı çıkarmak için yeterli değil. Değişimi kapatın ve yedekleme / virüs taramasından sonra ortaya çıkan bu başlangıç ​​durgunluğu olmayabilir, ancak sistem gün boyu biraz daha yavaş çalışabilir. Bu da Linux ile sınırlı bir durum değil.

Neyin diske değiştirileceğini seçerken, sistem aslında kullanılmayan bir bellek almaya çalışır - okunan veya yazılan. Bunu çoğu zaman iyi seçen bir hesaplama için oldukça basit bir algoritması vardır.

Çok miktarda RAM'e sahip olduğunuz bir sisteminiz varsa (yazma sırasında, 8GB tipik bir Linux dağıtımı için çok büyük bir miktar), o zaman çok nadiren takas uygulamasının gerektiği bir duruma varacaksınız. Takası kapatmayı bile deneyebilirsiniz. Bunu yapmayı asla tavsiye etmiyorum, ancak yalnızca daha fazla RAM'in bazı uygulamaların çökmesinden ne zaman kurtaracağını asla bilemeyeceğiniz için. Ama ihtiyacın olmayacağını biliyorsan, yapabilirsin .

Peki takas sistemimi nasıl hızlandırabilir? Yavaş yavaş şeyler değişmiyor mu?

RAM'den takas için veri aktarma işlemi yavaş bir işlemdir, ancak yalnızca çekirdeğin genel faydadan daha ağır çıkacağından emin olması durumunda alınır. Örneğin, uygulama hafızanız neredeyse hiç önbellek kalmadıysanız ve G / Ç’niz bu nedenle çok verimsiz hale gelmişse, aslında biraz hafıza boşaltarak sisteminizden daha fazla hız alabilirsiniz. Verilerin serbest bırakılması için ilk takas işleminden sonra.

Aynı zamanda, uygulamalarınızın gerçekte olduğundan daha fazla bellek talep etmesi durumunda da son çaredir . Bu durumda, bir uygulamanın çökmesine veya zorla öldürülmek zorunda kalmasına neden olacak bir bellek yetersizliği durumunun önlenmesi için değiştirme gereklidir.

Değiştirme, yalnızca sisteminizin düşük performans gösterdiği zamanlarla ilişkilidir , çünkü kullanılabilir RAM kullanmıyorsanız, bu durum sisteminizi yavaşlatır (ya da kararsız hale getirir) olmasa bile sisteminizin yavaşlamasına neden olur. Bu yüzden işleri kolaylaştırmak için takas etme gerçekleşir çünkü sisteminiz tersine değil, tıkanmaya başlamıştır.

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

Verileri değiş tokuş dışına aktarmak (en azından geleneksel sabit diskler için), onu koymak kadar zaman alıcıdır. Bu yüzden anlaşılır bir şekilde, çekirdeğiniz, özellikle gerçekte kullanılmıyorsa (yani okuma veya yazma) verileri takastan çıkarmak için isteksiz olacaktır. Eğer takas verileri var ve bu kullanılan değilse, o zaman başka şeyler için daha fazla bellek bırakır çünkü, takas kalmasını aslında iyi bir şey vardır potansiyel sistemi hızlandırmak, kullanılmakta olan.


5
Ayrıntılı açıklama için +1. Ayrıca bilgisayarımda 2GiB takas bulundurmak istiyorum. Eğer bir şeyler kötüye giderse - bellek sızıntısı, vs. Performans aracı olmasının yanı sıra bir güvenlik ağıdır.
Joe,

1
Sadece 2GB RAM olan netbook'umda 4GB değiş tokuş yapabiliyorum. Bunun nedeni, netbook'u amaçlanandan çok daha fazla kullanmam ve programlarımın sıklıkla 2GB'tan fazla bellek gerektirmesidir. Linux, yetersiz bellek durumlarında çok zayıf davrandığından, büyük bir güvenlik ağına sahip olmayı tercih ederim. Ve bol miktarda disk alanım var.
Scott Severance

Programlarınız sık sık 2GB'tan fazla bellek gerektiriyorsa, içeride daha fazla RAM takmayı düşünürdüm (çok ucuz!) Çünkü yorucu RAM performansa zarar verecek. Diğer okuyucuların yararı için: sadece mevcut RAM'i takması gereken önbellek belleğine bakmadığınızdan emin olun - diğer referanslara bakın free -m.
thomasrutter

2
@neon_overload: HP'ye göre netbookumun maksimum RAM'ının 1GB olduğunu unutmam gerekiyor. Şuanda 2GB var ve internet kaynakları 2GB'ın gerçek maksimum olduğunu gösteriyor. Böylece bu tür geçici çözümlere ihtiyaç duyulmaktadır.
Scott Severance

@thomasrutter: Cevabınız büyük sunucular için nasıl değişiyor? Hangi takas ayarını ve hangi boyut takas bölümünü önerirsiniz?
chrisinmtown

24

Değişkenlik değerini ayarlamak her durumda işe yaramaz. İşe yararsa, harika. Değilse, takas işlemlerini kapatıp tekrar açarak düzenli aralıklarla temizlemek için bir komut dosyası yazdım.

Dikkatli olmazsanız takas değiştirmek biraz risklidir. RAM her şeyi tutmak için yeterli boş RAM yoksa artı takas sistem yanıt veremez duruma gelmesine neden olacaktır devre dışı bırakmaya çalışıyor, takas her şey. Komutum ilk önce yeterli boş RAM olup olmadığını kontrol eder (ki bu işlem, gerçek boş RAM miktarı, ücretsiz freeraporlananlardan farklıdır ), sonra sadece eğer öyleyse değiştirir. Ancak, eğer RAM'de biraz kısaysanız, script çalışırken başka bir önemli işleme başlamayın. İşte burada:

#!/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 $4}')"
buffers="$(echo "$mem_data" | awk '{print $6}')"
cache="$(echo "$mem_data" | awk '{print $7}')"
total_free=$((free_mem + buffers + cache))
used_swap="$(echo "$free_data" | grep 'Swap:' | awk '{print $3}')"

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 betiği root olarak çalıştırmalısınız (örneğin, ile sudo). Bu komut dosyası sisteminizi yanıt vermiyor; Eğer yetersiz RAM varsa, takas değiştirmeyi reddeder. Bu senaryoyu beş yıla yakın bir süredir problemsiz kullandım.


Komut dosyası için +1. Çıktılarda MB'yi MiB'ye değiştirerek biraz modernize etmek isteyebilirsiniz. Benzer bir senaryo ekledim tüm (iyi) güvenlik testleri olmadan yazdım. Takasın çok kullanıldığı eski defterimde çalışması bir süre sürdü - bir ya da iki dakika, ama hiçbir şey zarar vermedi. Bir süre sonra başarısız olur, çünkü çalışması için yeterli boş hafıza yoktu, ancak bu herhangi bir ek sorun yaratmadı. Olanları temizlemek için yeniden başlatmak zorunda kaldım. İletimde bir bellek sızıntısı gibi görünen şeyle ilgiliydi (sabit olduğundan beri, inanıyorum) ve sadece 2GiB ram'a sahip olmak.
Joe,

6
Bir şey değiş tokuş edilmek üzere taşındıysa ve değiş tokuş halinde kalırsa, normalde bu iyi bir şeydir - bu verilerin gerçekten kullanılmadığı anlamına gelir ve RAM'in bir kısmı diğer şeyler için serbest bırakılır ve bu da hızda potansiyel bir artışa neden olur. Bu verilerin değiş tokuş edilmemesi ve bunun yerine daha değerli RAM kullanması gerektiğine inanmanıza neden olan şey nedir? Genellikle çekirdek kullanılmayanları ve RAM'i serbest bırakmak için takas halinde kalabileceklerini bilmekte oldukça başarılıdır.
thomasrutter,

@neon: Makinelerimin sırasıyla 2GB ve 3GB RAM'e sahip olduğunu ve bu günlerde oldukça küçük olduğunu unutmayın. Kanıt performansta. Örneğin, menüleri açmak veya programları değiştirmek, Compos visoal etkilerinde olduğu gibi, takas nedeniyle yavaş olabilir. Bu yavaşlık, takas değiştirilerek iyileştirilir, böylece en azından bazı durumlarda çekirdek optimizasyon algoritmalarının en düşük düzeyde olduğunu gösterir. Tekrarlanan deneyimlerle tartışamam.
Scott Severance,

Uf !! Bu sadece takasın% 0'ına yükseldi .... Bu tam soruyu ve cevabını araştırmak için fazla zamanım olmadı ama biraz boş zamanım olduğunda okumak için favorim oldu.
AzkerM

Neden takaslılığı düşük bir değere ayarlamıyorsun? Bu senaryoyla aynı şeyi yapıyor gibi görünüyor, ama çok daha kontrollü bir şekilde.
jhfrontz

4

Genellikle takas günümüzde sistemlerde kullanılmamaktadır. Tecrübelerime göre, yoğun operasyonlar olmadan uzun süredir devam eden işlemler, linux tarafından değiş tokuş ediliyor.
Birkaç etkilenen programın yavaş çalışmasını sağlar.
: Özgür ram sürü varsa, komutu çalıştırarak takas kapanabilir
swapoff -av(ihtiyacınız sudobunun için hak.)
Kapalı takas beğenmezseniz, sen simetrik komutunu kullanarak, bunu devreye girebilir:
swapon -av( tekrar sudogerekli).


12
Swapiness = 0 aynı şeyi yapar, ama daha güvenli beri tamamen kapalı takas Torna (eğer varsa overkill yapmak bellekte çok fazla malzeme ile sona, bu takas şey atacağım).
Brendan Long,

@BrendanLong Adil nokta .. Bana öğrettiğiniz için teşekkürler. :)
drake01

3

Bir program için takas bir kez kullanıldığında, programın ömrü boyunca haritalanmış kalma eğilimindedir. Birçok program, nadiren kullanılan kodlara (ve verilere) sahiptir. Bellek değiştirildikten sonra, değiştirilemez.

Bu sayfaları belleğe zorlamanın bir yolu takas cihazını kapatmaktır. Eğer iki tane varsa, birini kapatabilir, tekrar açıp ikincisini kapatabilirsiniz. Eğer takas gerçekten gerekliyse, cihazlar arasında hareket edecektir. Takas cihazını (veya dosyayı) kapatabilirsiniz, ancak gerçekten takas alanına ihtiyacınız varsa ciddi şeyler olabilir.

Hafızadaki normal şeylerin yanı sıra, tempfs takas alanı kullanır ve kalan hafıza gibi değiş tokuş eder. Çok fazla geçici disk gerektiren bir şey çalıştırırsanız, sayfaların değişmesine neden olabilir. Oluşturulduktan sonra temp dosyaları artık birkaç dakika sonra kullanılamaz ve takas cihazına taşınacak iyi adaylardır.

Bir tutam içinde bir dosyayı takas aygıtı olarak kullanabilirsiniz. Bu, geçici olarak fazladan takas alanına ihtiyaç duyduğunuzda faydalıdır.


2

Ben düzenlenmiş Scott Kıdem senaryoyu zaten mevcut toplam bellek alanını kapsar ücretsiz yeni sürümlerini eşleşecek.

#!/bin/bash

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

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
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.