Linux'ta Swappiness Nedir? (ve Nasıl Değiştirilir)

Yayınlanan: 2022-01-29
Bir bilgisayar için rastgele erişimli bellek (RAM) çubukları.
subin-ch/Shutterstock.com

Linux takas değerinin, takas başlamadan önce ne kadar RAM kullanıldığı ile hiçbir ilgisi yoktur. Bu, yaygın olarak bildirilen ve yaygın olarak inanılan bir hatadır. Gerçekten ne olduğunu açıklıyoruz.

Swapiness Hakkında Efsaneleri Yıkmak

Değiştirme, RAM'i boşaltmak için Rastgele Erişim Belleğindeki (RAM) verilerin sabit diskinizdeki özel bir konuma (takas bölümü veya takas dosyası) yazıldığı bir tekniktir.

Linux'un takas değeri adı verilen bir ayarı vardır. Bu ayarın neyi kontrol ettiği konusunda çok fazla kafa karışıklığı var. Değiştirilebilirliğin en yaygın yanlış tanımı, RAM kullanımı için bir eşik belirlemesi ve kullanılan RAM miktarı bu eşiğe ulaştığında takasın başlamasıdır.

Bu, o kadar sık ​​tekrarlanan bir yanılgıdır ki artık bilgelik kazanmıştır. Eğer (neredeyse) herkes size takasın tam olarak bu şekilde çalıştığını söylüyorsa, biz öyle olmadığını söylediğimizde neden bize inanmalısınız?

Basit. Bunu kanıtlayacağız.

RAM'iniz Bölgelere Ayrılmış

Linux, RAM'inizi büyük, homojen bir bellek havuzu olarak düşünmez. Bölge adı verilen bir dizi farklı bölgeye ayrıldığını düşünüyor. Bilgisayarınızda hangi bölgelerin bulunduğu, 32 bit mi yoksa 64 bit mi olduğuna bağlıdır. İşte x86 mimarisine sahip bir bilgisayardaki olası bölgelerin basitleştirilmiş bir açıklaması.

  • Doğrudan Bellek Erişimi (DMA) : Bu, 16 MB'lik düşük bellektir. Bölge adını aldı çünkü uzun zaman önce, fiziksel belleğin bu alanına yalnızca doğrudan bellek erişimi yapabilen bilgisayarlar vardı.
  • Doğrudan Bellek Erişimi 32 : Adına rağmen, Doğrudan Bellek Erişimi 32 (DMA32), yalnızca 64-bit Linux'ta bulunan bir bölgedir. Bu düşük 4 GB bellek. 32 bit bilgisayarlarda çalışan Linux, yalnızca bu miktarda RAM'e DMA yapabilir (fiziksel adres uzantısı (PAE) çekirdeğini kullanmıyorlarsa), bölge adını bu şekilde almıştır. 32 bit bilgisayarlarda buna HighMem denir.
  • Normal : 64 bit bilgisayarlarda, normal bellek, 4 GB'ın (kabaca) üzerindeki RAM'in tamamıdır. 32 bit makinelerde 16 MB ile 896 MB arasında RAM'dir.
  • HighMem : Bu yalnızca 32 bit Linux bilgisayarlarda bulunur. Yeterince büyük makinelerde 4 GB'ın üzerindeki RAM dahil olmak üzere tümü 896 MB'nin üzerinde RAM'dir.

PAGESIZE Değeri

RAM, sabit bir boyutta olan sayfalara tahsis edilir. Bu boyut, bilgisayarın mimarisini algılayarak önyükleme sırasında çekirdek tarafından belirlenir. Tipik olarak bir Linux bilgisayardaki sayfa boyutu 4 Kbayttır.

Reklamcılık

getconf komutunu kullanarak sayfanızın boyutunu görebilirsiniz:

 getconf PAGESIZE 

getconf PAGESIZE

Bölgeler Düğümlere Eklendi

Bölgeler düğümlere eklenir. Düğümler bir Merkezi İşlem Birimi (CPU) ile ilişkilendirilir. Çekirdek, o CPU ile ilişkili düğümden bir CPU üzerinde çalışan bir işlem için bellek ayırmaya çalışacaktır.

CPU'lara bağlı düğüm kavramı, Tekdüzen Olmayan Bellek Erişimi mimarisini kullanarak karışık bellek türlerinin uzman çok CPU'lu bilgisayarlara kurulmasına izin verir.

Hepsi çok üst düzey. Ortalama bir Linux bilgisayarında sıfır düğüm adı verilen tek bir düğüm bulunur. Tüm bölgeler o düğüme ait olacaktır. Bilgisayarınızdaki düğümleri ve bölgeleri görmek için /proc/buddyinfo dosyasının içine bakın. Bunu yapmak için less kullanacağız:

 daha az /proc/buddyinfo 

Bu, bu makalenin araştırıldığı 64-bit bilgisayardan alınan çıktıdır:

 Düğüm 0, bölge DMA 1 1 1 0 2 1 1 0 1 1 3
Düğüm 0, bölge DMA32 2 67 58 19 8 3 3 1 1 1 17
Reklamcılık

Tek bir düğüm var, düğüm sıfır. Bu bilgisayarın yalnızca 2 GB RAM'i vardır, bu nedenle “Normal” bölge yoktur. Yalnızca iki bölge vardır, DMA ve DMA32.

Her sütun, belirli bir boyuttaki mevcut sayfaların sayısını temsil eder. Örneğin, DMA32 bölgesi için soldan okuma:

  • 2 : 2^( 0 *PAGESIZE) bellek parçasından 2'si var.
  • 67 : 67 adet 2^( 1 *PAGE_SIZE) bellek parçası var.
  • 58 : 58 adet 2^( 2 *PAGESIZE) kullanılabilir bellek parçası var.
  • Ve böylece, sonuna kadar…
  • 17 : 2^( 512 *PAGESIZE) parçadan 17 tanesi var.

Ama gerçekten, bu bilgiye bakmamızın tek nedeni, düğümler ve bölgeler arasındaki ilişkiyi görmek.

Dosya Sayfaları ve Anonim Sayfalar

Bellek eşleme, hangi bellek sayfalarının ne için kullanıldığını kaydetmek için sayfa tablosu girişleri setlerini kullanır.

Bellek eşlemeleri şunlar olabilir:

  • Dosya destekli : Dosya destekli eşlemeler, bir dosyadan okunan verileri içerir. Her türlü dosya olabilir. Unutulmaması gereken nokta, eğer sistem bu hafızayı boşalttıysa ve o veriyi tekrar alması gerekiyorsa, dosyadan bir kez daha okunabilir. Ancak, veriler bellekte değiştirilmişse, bellek serbest bırakılmadan önce bu değişikliklerin sabit sürücüdeki dosyaya yazılması gerekir. Bu olmasaydı, değişiklikler kaybolurdu.
  • Anonim : Anonim bellek, hiçbir dosya veya aygıtın onu desteklemediği bir bellek eşlemesidir. Bu sayfalar, programlar tarafından veri tutmak için veya yığın ve yığın gibi şeyler için anında istenen belleği içerebilir. Bu tür verilerin arkasında dosya olmadığı için anonim verilerin saklanması için özel bir yer ayrılmalıdır. Bu yer, takas bölümü veya takas dosyasıdır. Anonim veriler, anonim sayfalar serbest bırakılmadan önce takas edilmek üzere yazılır.
  • Cihaz destekli : Cihazlar, dosyalarmış gibi ele alınabilecek blok cihaz dosyaları aracılığıyla adreslenir. Veri onlardan okunabilir ve onlara yazılabilir. Aygıt destekli bellek eşlemesinde, içinde depolanan bir aygıttan alınan veriler bulunur.
  • Paylaşılan : Birden çok sayfa tablosu girişi aynı RAM sayfasına eşlenebilir. Herhangi bir eşleme yoluyla bellek konumlarına erişim aynı verileri gösterecektir. Farklı süreçler, birlikte izlenen bu bellek konumlarındaki verileri değiştirerek birbirleriyle çok verimli bir şekilde iletişim kurabilirler. Paylaşılan yazılabilir eşlemeler, yüksek performanslı süreçler arası iletişim elde etmenin yaygın bir yoludur.
  • Yazma üzerine kopyala: Yazma üzerine kopyala, tembel bir ayırma tekniğidir. Zaten bellekte bulunan bir kaynağın bir kopyası istenirse, orijinal kaynağa bir eşleme döndürülerek istek karşılanır. Kaynağı "paylaşan" işlemlerden biri ona yazmaya çalışırsa, değişikliklerin yeni kopyada yapılmasına izin vermek için kaynağın gerçekten bellekte çoğaltılması gerekir. Böylece bellek ayırma yalnızca ilk yazma komutunda gerçekleşir.

Takas için, listedeki ilk ikisiyle ilgilenmemiz yeterlidir: dosya sayfaları ve anonim sayfalar.

değiş tokuş

İşte GitHub'daki Linux belgelerindeki takas açıklaması:

Reklamcılık

"This control is used to define how aggressive (sic) the kernel will swap memory pages. Higher values will increase aggressiveness, lower values decrease the amount of swap. A value of 0 instructs the kernel not to initiate swap until the amount of free and file-backed pages is less than the high water mark in a zone.

The default value is 60."

Bu, kulağa değiş tokuşun yoğunluğu yukarı veya aşağı çevirdiği gibi geliyor. İlginç bir şekilde, takası sıfıra ayarlamanın takası kapatmadığını belirtir. Çekirdeğe belirli koşullar sağlanana kadar takas yapmamasını söyler. Ancak takas yine de gerçekleşebilir.

Daha derine inelim. Çekirdek kaynak kod dosyası vmscan.c'de vm_swappiness tanımı ve varsayılan değeri şu şekildedir:

/*
* From 0 .. 100. Higher means more swappy.
*/
int vm_swappiness = 60;

Takas değeri 0 ile 100 arasında değişebilir. Yine, yorum kesinlikle takas değerinin ne kadar takas gerçekleştiğiyle ilgili olduğu ve daha yüksek bir rakamın daha fazla takasa yol açtığı gibi görünüyor.

Kaynak kod dosyasında daha ileride, swappiness adlı yeni bir değişkene mem_cgroup_swappiness() işlevi tarafından döndürülen bir değer atandığını görebiliriz. Kaynak kodu üzerinden biraz daha izleme, bu işlev tarafından döndürülen değerin vm_swappiness olduğunu gösterecektir. Şimdi, değiş tokuş değişkeni, swappiness ayarlandığı değere eşit vm_swappiness şekilde ayarlanmıştır.

int swappiness = mem_cgroup_swappiness(memcg);

Reklamcılık

Ve aynı kaynak kod dosyasında biraz daha aşağıda şunu görüyoruz:

/*
* With swappiness at 100, anonymous and file have the same priority.
* This scanning priority is essentially the inverse of IO cost.
*/
anon_prio = swappiness;
file_prio = 200 - anon_prio;

İlginç. swappiness iki farklı değer türetilir. anon_prio ve file_prio değişkenleri bu değerleri tutar. Biri arttıkça diğeri azalır ve bunun tersi de geçerlidir .

Linux takas değeri aslında iki değer arasındaki oranı belirler.

Altın Oran

Dosya sayfaları, bu bellek serbest bırakıldığında kolayca alınabilecek verileri tutar. Linux dosyayı tekrar okuyabilir. Gördüğümüz gibi, dosya verileri RAM'de değiştirilmişse, dosya sayfası serbest bırakılmadan önce bu değişikliklerin dosyaya yazılması gerekir. Ancak her iki durumda da RAM'deki dosya sayfası, dosyadan veri okunarak yeniden doldurulabilir. Öyleyse neden bu sayfaları takas bölümüne veya takas dosyasına eklemekle uğraşasınız? Bu verilere tekrar ihtiyacınız olursa, takas alanında fazladan bir kopya yerine orijinal dosyadan tekrar okuyabilirsiniz. Böylece dosya sayfaları takasta saklanmaz. Orijinal dosyada "depolanırlar".

Anonim sayfalarda, bellekteki değerlerle ilişkili hiçbir temel dosya yoktur. Bu sayfalardaki değerlere dinamik olarak ulaşılmıştır. Onları bir dosyadan tekrar okuyamazsınız. Anonim sayfa belleği değerlerinin kurtarılabilmesinin tek yolu, belleği boşaltmadan önce verileri bir yerde saklamaktır. Ve takasın tuttuğu şey budur. Tekrar başvurmanız gereken isimsiz sayfalar.

Reklamcılık

Ancak, hem dosya sayfaları hem de anonim sayfalar için belleği boşaltmak için sabit sürücüye yazma gerekebileceğini unutmayın. Dosya sayfası verileri veya anonim sayfa verileri, dosyaya son yazıldığından veya takas edildiğinden bu yana değiştiyse, bir dosya sistemi yazması gerekir. Verileri almak için bir dosya sistemi okuması gerekir. Her iki sayfa geri alma türü de maliyetlidir. Anonim sayfaların değiş tokuşunu en aza indirerek sabit sürücü giriş ve çıkışını azaltmaya çalışmak, yalnızca dosyalara yazılan ve dosyalardan okunan dosya sayfalarıyla ilgilenmek için gereken sabit sürücü giriş ve çıkış miktarını artırır.

Son kod parçacığından da görebileceğiniz gibi, iki değişken var. Biri "dosya önceliği" için file_prio , diğeri "anonim öncelik" için anon_prio olarak adlandırıldı.

  • anon_prio değişkeni, Linux takas değerine ayarlanır.
  • file_prio değeri 200 eksi anon_prio değeri olarak ayarlanır.

Bu değişkenler, birlikte çalışan değerleri tutar. Her ikisi de 100'e ayarlanırsa, eşittirler. Diğer değerler için, anon_prio 100'den 0'a düşer ve file_prio 100'den 200'e yükselir. İki değer, Linux çekirdeğinin dosya sayfalarını geri alma (serbest bırakma) tercihiyle mi yoksa anonim olarak mı çalıştığını belirleyen karmaşık bir algoritmaya beslenir. sayfalar.

file_prio sistemin dosya sayfalarını boşaltma isteği ve anon_prio sistemin anonim sayfaları boşaltma isteği olarak düşünebilirsiniz. Bu değerlerin yapmadığı şey, takasın ne zaman kullanılacağı için herhangi bir tetikleyici veya eşik ayarlamaktır. Buna başka bir yerde karar verildi.

Ancak, belleğin boşaltılması gerektiğinde, bu iki değişken ve aralarındaki oran, boşaltma için tercihli olarak hangi sayfa türlerinin dikkate alınacağını belirlemek için geri alma ve takas algoritmaları tarafından dikkate alınır. Ve bu, ilişkili sabit sürücü etkinliğinin dosya sayfaları için dosyaları mı işleyecek yoksa anonim sayfalar için takas alanı mı olacağını belirler.

Swap Ne Zaman Gerçekleşir?

Linux takas değerinin, olası iyileştirme için taranacak bellek sayfalarının türü için bir tercih belirlediğini belirledik. Bu iyi, ama takasın ne zaman devreye gireceğine bir şey karar vermeli.

Reklamcılık

Her bellek bölgesinin bir yüksek su işareti ve bir düşük su işareti vardır. Bunlar sistemden türetilen değerlerdir. Her bölgedeki RAM yüzdeleridir. Takas tetik eşikleri olarak kullanılan bu değerlerdir.

Yüksek ve düşük su işaretlerinizin ne olduğunu kontrol etmek için, bu komutla /proc/zoneinfo dosyasının içine bakın:

 daha az /proc/zoneinfo 

Bölgelerin her biri, sayfalarla ölçülen bir dizi bellek değerine sahip olacaktır. İşte test makinesindeki DMA32 bölgesi için değerler. Düşük su işareti 13966 sayfadır ve yüksek su işareti 16759 sayfadır:

  • Normal çalışma koşullarında, bir bölgedeki boş bellek, bölgenin düşük su işaretinin altına düştüğünde, takas algoritması, anon_prio ve file_prio göreli değerlerini hesaba katarak geri alabileceği belleği arayan bellek sayfalarını taramaya başlar.
  • Linux değiş tokuş değeri sıfıra ayarlanırsa, dosya sayfaları ve boş sayfaların birleşik değeri yüksek sınır değerinden az olduğunda takas gerçekleşir.

Böylece, takasın RAM kullanımına göre davranışını etkilemek için Linux takas değerini kullanamayacağınızı görebilirsiniz. Sadece böyle çalışmıyor.

Swapness Neye Ayarlanmalı?

Bu, donanıma, iş yüküne, sabit sürücü türüne ve bilgisayarınızın masaüstü mü yoksa sunucu mu olduğuna bağlıdır. Açıkçası, bu her tür ayara uyan tek bir boyut olmayacak.

Ayrıca, takasın yalnızca bellek alanınız bittiğinde RAM'i boşaltmak için bir mekanizma olarak kullanılmadığını da unutmamalısınız. Takas, iyi işleyen bir sistemin önemli bir parçasıdır ve onsuz, aklı başında bellek yönetimi Linux için çok zor hale gelir.

Reklamcılık

Linux takas değerini değiştirmenin anında etkisi vardır; yeniden başlatmanıza gerek yok. Böylece küçük ayarlamalar yapabilir ve etkileri izleyebilirsiniz. İdeal olarak, yapabileceğiniz ideal bir ayara en yakın olanı bulmaya çalışmak için bunu bilgisayarınızda farklı etkinlik türleri ile belirli bir süre boyunca yaparsınız.

Bunlar dikkate alınması gereken bazı noktalardır:

  • Linux takas değerini sıfıra ayarlayarak "değişimi devre dışı bırakmaya" çalışmak, takasla ilişkili sabit sürücü etkinliğini dosyayla ilişkili sabit sürücü etkinliğine kaydırır.
  • Eskiyen, mekanik sabit sürücüleriniz varsa, anonim sayfa geri alımından uzaklaşmak ve takas bölümü karmaşasını azaltmak için Linux takas değerini düşürmeyi deneyebilirsiniz. Elbette bir ayarı düşürdükçe diğer ayar artıyor. Takas karmaşasını azaltmak, dosya sistemi karmaşasını artıracaktır. Ancak bilgisayarınız bir yöntemi diğerine tercih etmekten daha mutlu olabilir. Gerçekten, kesin olarak bilmenin tek yolu denemek ve görmektir.
  • Veritabanı sunucuları gibi tek amaçlı sunucular için veritabanı yazılımının tedarikçilerinden rehberlik alabilirsiniz. Çoğu zaman, bu uygulamaların, güvenmeniz daha iyi olacak, amaca yönelik olarak tasarlanmış kendi dosya önbelleği ve bellek yönetimi rutinleri vardır. Yazılım sağlayıcılar, makine özelliklerine ve iş yüküne göre bir Linux takas değeri önerebilir.
  • Oldukça yeni donanıma sahip ortalama masaüstü kullanıcısı için mi? Olduğu gibi bırakın.

Linux Swappiness Değeri Nasıl Ayarlanır

Takas değerinizi değiştirmeden önce, mevcut değerinin ne olduğunu bilmeniz gerekir. Biraz azaltmak isterseniz, soru neyden biraz daha az? Bu komutla öğrenebilirsiniz:

 cat /proc/sys/vm/takas 

cat /proc/sys/vm/takas

Takas değerini yapılandırmak için sysctl komutunu kullanın:

 sudo sysctl vm.swappiness=45 

Yeni değer hemen kullanılır, yeniden başlatma gerekmez.

Aslında, yeniden başlatırsanız, takas değeri varsayılan değeri olan 60'a dönecektir. Denemeyi bitirdiğinizde ve kullanmak istediğiniz yeni değere karar verdiğinizde, /etc/sysctl.conf 'e ekleyerek yeniden başlatmalar arasında kalıcı hale getirebilirsiniz. /etc/sysctl.conf dosyası. Dilediğiniz editörü kullanabilirsiniz. Dosyayı nano düzenleyiciyle düzenlemek için aşağıdaki komutu kullanın:

 sudo nano /etc/sysctl.conf 

nano açıldığında, dosyanın en altına gidin ve bu satırı ekleyin. Kalıcı takas değeri olarak 35 kullanıyoruz. Kullanmak istediğiniz değeri değiştirmelisiniz.

 vm.swappiness=35 

Değişikliklerinizi kaydetmek ve nano çıkmak için "Ctrl+O" tuşlarına basın, "Enter" tuşlarına basın ve "Ctrl+Z" tuşlarına basın.

Bellek Yönetimi Karmaşıktır

Bellek yönetimi karmaşıktır. Ve bu nedenle, ortalama bir kullanıcı için bunu çekirdeğe bırakmak genellikle daha iyidir.

Reklamcılık

Kendinizden daha fazla RAM kullandığınızı düşünmek kolaydır. top ve free gibi yardımcı programlar yanlış izlenim verebilir. Linux, disk önbelleğe alma gibi çeşitli amaçlar için ücretsiz RAM kullanacaktır. Bu, "kullanılan" bellek rakamını yapay olarak yükseltir ve "boş" bellek rakamını azaltır. Gerçekte, disk önbelleği olarak kullanılan RAM, herhangi bir zamanda çok hızlı bir şekilde geri alınabileceği için hem "kullanılmış" hem de "kullanılabilir" olarak işaretlenir.

Takas çalışmıyor gibi görünebilecek deneyimsizler için veya takas değerinin değişmesi gerekiyor.

Her zamanki gibi şeytan ayrıntıda gizli. Veya, bu durumda, arka plan programı. Çekirdek takas arka plan programı.

İLGİLİ: Geliştiriciler ve Meraklılar için En İyi Linux Dizüstü Bilgisayarlar