Üstteki sanal bellek boyutu ne anlama geliyor?


124

topSunucumun performansını izlemek için koşuyorum ve java işlemlerimden 2'si 800 MB-1 GB'a kadar sanal bellek gösteriyor. Bu kötü bir şey mi?

Sanal bellek ne anlama geliyor?

Ve oh btw, ben 1GB takas var ve kullanılan% 0 gösterir. Bu yüzden kafam karıştı.

Java işlemi = 1 Tomcat sunucusu + kendi java sunucum Sunucu = Ubuntu 9.10 (karmic)


Yanıtlar:


142

Sanal bellek, mutlaka bellek değildir. Örneğin, bir işlem büyük bir dosyayı belleğe eşlerse, dosya aslında diskte depolanır, ancak işlem sırasında hala "adres alanı" alır.

Adres alanı (işlem listesindeki sanal bellek) hiçbir ücrete tabi değildir; Bu gerçek değil. Gerçek olan, yerleşik bellek olan RSS (RES) sütunu. Bir işlemin gerçek hafızasının ne kadarını işgal ettiği budur.

Ama bu bile tüm cevap değil. Bir işlem fork () çağırırsa, iki parçaya ayrılır ve her ikisi de başlangıçta tüm RSS'lerini paylaşır. RSS başlangıçta 1 GB olsaydı bile, çatallamadan sonraki sonuç her biri 1 GB olan bir RSS olan iki işlem olurdu, ancak yine de sadece 1 GB bellek kullanıyor olacaktınız.

Aklınız mı karıştı? İşte gerçekten bilmeniz gerekenler: freekomutu kullanın ve programınıza başlamadan önce ve sonra sonuçları kontrol edin ( +/- buffers/cacheçevrimiçi olarak). Bu fark, yeni başlatılan programınızın ne kadar yeni hafıza kullandığıdır.


2
"Programınıza başlamadan önce ve sonra sonuçları kontrol edin", alternatif olarak, döndürüldüğü gibi USS (Unique Set Size) kullanın smem.
Hubert Kario

Yani, kullanılmakta olan belleğin gerçek miktarını veren bir araç var mı, üçüncü taraf olmayan araçlar var.
CMCDragonkai,

@ CMCDragonkai Evet, ücretsiz.
Devfan Fan

1
Eğer java işlemi java -Xmx16g RunLongiçin 16 Gb hafızayı ayıracak bir java işlemini başlatırsam , o zaman VIRTen üstte, 16 Gb sayılıyor gibi görünüyor. Bu durumda, bu 16Gb belleğin türü nedir, eşlenmiş hafıza mı yoksa ...?
Eric Wang,

1
@EricWang, bu hafıza eşlenmedi. Bu sadece OS'ye daha sonra ihtiyaç duyulabilecek (belki de asla) bellek ayırma isteğidir. (En azından) Linux'ta bu, MAP_NORESERVE ve PROT_NONE bayraklarıyla bir mmap çağrısıdır (bkz. Os :: pd_reserve_memory anon_mmap çağırır: github.com/AdoptOpenJDK/openjdk-jdk11u/blob/… ); aslında hiçbir bellek varsayılan olarak tahsis edilmez - bu yalnızca programın nesnelerin tahsisat taleplerini yerine getirmek için belleğe gerçekten ihtiyacı olduğu noktada yapılır.
Juraj Martinka

23

En üstteki (1) kılavuz sayfasından:

o: VIRT  --  Virtual Image (kb)
      The  total  amount  of  virtual  memory  used  by the task.  It
      includes all code, data and shared libraries  plus  pages  that
      have been swapped out.

      VIRT = SWAP + RES.

RES, RESident belleği (kullanılan fiziksel bellek) anlamına gelir.

Aslında bu doğru değil (artık). "Takas" yazdığında, programın adres alanına eşleştirdiği, ancak gerçekte gerçek RAM harcayan veya almayan dosyaları da içeren dosyaları içerir. Bu bellek dosya destekli ancak gerçekten değişmiyor.

VIRT ayrıca ayrılmış ancak henüz hiçbir şey için kullanılmamış sayfaları da içerir. Bu durumdaki herhangi bir sayfa, çekirdek Sıfır Sayfasına eşleştirilir (mükemmel konsept - bakmalısınız), böylece VIRT'de görünür ancak aslında hiçbir bellek tüketmez.


2
Bu ilginç, öyleyse VIRT = SWAP + RES, SWAP kullanımım nasıl sıfır, 2 java işleminin sanal belleği 1 GB’ye yaklaştı.
kapso,

temel olarak En iyi şovlar .... Değişim: 1048568k toplam, 0k kullanılmış, 1048568k ücretsiz, 505728k önbelleğe alınmış
kapso

15
@ user42159 Bu cevap YANLIŞ! Üstte NO 'VIRT = SWAP + RES' var! -m : VIRT/USED toggle Reports USED (sum of process rss and swap total count) instead of VIRT. Bu cevabı reddedememem çok yazık.
duleshi

3
Bu cevap yanlış. KULLANILMIŞ = Res + Swap Boyutu (üstten Alan Yönetimi'nden, üstten aldığınızda f tuşuna basılarak erişilir. Ayrıca üst sayfadan).
Jason S,

14

Bu açıklamayı Mugurel Sumanariu'dan çok net buldum :

VIRTaslında kullandığı belleğin toplamı olan bir işlemin sanal boyutunu, kendi içine eşleştirdiği belleği (örneğin, X sunucusu için video kartının RAM'i), içine disklenmiş dosyalar (çoğu (özellikle paylaşılan kütüphaneler) ve diğer işlemlerle paylaşılan hafıza. VIRT, programın şu anda ne kadar belleğe erişebildiğini gösterir.

RESBir işlemin ne kadar gerçek fiziksel belleği tükettiğinin doğru bir temsili olan yerleşik boyut anlamına gelir. (Bu ayrıca doğrudan% MEM sütununa karşılık gelir.) Bu, çoğu program C kütüphanesine bağlı olduğundan, neredeyse her zaman VIRT boyutundan daha az olacaktır.

SHRVIRT boyutunun ne kadarının gerçekten paylaşılabilir olduğunu gösterir (bellek veya kitaplıklar). Kütüphaneler söz konusu olduğunda, kütüphanenin tamamının ikamet ettiği anlamına gelmez. Örneğin, bir program bir kütüphanede sadece birkaç işlev kullanırsa, tüm kütüphane eşlenir ve VIRT ve SHR'de sayılır, ancak yalnızca kullanılan işlevleri içeren kütüphane dosyasının parçaları gerçekte yüklenir ve sayılır. RES altında.


Belki de sadece "VIRT, programın şu anda ne kadar hafızaya erişebileceğini temsil ediyor" kelimesini tekrar söylerdim. "VIRT, programın şu anda adreslenebilir alanının boyutunu temsil eder." Tamam, bu hala cila kullanabilir. Fakat mesele şu ki, "ne kadar hafıza" hala VIRT’nin RAM alanı ile ilgisi olmadığı zaman RAM’i tartıştığımız izlenimini veriyor . Aslında, büyük programlar genellikle toplam sistem RAM boyutunun ÇOKLU olan birkaç VIRT boyutuna sahip olacaktır - çünkü VIRT neredeyse tamamen dosya destekli adres bölgeleridir (AKA "disk RAM değil").
FeRD

5

Ps / top çıkışındaki VIRT sütunu, bellek kullanımını ölçmek için neredeyse hiç alakasızdır. Endişelenme. Apache ağır yük VIRT vs RES bellek

https://stackoverflow.com/questions/561245/virtual-memory-usage-from-java-under-linux-too-much-memory-used


Teşekkürler, endişelendim ve kafam karıştı, çünkü takas kullanımı% 0 iken sanal bellek sütunu çok yüksek. Ayrıca, sanal bellek yüksekken, kullanılan toplam 2,7 GB fiziksel belleğin yalnızca 1,7 GB’i var.
kapso,

2

Linux, sanal belleği destekler, yani, bir diski RAM'in bir uzantısı olarak kullanmak, böylece kullanılabilir belleğin etkin boyutu buna uygun olarak artar. Çekirdek, kullanılmayan bir bellek bloğunun içeriğini sabit diske yazar, böylece bellek başka bir amaç için kullanılabilir. Orijinal içerik tekrar gerekli olduğunda tekrar belleğe okunur. Bunların hepsi kullanıcıya tamamen şeffaf geliyor; Linux altında çalışan programlar yalnızca daha büyük miktarda belleği görür ve zaman zaman disklerinde bulunduğunu fark etmez. Tabii ki, sabit diski okumak ve yazmak, gerçek hafızayı kullanmaktan (bin kat daha yavaş) daha yavaş, dolayısıyla programlar o kadar hızlı çalışmıyor. Sabit diskin sanal bellek olarak kullanılan kısmına takas alanı denir.

Linux, dosya sistemindeki normal bir dosyayı veya takas alanı için ayrı bir bölüm kullanabilir. Bir takas bölümü daha hızlıdır, ancak bir takas dosyasının boyutunu değiştirmek daha kolaydır (tüm sabit diski yeniden bölümlendirmeye ve muhtemelen her şeyi sıfırdan yüklemeye gerek yoktur). Ne kadar takas alanına ihtiyacınız olduğunu bildiğiniz zaman, bir takas bölmesine gitmelisiniz, ancak emin değilseniz, takas dosyasını ilk önce kullanabilirsiniz, sistemi bir süreliğine kullanın, böylece ne kadar takas ettiğinize dair bir fikir sahibi olabilirsiniz. gerek ve sonra büyüklüğünden emin olduğunuzda bir takas bölümü oluşturun.

Ayrıca, Linux'un aynı anda birkaç takas bölümü ve / veya dosyayı takas etmesine izin verdiğini de bilmelisiniz. Bunun anlamı, yalnızca nadiren alışılmadık miktarda takas alanına ihtiyaç duyuyorsanız, tutarın tamamını her zaman tahsis etmek yerine, bu zamanlarda fazladan takas dosyası oluşturabilirsiniz.

İşletim sistemi terminolojisine ilişkin bir not: bilgisayar bilimi genellikle değiştirme (tüm süreci yer değiştirmeye yazma) ve sayfalama (bir seferde sadece sabit büyüklükte kısımlar, genellikle birkaç kilobayt yazma) arasında ayrım yapar. Sayfalama genellikle daha verimlidir ve Linux'un yaptığı budur, ancak geleneksel Linux terminolojisi yine de değiş tokuş yapmaktan bahseder.

Kaynak: http://www.faqs.org/docs/linux_admin/x1752.html


1
Bu cevap, sanal belleğin takas veya sayfalama ile aynı olduğu yanılgısını yayar. Diskin RAM'in bir uzantısı olarak kullanılması sanal belleği önler. Sanal belleğe sahip, ancak diski RAM'in bir uzantısı olarak kullanmayan pek çok sistem (çoğu SoHo yönlendiricisi gibi) vardır. (Ve bu OP'nin sorusunun cevabı da değil, çünkü herhangi bir takas kullanmıyor.)
David Schwartz

2

VIRtualtepenin sütunu, işlemin gerçekten çalışma zamanında yapamayabileceği işlemin süper uzayını (süper tüketim alanı) belirtir. Çalışma RESidentzamanında işlem tarafından ayrılan gerçek fiziksel belleği / boşluğu ifade eden başka bir sütun var .

İkisi arasındaki farkın nedeni, örnekle anlaşılabilir: işlem belirli bir kütüphane kullanıyorsa, o zaman kütüphane boyutu da buna yardımcı olacaktır virtual-size. Bu yardımcı olacaktır böylece ancak, sadece beri kütüphanenin bir parçası, (kullanımda yani bazı yöntemler) kullanılacaktır resident-size.

Daha Fazla Bilgi İçin Bakınız


0

"VIRT" sadece boşluğa hitap eder, RES, "gerçek" hafızadır, ancak "SHR" (= paylaşılan) "RES" miktarı, RES'in diğer süreçlerle paylaşılan kısmıdır. Bu yüzden çoğu süreç için, SHR'yi RES'den çıkarmanın size, bu işlemle gerçekten ilgili olan bellek miktarını verdiğine inanıyorum.

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.