RAM'de yeterince boş alan varken neden takas kullanıyorsunuz?


124

Kullanılması takas olabilir yerine RAM alanı büyük ölçüde yavaşlatmak bir PC.

Öyleyse neden, yeterli RAM'den fazlasına sahip olduğumda, Linux sistemim (Arch) takası kullanıyor?

Aşağıdaki conky çıkışımı satın al:

conky çıkışı

Ayrıca, bu benim yaşadığım hız ve sisteme duyarlılık sorunlarının nedeni olabilir mi?

Çıktı free -m:

$ free -m
             total       used       free     shared    buffers     cached
Mem:          1257       1004        252          0         51        778
-/+ buffers/cache:        174       1082
Swap:          502        144        357

5
SSD'lerin norm haline gelmesiyle bu konunun dinamiklerini önemli ölçüde değiştirdi eminim. Normal tüketici SSD'niz RAM'den çok daha yavaş olsa da, şimdi daha ucuz olanı - RAM $ / GB veya SSD $ / GB. SSD daha yavaş iken daha ucuzdur ve çoğu durumda yeterince hızlı olduğundan, takas bile olsa, rotasyonlu ortamlarda olduğu gibi kullanıcı deneyimini önemli ölçüde rahatsız etmemelidir.
lkraav

7
Bazen, tam RAM nedeniyle geçmişte swap kullandıysanız , daha önce değiştirilmiş verilerin orada kaldığı bir durum olabilir, çünkü şu anda faydalı veriler değildir.
Totor,

1
Totor'un dediği gibi. Bazen sistem bir şey gösterecektir (sebep ne olursa olsun). Daha sonra bu sayfa okuma işlemi için tekrar belleğe taşınırsa, takas alanındaki kopya silinmez. Aynı sayfa daha sonra tekrar sayfalandırılırsa, değiştirilmeden, diske tekrar yazmadan bunu yapabilir. Buradaki kopya zaten güncel. Başka bir deyişle, bir sayfa hem takas halinde hem de ana bellekte yer kaplayabilir.
izak

Yanıtlar:


93

Linux sistemleri kullanmak normaldir bazı hala orada serbest RAM bile takas. Linux çekirdeği, nadiren kullanılan bellek sayfalarını değiştirmek için hareket edecektir (örneğin, gettyyalnızca X11 kullandığınızda, ve bazı diğer etkin olmayan arka plan programlarında).

Değiştirme alanı kullanımı yalnızca yeterli RAM bulunmadığında bir sorun haline gelir ve çekirdek, uygulamaları sürekli çalışır halde tutmak için bellek sayfalarını sürekli olarak değiştirip RAM'e geri taşımak zorunda kalır. Bu durumda, sistem monitörü uygulamaları çok fazla disk G / Ç etkinliği gösterecektir.

Karşılaştırma için, her ikisi de GNOME masaüstünü çalıştıran X11 oturumlarıyla oturum açan iki kullanıcılı Ubuntu 10.04 sistemim ~ 600 MB takas ve ~ 1GB RAM (arabellek ve fs önbellek saymaz) kullanıyor, bu yüzden takas için rakamlarınızın olduğunu söyleyebilirim kullanım normal görünüyor.


39
Etkin olmayan programları değiştirerek, dosya önbelleği için daha fazla belleğiniz olur. Ve bu işleri hızlandırıyor.
jmanning2k

91

Bu davranış, değeri ayarlanarak yapılandırılabilir:

/proc/sys/vm/swappiness

Varsayılan değer 60'tır. 0'a ayarlamak, hala RAM kaldıysa ve 100'ü mümkün olan en kısa sürede bellek değiştirdiğinde asla takas kullanmamak anlamına gelir.

Değeri geçici olarak değiştirmek için (yeniden başlatma sırasında kayboldu):

sudo sysctl vm.swappiness=10

Değeri kalıcı olarak değiştirmek için dosyayı düzenleyin:

/etc/sysctl.conf

root olarak (örneğin sudo nano /etc/sysctl.conf) ve (varsa) satırını değiştirin veya ekleyin:

vm.swappiness

İstenilen değere Bu dosya mevcut değilse (örneğin, Arch Linux'ta), /etc/sysctl.d/99-sysctl.confbunun yerine deneyin .

Boş hafıza ile takas yapmanın iyi ya da kötü olup olmadığı konusunda bazı tartışmalar oldu, ancak Ubuntu'nun yardımı, Masaüstü sistemler için 10 değerini tavsiye ediyor . Ayrıca , CentOS için Dijital Okyanus hakkındaki bu eğitime bakın .


27
Değişkenliğin azaltılmasının mutlaka bir performans veya duyarlılık artışı anlamına gelmediğine dikkat edin . Daha iyi performansa dönüşen swappiness artış raporları gördüm . Okuduğunuz herhangi bir ölçüt içermeyen bir şeye inanmayın ve ölçütlerin sizinkine benzer bir iş yükü kullandığını kontrol edin.
Gilles

Bu yeniden başlatma boyunca devam ediyor mu? Her önyüklemede proc yenilendi diye düşündüm.
HandyGandy

@HandyGandy: Cevaba, kalıcı olarak nasıl değiştirileceğime dair bilgi ekledim.
Marcel Stimberg

@HandyGandy: bilgili olmak için, / proc her önyüklemede yeniden oluşturulmaz, ancak proc sanal bir dosya sistemidir, bu yüzden onlara eriştiğinizde yalnızca "üretilir". Diskte hiç yok.
Yalan Ryan,

swappinessdeğerin sistemime etkisi yoktur. 0'a ayarlanması bile, 2GB serbest ram olduğunda önemli ve sık kullanılan sayfaları (örn. IDE dizinim) değiştirmeye devam edecektir.
chefarov

46

Linux, RAM doldurulmadan önce değişmeye başlar. Bu, performansı ve yanıt verebilirliği artırmak için yapılır:

  • Performans artmıştır, çünkü bazen RAM, disk belleği için program belleğini depolamaktan daha iyi kullanılır. Bu nedenle, bir süre etkin olmayan bir programı değiştirmek ve sık kullanılan dosyaları önbellekte tutmak daha iyidir.

  • Duyarlılık, bellek dolu olduğunda ve bazı programların çalışmakta olduğu ve bir görevi tamamlamak için daha fazla RAM isteğinde bulunmak yerine, sistem boştayken sayfaları değiştirerek geliştirilir.

Değişim, sistemi yavaşlatır, elbette - ama değişimin alternatifi değişmez, daha fazla RAM veya daha az RAM kullanır.


Yani, bir anlamda, takas durum -içi bir önlemdir? Bu ve kış uykusu olayı mı?
tshepang

@Tshepang: Sanal belleğinize sığacak kadar takas olması “durumda” değil, gerekli (aksi takdirde programlarınız bellek yetersizliğinden dolayı çökecektir).
Gilles

1
@Tschepang: OOM katili, çökmelerinin nedeni. (Teknik olarak bir OOM katili olmadan yapabilir ve hiçbir şeyi tahsis edemezsiniz, ancak bu, sistemi kilitleme şansına sahip olur; OOM katili, yöneticinin giriş yapmasını ve önemli süreçlerin devam etmesini sağlamak için.)
Gilles

1
Anladığım kadarıyla "bellek boşken değil, sistem boştayken sayfaları değiştirmek", ancak adam RAM'in% 15'ini kullanıyor. Neredeyse dolu olmaktan uzak, değil mi? Tam RAM'in neden olduğu bir önceki takas bu durumu bırakmış olsa da ...
Totor

1
"Linux, RAM doldurulmadan önce değişmeye başlar" ne zaman? tam olarak
Yousha Aleayoub 14:17

11

Bu eski bir yazı, ancak yine de düşüncelerimi buraya koyma özgürlüğünü alırdım.

Aşağıdan başlayarak, Linux ilk önce belleği sayfalara böler (genellikle x86_64 sisteminde sayfa başına 4K). Bundan sonra, eşlemesi MMU (Bellek Yönetim Birimi) kullanılarak fiziksel bellekle yapılan sanal bellek yaratılır.

İşlemler sanal bellek alanından bellek tahsis edilir, bu nedenle lütfen unutmayın, / proc / meminfo dosyasını gördüğünüzde sanal bellek detayları olarak VMalloc * 'u göreceksiniz.

Diyelim ki bellek isteyen bir işleminiz var (diyelim 300 MB - bir web tarayıcısı). İşlem sanal bellekten 300 MB tahsis edilecektir, ancak eşleştirilmesi gerekmemektedir (fiziksel belleğe eşlenmiştir). Bellek yönetimi için "Yazma Kopyalama" kavramı vardır, bu sayede işlemleriniz gerçekten sanal bellekten tahsis edilen belleği kullanırsa (yani belleğe bir miktar yazma işlemi yapar), ancak o zaman fiziksel belleğe eşlenir. Bu, çekirdeğin çok işlemeli bir ortamda verimli şekilde çalışmasına yardımcı olur.

Önbellek nedir?

İşlemler tarafından kullanılan çok fazla bellek paylaşılıyor. Diyelim ki glibc kütüphanesi hemen hemen bütün işlemler tarafından kullanılıyor. Her işlem aynı bellek konumuna erişip işi yapabildiği zaman, birden fazla glibc kopyasını bellekte tutmanın amacı nedir. Bu sık kullanılan kaynaklar önbellekte tutulur, böylece işlemler talep edildiğinde aynı bellek konumuna yönlendirilebilirler. Bu, glibc'nin (vb.) Tekrar tekrar diskten okunması zaman alacağından işlemleri hızlandırmaya yardımcı olur.

Yukarıda belirtilenler, paylaşılan kütüphaneler için geçerliydi, benzer aynı zamanda dosya okuması için de geçerlidir. Büyük bir dosyayı ilk defa okuyorsanız (100-200 MB deyince) çok zaman alacaktı. Ancak, aynı okumayı tekrar denediğinizde, daha hızlı olur. Veriler bellekte önbelleğe alındı ​​ve tüm bloklar için yeniden okuma yapılmadı.

Tampon nedir?

Tampon söz konusu olduğunda, bir işlem dosya G / Ç yaptığında, diske veri yazmak için çekirdeğin arabelleğine güvenir. İşlemler, çekirdeğin işi yapmasını ister. Böylece, işlem adına, çekirdek, verileri "arabelleğine" yazar ve işleme yazmanın yapıldığını söyler. Eşzamansız bir şekilde, çekirdek bu verileri arabellekte diske eşitlemeye devam edecektir. Bu şekilde, süreçler diske veri senkronize etmek için doğru zamanı seçmek için çekirdeğe dayanmaktadır ve işlemler ileride çalışmaya devam edebilir. Unutmayın, bu normal işlemlerin yaptığı genel G / Ç'dir. Ancak, G / Ç'nin aslında disk üzerinde yapıldığını onaylaması gereken özel işlemler, diskte G / Ç yapmak için başka mekanizmalar kullanabilir. Açık kaynak kodlu araçlardan bazıları libaio'dur. Ayrıca, işlemler bağlamınızda açılan FD'lere açık senkronizasyon çağırmanın yolları vardır,

O zaman sayfa hataları nelerdir?

İkili yaklaşık 300 MB olan bir işlemi başlattığınızda (bir web tarayıcısı deyin) bir örnek düşünün. Bununla birlikte, 300 MB’lık web tarayıcısının ikilisi anında çalışmaya başlamaz. İşlem kodunda fonksiyonlardan fonksiyonlara geçmeye devam ediyor. Daha önce de belirtildiği gibi, Sanal Bellek 300 MB tüketilecek, ancak tümü fiziksel belleğe eşlenen bellek değildir (RSS yerleşik belleği daha az olacaktır, en üst çıktısına bakınız). Kod yürütme, belleğin fiziksel olarak eşlenmemiş olduğu bir noktaya ulaştığında, bir sayfa hatası ortaya çıkar. Çekirdek bu belleği fiziksel olarak eşleştirir, bellek sayfasını işleminizle ilişkilendirir. Böyle bir sayfa hatasına "Küçük Sayfa Hataları" denir. Benzer şekilde, bir işlem dosya yaparken, G / Ç ana sayfa hataları ortaya çıkar.

Swap Out ne zaman ve neden oluyor?

Durum 1:

Yukarıdaki ayrıntılarla aynı çizgide, iyi miktarda bellek eşlendiğinde, bir senaryoyu düşünelim. Ve şimdi hafıza gerektiren bir süreç başlıyor. Yukarıda tartışıldığı gibi, çekirdek bazı bellek haritalaması yapacaktır. Ancak, belleği eşleştirmek için yeterli fiziksel RAM yok. Şimdi, çekirdek önce önbelleğe bakacak, kullanılmayan bazı eski bellek sayfalarına sahip olacak. Bu sayfaları ayrı bir bölüme (SWAP adı verilir) temizler, bazı sayfaları boşaltır ve serbest bırakılan sayfaları gelen yeni istekle eşleştirir. Diske yazma katı hal RAM'inden çok daha yavaş olduğundan, bu işlem çok zaman alır ve bu nedenle yavaşlama görülür.

Durum 2:

Diyelim ki sistemde bir sürü boş hafıza olduğunu görelim. O zaman bile, bir sürü takas yaşandığını görüyorsunuz. Muhtemel bir hafıza parçalanması sorunu olabilir. Çekirdekten 50 MB'lık bitişik bellek gerektiren bir işlem düşünün. (akılda tutulması akılda tutulması). Açıkçası, çekirdek rasgele sayfaları farklı işlemlere ayırmış ve bazılarını serbest bırakmış olurdu. Bununla birlikte, sürekli bellek talep ettiğimizde, süreç talebini karşılayan bir yığın aramak zorunda kalacaktır. Eğer böyle bir hafızaya sahip olamıyorsa, bazı eski hafıza sayfalarını değiştirmek ve ardından bitişik olanları tahsis etmek zorunda kalacaktır. Bu gibi durumlarda bile SWAP çıkışı olur. 2.6 ve üzeri sürümlerde başlayan Kernel, bu tür parçalanma problemlerini önemli ölçüde azaltmıştır. Bununla birlikte, sistem uzun bir süredir çalışıyorsa, bu tür sorunlar yine de ortaya çıkabilir.

Bu örneğe bakın ( vmstat çıkışı )

2016-10-29 03:55:32 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
2016-10-29 03:55:32  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
2016-10-30 03:56:04 19 23 2914752 4692144 3344908 12162628 1660    1  8803 12701 4336 37487 14  7 40 38  0
2016-10-30 03:56:34  3 20 2889296 4977580 3345316 12026752 2109    2  8445 14665 4656 36294 12  7 46 34  0
2016-10-30 03:57:04  1 11 3418868 4939716 3347804 11536356  586 4744  2547  9535 3086 24450  6  3 59 33  0  <<<-----
2016-10-30 03:57:34  3 19 3456252 5449884 3348400 11489728 3291 13371  6407 17957 2997 22556  6  4 66 24  0
2016-10-30 03:58:04  7  6 4194500 5663580 3349552 10857424 2407 12240  3824 14560 2295 18237  4  2 65 29  0
2016-10-30 03:58:34  2 16 4203036 5986864 3348908 10838492 4601 16639  7219 18808 2575 21563  6  4 60 31  0
2016-10-30 03:59:04  3 14 4205652 6059196 3348760 10821448 6624 1597  9431  4357 1750 20471  6  2 60 31  0
2016-10-30 03:59:34  2 24 4206968 6053160 3348876 10777216 5221 2067 10106  7377 1731 19161  3  3 62 32  0
2016-10-30 04:00:04  0 13 4205172 6005084 3348932 10785896 6236 1609 10330  6264 1739 20348  4  2 67 26  0
2016-10-30 04:00:34  4 11 4206420 5996396 3348976 10770220 6554 1253 10382  4896 1964 42981 10  5 58 27  0
2016-10-30 04:01:04  6  4 4177176 5878852 3348988 10825840 8682  765 10126  2716 1731 32949  8  4 69 19  0

@ 2016-10-30 03:57:04, hala iyi miktarda boş RAM olduğunu görüyoruz. Ancak, o zaman bile takas oldu. İşlem ağacını bu noktada kontrol ettik ve bu kadar yüksek miktarda bellek (boş bellekten daha fazlası) gerektiren herhangi bir işlemin geldiğini görmedik. Açıkça şüphe, yukarıda açıklanan Durum 2 idi. Yukarıdaki buddyinfo ve zoneinfo loglarını kontrol ettik (bunları kontrol etmek için echo m> / proc / sysrq-trigger kullanın, çıkış syslog'lara gider).

Bizim normal bir sistemimiz için, bölge bilgisinin karşılaştırılması buna gider. Ve önbellek / ücretsiz / düşük mem grafikleri aşağıda da belirtilmiştir

bölge bilgisi

ücretsiz takas ücretsiz

Bilgiye bakıldığında, normal düğüm 0 ve düğüm 1'de bellek parçalanması olduğu açıktır (düğüm NUMA tabanlı bir makinedir, bu nedenle çoklu düğümler (sisteminiz için bilgileri kontrol etmek için numactl'e bakınız).

Bellek parçalanması, boş hafıza varken bile takas kullanımının artmasının bir nedenidir.


2
"Durum 2" nizde, zorlu işlemin olağandışı bir durum olan fiziksel belleği tahsis edip etmediğini netleştirmelisiniz. Çoğu işlem, yalnızca parçalanmanın neredeyse alakasız olduğu sanal bellekle ilgilidir. Ayrıca ilk bakışta açıkça görülmediği için gösterilen rakamlardan ve grafikten hafıza parçalanmasının nasıl olduğunu iddia ettiğinizi daha iyi açıklamak isteyebilirsiniz. Oh, ve bu arada, aslında bitişik hafızadan bahsediyorsunuz , umarım bulaşıcı hafızadan değilsiniz ;-)
jlliagre

@jlliagre: Girişler için teşekkürler. "Bitişik" hatayı düzenliyorum.
Anugraha Sinha

5

Daha fazla hafızaya sahip olmak

Herkesin dediği gibi, evet takas kullanılmayan hafızalardan kurtulmanıza yardımcı olacaktır, böylece daha fazla hafızaya sahip olmanıza yardımcı olabilir.

Kış uykusuna yatan

Ancak takas, bir dizüstü bilgisayarınız olduğunda ya da enerji tasarrufu yapmak istediğinizde ve işinizden ayrılmadan önce bilgisayarınızı hazırda bekletme moduna sokmak istediğinizde gerçekten yararlı olabilecek hazırda bekletme modları için de kullanılabilir . Böylece ertesi sabah daha hızlı bir başlangıç ​​yapabilirsiniz.

Hazırda bekletme işlevine sahip olmak, günümüzde hala en azından takas için RAM boyutuna sahip olmanızı tavsiye ettiğimiz ana nedenlerden biridir. Bu şekilde sistem kullanılmış tüm RAM'leri takas yerine koyabilir ve hazırda bekletme moduna geçirir.

Kısa geliş

Bir kez değiştirildikten sonra, takas şifreli olmadıkça (tabii ki) bir işlem verisinin, takastan sonra bile takas içerisinde okunabildiğinden emin olun.

Hazırda bekletme modunda şifreli takas kullanılması, tüm dağıtımlarda kullanıma hazır değildir. Sabit bir şifreleme anahtarı kullanmanız gerekir (bazı kurulumlar rasgele her açılışta takas alanı şifreleme anahtarını oluşturur) ve devam etmeden önce şifreli birimi etkinleştirmek için bir initrd / initramfs kullanın.


3

Bir çok modern program, programı çalıştırmak için gerçekte ihtiyaç duymadığınız birçok önemsiz yere sürüklenen şişirilmiş çerçeveler üzerine kuruludur. Kullanılmayan sayfaları değiştirmek, RAM'i önbellek ve RAM'i gerçekten kullanabilecek programlar için boşaltır.

Burada acı verici kişisel deneyimlerden söz ediyorum.

Geçen yıl, web sitelerimden birini Firefox’un üzerine kurulmuş gelecek vaat eden yeni bir web sunucusu çerçevesine geçirdim. Firefox gibi müşteri odaklı bir programın üstüne sunucu tarafında bir sistem kurmak garip gelebilir, ancak bazı büyük avantajları vardı. Firefox çok güçlüdür, gerçekten etkileyici bir dahili servisler sunar ve sunucu ile istemci arasındaki empedans uyumsuzluğunu hem benzer platformlarda çalıştırmak için azaltır.

Ancak bir dezavantajı var: Firefox büyük. Gerçekten büyük. Bu bir sürüm 1.x projeydi, bu yüzden GUI desteğini kaldırmak gibi şeylerle uğraşmadılar. [*] Sitem hiçbir şeye ihtiyaç duymuyordu, fakat VPS teknolojisi barındırma sağlayıcımın kullanmadığı için takas alanına izin vermeyin, bu GUI kodunu ve Firefox'un diğer tüm kısımlarını kullanmadım gerçek RAM kullandım. Hafıza tükenmesi nedeniyle çökmeden siteyi çalıştırmak için minimum 512 MB RAM'e ihtiyaç duydum . Eğer VPS'mde takas alanı olsaydı, muhtemelen 256 MB'lık bir planla başarabilirdim.

[*] GUI kodunun çerçeveden kaldırılması bile istenmeyebilir, çünkü bu platformun avantajlarından biri yüksek kalitede web kazıma olmasıydı, çünkü sunucu tarafı çerçevesi web sayfalarını başka bir siteden indirebilir ve bunları manipüle edebilirsiniz. Tıpkı müşteri tarafında yaptığınız gibi. Mashupları düşünün. Web sayfasını grafiksel bir bağlamda "oluşturamazsanız", bu tür bir şey bozulur.

Bu arada, bu web çerçevesi şimdi esasen ölü, bu yüzden onu isimlendirmenin bir anlamı yok. Daha geniş dersi kalbe almak en iyisi: evet, takas ücretsiz RAM bile olsa yine de kullanışlıdır.


3

Gönderen Ubuntu Takas SSS Marcel bağlantılı olduğunu

Asgari olarak, takas alanının fiziksel bellek (RAM) miktarına eşit olması şiddetle tavsiye edilir. Ayrıca, takas alanının sabit disk miktarına bağlı olarak iki kat fiziksel bellek (RAM) olması önerilir.

Sisteminizde takas alanınızı arttırmanız gerektiğini düşünüyorum. Takas, RAM disk tahsisini hızlandırarak zaten disk belleği alan verilerin atılmasını sağladı.


6
Bunu hala inanılmaz buluyorum. 4 GB'lık, kış uykusuna yaramayan sistemim için neden 8 GB takas alanına ihtiyacım var? 64 GB bilgi işlem düğümüm için gerçekten 128 GB takas alanına ihtiyacım var mı? Çok özel bir neden olmadığı sürece genellikle takas için 1GB'tan fazla tahsis etmiyorum.
David Mackintosh,

2
Şimşek hızlı RAM'de yavaş yavaş HDD'yi önbelleğe almak için daha fazla alan bırakır. (Ayrıca, bazı hazırda bekletme programları RAM'in bir kopyasını takas alanına kaydetti)
Arafangion

6
@David, @Jader: swap = 2 * ram figürü, orijinal gerekçenin alakasız kalmasından sonra hayatta kalan eski bir kestanedir. . Bkz bizim fiziksel bellek olarak iki kat büyük takas alanı ayarlamak gerekir neden? .
Gilles

1
@Gilles Benim pozisyonumla uyuşuyorum çünkü bir zamanlar bu konuda, uzmanlarının bilgisinin ne kadar derin olduğunu bilmediğim bir sürü uzmanla çelişen bir yazı gördüm.
Jader Dias

4
Referansı hatırlayabiliyorsanız, lütfen paylaşın.
Gilles

2

Sanırım "Gilles", yeterli RAM'den fazlasına sahip olsanız bile, takas işlemlerinin belirli "eksiklikler" sırasında kullanmanın yanı sıra, kapattıktan sonra bile bazı verileri sürekli olarak kaydetmenin yararlı olabileceğinden bahsetti - ya da bunu varsaymakta yanlış mıyım? RAM yeniden başlattıktan sonra temizlendi çünkü) Sistemimde 12GB RAM var ve ben de daha önce bu soruyu düşünmüştüm. Bir noktada, tüm takasları devre dışı bıraktığımda ve yalnızca RAM'ime güvendiğimde, sistem kapanmasından sonra bazı sistem hatalarını veya çökmelerini vb. O zamandan beri, takas bölümünü yeniden etkinleştirdim.

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.