Apa arti ukuran memori Virtual di atas?


124

Saya menjalankan topuntuk memantau kinerja server saya dan 2 dari proses java saya menunjukkan memori virtual hingga 800MB-1GB. Itu adalah hal yang buruk?

Apa yang dimaksud dengan memori virtual?

Dan oh btw, saya punya swap 1GB dan itu menunjukkan 0% digunakan. Jadi saya bingung.

Proses Java = 1 server Tomcat + daemon java saya sendiri Server = Ubuntu 9.10 (karmic)


Jawaban:


142

Memori virtual bahkan belum tentu memori. Sebagai contoh, jika suatu proses memori memetakan file besar, file tersebut sebenarnya disimpan dalam disk, tetapi masih membutuhkan "ruang alamat" dalam proses.

Ruang alamat (mis. Memori virtual dalam daftar proses) tidak memerlukan biaya apa pun; itu tidak nyata. Apa yang sebenarnya adalah kolom RSS (RES), yang merupakan memori penduduk. Itulah seberapa banyak memori aktual Anda yang digunakan oleh suatu proses.

Tetapi bahkan itu bukan jawaban keseluruhan. Jika suatu proses memanggil fork (), ia terbagi menjadi dua bagian, dan keduanya pada awalnya membagikan semua RSS mereka. Jadi, bahkan jika RSS awalnya 1 GB, hasil setelah forking akan menjadi dua proses, masing-masing dengan RSS 1 GB, tetapi Anda masih menggunakan memori hanya 1 GB.

Bingung belum? Inilah yang benar-benar perlu Anda ketahui: gunakan freeperintah dan periksa hasilnya sebelum dan sesudah memulai program Anda (on the +/- buffers/cacheline). Perbedaan tersebut adalah berapa banyak baru memori program yang baru-mulai digunakan.


2
"Periksa hasil sebelum dan setelah memulai program Anda", atau gunakan USS (Unique Set Size) seperti yang dikembalikan oleh smem.
Hubert Kario

Begitu juga ada alat yang memberikan jumlah sebenarnya dari memori yang digunakan, alat yang bukan pihak ketiga.
CMCDragonkai

@ CMCDragonkai Ya, gratis.
deviantfan

1
Jika saya memulai proses java via java -Xmx16g RunLong, yang akan mencadangkan 16GB memori untuk proses java, maka di VIRTatas, tampaknya 16GB dihitung. Dalam hal ini, apa jenis memori 16Gb ini, apakah itu memori yang dipetakan atau ..?
Eric Wang

1
@ EricWang, memori itu tidak dipetakan. Ini hanya permintaan ke OS untuk memesan memori yang mungkin diperlukan nanti (mungkin tidak pernah). (Setidaknya) di Linux, ini adalah panggilan mmap dengan bendera MAP_NORESERVE dan PROT_NONE (lihat os :: pd_reserve_memory calls anon_mmap: github.com/AdoptOpenJDK/openjdk-jdk11u/blob/… ); sebenarnya tidak ada memori yang dialokasikan secara default - yang hanya dilakukan kemudian pada saat program benar-benar membutuhkan memori untuk memenuhi permintaan alokasi objek.
Juraj Martinka

23

Dari halaman manual (1) teratas:

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.

Di mana RES berarti memori penduduk (memori fisik yang digunakan).

Sebenarnya itu tidak benar (lagi). Ketika dikatakan "swap," itu juga termasuk file yang telah dipetakan oleh program ke dalam ruang alamatnya, yang mungkin atau mungkin belum benar-benar mengkonsumsi RAM nyata. Memori ini didukung file tetapi tidak benar-benar bertukar.

VIRT juga termasuk halaman yang telah dialokasikan tetapi belum digunakan untuk apa pun. Setiap halaman dalam keadaan ini dipetakan ke kernel Zero Page (konsep brilian - Anda harus mencarinya) sehingga muncul di VIRT tetapi sebenarnya tidak mengkonsumsi memori apa pun.


2
well thats menarik, begitu juga VIRT = SWAP + RES, kenapa penggunaan SWAP saya nol, sedangkan memori virtual untuk 2 proses java mendekati 1GB ??
kapso

pada dasarnya Top shows .... Swap: total 1048568k, 0k digunakan, 1048568k gratis, 505728k di-cache
kapso

15
@ user42159 Jawaban ini SALAH! TIDAK ADA 'VIRT = SWAP + RES' di atas manusia! -m : VIRT/USED toggle Reports USED (sum of process rss and swap total count) instead of VIRT. Sangat disayangkan bahwa saya tidak bisa mengecilkan jawaban ini.
duleshi

3
Jawaban ini salah. DIGUNAKAN = Ukuran Res + Swap (dari Manajemen Fields atas, diakses dengan menekan tombol f ketika di atas. Juga dari halaman manual atas).
Jason S

15

Saya menemukan penjelasan dari Mugurel Sumanariu ini sangat jelas:

VIRTsingkatan ukuran virtual dari suatu proses, yang merupakan jumlah memori yang sebenarnya digunakan, memori yang telah dipetakan ke dalam dirinya sendiri (misalnya RAM kartu video untuk server X), file pada disk yang telah dipetakan ke dalamnya (sebagian besar terutama berbagi perpustakaan), dan memori dibagi dengan proses lain. VIRT mewakili berapa banyak memori yang dapat diakses oleh program saat ini.

RESsingkatan ukuran penduduk, yang merupakan representasi akurat dari berapa banyak memori fisik aktual yang dikonsumsi oleh suatu proses. (Ini juga berhubungan langsung dengan kolom% MEM.) Ini hampir selalu akan lebih kecil dari ukuran VIRT, karena sebagian besar program bergantung pada pustaka C.

SHRmenunjukkan seberapa besar ukuran VIRT sebenarnya dapat dibagi (memori atau perpustakaan). Dalam hal perpustakaan, itu tidak selalu berarti bahwa seluruh perpustakaan adalah penduduk. Misalnya, jika suatu program hanya menggunakan beberapa fungsi dalam pustaka, seluruh pustaka dipetakan dan akan dihitung dalam VIRT dan SHR, tetapi hanya bagian-bagian dari file pustaka yang berisi fungsi-fungsi yang digunakan yang benar-benar akan dimuat dan dihitung di bawah RES.


Saya mungkin hanya akan mengatakan kembali "VIRT mewakili berapa banyak memori yang dapat diakses oleh program saat ini." untuk sesuatu seperti "VIRT mewakili ukuran seluruh ruang program yang dapat dialamatkan pada saat ini." Oke, itu masih bisa menggunakan cat. Tapi intinya adalah, "berapa banyak memori" masih bisa memberi kesan kita sedang membahas RAM, ketika VIRT tidak ada hubungannya dengan ruang RAM. Faktanya, program besar akan sering memiliki ukuran VIRT yang beberapa GANDA dari total ukuran sistem RAM - karena VIRT hampir seluruhnya merupakan daerah alamat yang didukung file (AKA "disk not RAM").
FeRD

5

Kolom VIRT di ps / output atas hampir tidak relevan untuk mengukur penggunaan memori. Jangan khawatir tentang itu. Apache beban berat VIRT vs memori RES

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


Terima kasih, saya khawatir dan bingung, karena sementara penggunaan swap 0%, kolom memori virtual sangat tinggi. Dan juga saya hanya memiliki 1,7GB dari total memori fisik 2,7GB yang digunakan, sementara memori virtualnya tinggi?
kapso

2

Linux mendukung memori virtual, yaitu, menggunakan disk sebagai perpanjangan RAM sehingga ukuran efektif dari memori yang dapat digunakan tumbuh bersamaan. Kernel akan menulis isi blok memori yang saat ini tidak digunakan ke hard disk sehingga memori dapat digunakan untuk tujuan lain. Ketika konten asli diperlukan lagi, mereka dibaca kembali ke dalam memori. Ini semua dibuat sepenuhnya transparan bagi pengguna; program yang berjalan di Linux hanya melihat jumlah memori yang lebih besar tersedia dan tidak memperhatikan bahwa sebagian dari mereka berada pada disk dari waktu ke waktu. Tentu saja, membaca dan menulis hard disk lebih lambat (pada urutan seribu kali lebih lambat) daripada menggunakan memori nyata, sehingga program tidak berjalan secepat. Bagian dari hard disk yang digunakan sebagai memori virtual disebut ruang swap.

Linux dapat menggunakan file normal di sistem file atau partisi terpisah untuk ruang swap. Partisi swap lebih cepat, tetapi lebih mudah untuk mengubah ukuran file swap (tidak perlu mempartisi ulang seluruh hard disk, dan mungkin menginstal semuanya dari awal). Ketika Anda tahu berapa banyak ruang swap yang Anda butuhkan, Anda harus pergi untuk partisi swap, tetapi jika Anda tidak pasti, Anda dapat menggunakan file swap terlebih dahulu, gunakan sistem untuk sementara waktu sehingga Anda bisa merasakan berapa banyak swap Anda butuhkan, dan kemudian buat partisi swap ketika Anda yakin tentang ukurannya.

Anda juga harus tahu bahwa Linux memungkinkan seseorang untuk menggunakan beberapa partisi swap dan / atau bertukar file secara bersamaan. Ini berarti bahwa jika Anda hanya sesekali membutuhkan jumlah ruang swap yang tidak biasa, Anda dapat mengatur file swap tambahan pada saat-saat seperti itu, alih-alih menjaga seluruh jumlah yang dialokasikan sepanjang waktu.

Catatan tentang terminologi sistem operasi: ilmu komputer biasanya membedakan antara bertukar (menulis seluruh proses untuk bertukar ruang) dan paging (menulis hanya bagian ukuran tetap, biasanya beberapa kilobyte, pada suatu waktu). Paging biasanya lebih efisien, dan itulah yang dilakukan Linux, tetapi terminologi Linux tradisional berbicara tentang bertukar.

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


1
Jawaban ini menyebarkan kesalahpahaman bahwa memori virtual sama dengan bertukar atau paging. Menggunakan disk sebagai ekstensi RAM sudah ada sebelum memori virtual. Dan ada banyak sistem (seperti kebanyakan router SoHo) yang memiliki memori virtual tetapi tidak menggunakan disk sebagai perpanjangan RAM. (Dan ini juga bukan jawaban untuk pertanyaan OP, karena dia tidak menggunakan swap apa pun.)
David Schwartz

2

VIRtualkolom bagian atas, mengacu pada ruang-super (ruang konsumsi super) dari proses, yang prosesnya mungkin tidak benar-benar mengambil pada waktu berjalan. Ada kolom lain RESident, yang merujuk pada memori fisik aktual / ruang yang dialokasikan oleh proses, pada saat runtime.

Alasan perbedaan, antara keduanya, dapat dipahami dengan contoh: jika proses menggunakan perpustakaan tertentu, maka ukuran perpustakaan, juga akan membantu ke virtual-size. Namun, karena hanya sebagian perpustakaan yang akan digunakan (yaitu beberapa metode yang digunakan), sehingga akan membantu resident-size.

Rujuk untuk Info Lebih Lanjut


0

"VIRT" hanya membahas ruang, RES adalah memori "nyata", tetapi jumlah "SHR" (= dibagi) dari "RES" adalah bagian dari RES yang dibagi dengan proses lain. Jadi untuk sebagian besar proses, saya percaya bahwa dengan mengurangi SHR dari RES memberi Anda jumlah memori yang benar-benar disebabkan oleh proses khusus ini.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.