Neden hala kullanılmayan RAM'im olduğunda takas alanımın bir kısmı kullanılıyor?


9

Bir problemden daha çok bir merak; ve itiraf ediyorum ki, son derece temel bir soru:

Birçok durumda, Linux makinemde ~ 600MB kullanılmayan RAM'im olmasına rağmen ~ 500MB takas alanı kullanacağımı fark ettim.

Benim saf üst düzey anlayışım, RAM tükenene kadar takas alanı devreye girmiyordu.

Daha ileri gittim ve bu durumun Linux çekirdeğinin yapılması gerektiği varsayımını yaptım, çünkü bellek isteyen bir kullanıcı işlemi sadece mantıklı bir şekilde yapar ve bu belleğin RAM veya takas alanı tarafından fiziksel olarak desteklenip desteklenmediğine dair bir fikri yoktur.

Hangi soruya yol açar, çekirdek neden takas alanını önleyici olarak kullansın? Bu, bazı performans ayarlama algoritmasının bir parçası mı? Erişilmesi en az olası olduğu belleğin disk bölümleriyle değiştiriliyor mu (belki bir LRU şeması)? Eğer öyleyse, sadece her şeyi RAM'de bırakmak mantıklı olmaz mıydı ve sadece tükenmeye yaklaşırken, ancak o zaman LRU bölümlerini RAM'den takas alanına takas eder misiniz?

Açıklığa kavuşturmalıyım, linux sunucumun 2GB RAM ve 2GB takas alanı var.


1
Bu soruyu kapatmak için neden 4 oy?

2
@Aaron: Kötü bir sorunuz olması değil. Bunu sistem yönetimi açısından ifade ettiniz, böylece güçlü kullanıcılara veya sunucu yöneticilerine daha iyi uyuyor. Merak olarak merak etmenin daha çok güçlü bir kullanıcı POV'su gibi görünmesi.

Yanıtlar:


11

Kullanılmayan RAM parçası HDD önbelleği olarak kullanılan aslında. Bunu düşünürseniz, aslında diskinizin bazı kısımlarını RAM'in bazı kısımlarına eriştiğinizden daha sık okursunuz. Bu, HDD verilerini önbelleğe almak için RAM kullanırken bu RAM'i diske koymak mantıklıdır.


7

Belleğe gerçekten ihtiyaç duyduğunuzda, çekirdeğin disk erişimi ile bitmesini beklemek zorunda kalmayacağınız için işleri önceden değiştirmek mantıklıdır.

Örneğin, büyük bir resim açmak istediğinizi varsayalım. Görüntü yüklendiğinde 300 MB RAM gerekir. Çekirdek, kullanabileceği tüm RAM'i kullanıyorsa, görüntünüzü yüklemek için çekirdeğin RAM'den diske 200MB aktarması gerekir. RAM'i önceden proaktif olarak boşaltırsa, birkaç milisaniye tasarruf edersiniz.


7

2 neden:

  1. (@dtrosset) Linux daha fazla önbellek ve arabellek vermek için kullanılmayan program parçalarını değiştirir.
  2. Geçmişte daha fazla bellek kullanmış olabilirsiniz ve bazı şeyleri takas etmiş olabilirsiniz ve takas edilmemiş olabilir, çünkü artık zorlanan her şey gitmiş olsa bile kullanılmamıştır.

1

Diğer yanıtlara ek olarak, programları kullanmasa bile Linux'u ayrılmış herhangi bir bellek için destek gerektirecek şekilde yapılandırabilirsiniz.

Bununla birlikte, belleği aşırı kullanmak ve OOM katilinden korkmak Linux deneyiminin gerekli parçaları değildir. Sadece sysctl parametresi vm / overcommit_memory'yi 2 olarak ayarlamak, aşırı işlem davranışını kapatır ve OOM katilini sonsuza dek uzak tutar. Modern sistemlerin çoğu, çoğu durum için geniş bir takas dosyası sağlayacak yeterli disk alanına sahip olmalıdır. Fazla taahhüt edilen bellek bittiğinde evcil hayvan süreçlerinin öldürülmesini engellemeye çalışmak yerine, durumdan tamamen kaçınmak daha kolay olabilir. [ OOM katiline rağmen ]

Bir program bellek ayırırsa, çekirdek daha fazla takas sayfasını taahhütlü olarak işaretleyebilir. Bu gösterge çekirdeğin bellek yöneticisinde saklanır, gerçek disk alanına henüz dokunulmaz. Bu bellek kullanılana kadar hiçbir şeyin içeri ve dışarı değiştirilmesi gerekmez. Asla kullanılmazlarsa, takas kullanımı performansı etkilemeden dalgalanacaktır.

İşlemler kendi adres alanları veya "görünümleri" ile sunulduğundan (takas ilk etapta bu şekilde çalışır), çekirdeğin bunu yönetme konusunda çok fazla boşluğu vardır. Yukarıda bağlantılı makaleden bir çatal örneği kullanarak, paylaşılan bellek sayfalarına sahip olmak, büyük miktarda kullanılmamış belleği ayırmaktan çok daha fazla olduğundan, bellek, yazma üzerine kopyalanabilir ve takas kullanım sayısını arttırır. Aslında yazıldığında (ki bu olmayabilir), o zaman "taahhütlü takas" herhangi bir kullanılmayan RAM ile değiştirilebilir (daha sonra RAM kullanımını arttırır ve takas kullanımını azaltır). 500MB tahsis edilmiş, tüm RAM'lerin tümü veya neredeyse tamamı kullanılan bir makinede çatallar içeren bir işlem düşünün. Takasta 500MB kullanılabilirse (ve disk alanı ucuzsa, bugünün TB sürücülerinin% 1'i ne kadar büyük?? P), bellek kopyalanmayacak (henüz,

Böylece OOM katilinin olasılığı önlenir ve bellek tahsislerinin (çatal gibi bir şey yoluyla "örtük" tahsisler dahil) hemen başarılı veya başarısız olduğu varsayımı ile çoğu yazılımın tasarlanması çok daha kolaydır. değiştiğinde performansı etkileyebilir. Bu etki neredeyse her zaman hafiftir, ancak en kötü durumda takas atmasına neden olur (yine de bazen açıkça bir çekirdek çökmesi veya OOM katili tercih edilir).

Linux bellek yöneticisinin nasıl çalıştığına dair kesin ayrıntıları bilmememe rağmen, bu cevap benim kendi genel anlayışım ve yıllar boyunca okuduğumu hatırlıyorum. Bu cevabı yeniden düzenlemeye çalıştım, böylece OS tasarımının minimal bir şekilde anlaşılması gerekiyor (oldukça karmaşık ve kendimle çok ilgilendiğim bir şey değil), ancak biraz çarpıyor gibi görünüyor; nasıl geliştirilebileceğini görürseniz lütfen bize bildirin. Kavrama elinde, bu kadar utanç verici bir temel soru olmayabilir.

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.