Cosa significa la dimensione della memoria virtuale nella parte superiore?


124

Sono in esecuzione topper monitorare le prestazioni del mio server e 2 dei miei processi Java mostrano memoria virtuale fino a 800 MB-1 GB. È una brutta cosa?

Cosa significa memoria virtuale?

E oh, a proposito, ho uno scambio di 1 GB e mostra lo 0% utilizzato. Quindi sono confuso.

Processo Java = 1 server Tomcat + mio server demone java = Ubuntu 9.10 (karmic)


Risposte:


142

La memoria virtuale non è nemmeno necessariamente memoria. Ad esempio, se una memoria di processo esegue il mapping di un file di grandi dimensioni, il file viene effettivamente archiviato sul disco, ma occupa comunque "spazio indirizzo" nel processo.

Lo spazio degli indirizzi (ad es. Memoria virtuale nell'elenco dei processi) non costa nulla; non è reale. Ciò che è reale è la colonna RSS (RES), che è la memoria residente. Ecco quanta parte della tua memoria effettiva sta occupando un processo.

Ma anche questa non è la risposta completa. Se un processo chiama fork (), si divide in due parti ed entrambe condividono inizialmente tutti i loro RSS. Quindi, anche se l'RSS fosse inizialmente di 1 GB, il risultato dopo il fork sarebbe di due processi, ciascuno con un RSS di 1 GB, ma useresti comunque solo 1 GB di memoria.

Ancora confuso? Ecco cosa devi veramente sapere: usa il freecomando e controlla i risultati prima e dopo aver avviato il tuo programma (sulla +/- buffers/cachelinea). Tale differenza è la quantità di nuova memoria del programma appena iniziato utilizzato.


2
"Controlla i risultati prima e dopo aver avviato il programma", in alternativa, utilizza USS (Unique Set Size) come restituito da smem.
Hubert Kario,

Quindi esiste uno strumento che fornisce la vera quantità di memoria utilizzata, strumenti che non sono di terze parti.
CMCDragonkai,

@CMCDragonkai Sì, gratis.
deviantfan,

1
Se avessi avviato un processo Java tramite java -Xmx16g RunLong, che avrebbe riservato la memoria da 16 GB per il processo Java, quindi all'inizio VIRT, sembra che il 16 GB sia conteggiato. In questo caso, qual è il tipo di questa memoria da 16 GB, è quella memoria mappata o ...?
Eric Wang

1
@EricWang, quella memoria non è mappata. È solo una richiesta al sistema operativo di riservare memoria che potrebbe essere necessaria in seguito (forse mai). (Almeno) su Linux, questa è una chiamata mmap con flag MAP_NORESERVE e PROT_NONE (vedi os :: pd_reserve_memory chiama anon_mmap: github.com/AdoptOpenJDK/openjdk-jdk11u/blob/… ); nessuna memoria viene effettivamente allocata per impostazione predefinita, ciò viene fatto solo successivamente nel momento in cui il programma ha davvero bisogno della memoria per soddisfare le richieste di allocazione degli oggetti.
Juraj Martinka,

23

Dalla pagina man superiore (1):

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.

Dove RES significa memoria RESidente (memoria fisica utilizzata).

In realtà non è più corretto (più). Quando dice "swap", che include anche i file che il programma ha mappato nel suo spazio di indirizzi, che potrebbe effettivamente non utilizzare ancora RAM reale. Questa memoria è supportata da file ma non è realmente scambiata.

VIRT include anche pagine che sono state allocate ma non ancora utilizzate per nulla. Qualsiasi pagina in questo stato è mappata alla pagina Zero del kernel (concetto brillante - dovresti cercarla) in modo che appaia in VIRT ma in realtà non consuma memoria.


2
bene questo è interessante, quindi è VIRT = SWAP + RES, come mai il mio utilizzo di SWAP è zero, mentre la memoria virtuale per i processi 2 Java è vicina a 1 GB ??
Kapso

sostanzialmente Top show .... Scambio: 1048568k totali, 0k usati, 1048568k gratuiti, 505728k memorizzati nella cache
kapso

15
@ user42159 Questa risposta è SBAGLIATA! Non c'è "VIRT = SWAP + RES" nella parte superiore dell'uomo! -m : VIRT/USED toggle Reports USED (sum of process rss and swap total count) instead of VIRT. È un peccato non poter sottovalutare questa risposta.
Duleshi,

3
Questa risposta non è corretta USATO = Ris + Dimensione swap (dalla Gestione campi superiore, cui si accede premendo il tasto f quando si trova in alto. Anche dalla pagina man superiore).
Jason S,

15

Ho trovato molto chiara questa spiegazione del Mugurel Sumanariu :

VIRTindica la dimensione virtuale di un processo, che è la somma della memoria che sta effettivamente utilizzando, la memoria che ha mappato su se stessa (ad esempio la RAM della scheda video per il server X), i file su disco che sono stati mappati in esso (la maggior parte in particolare librerie condivise) e memoria condivisa con altri processi. VIRT rappresenta la quantità di memoria a cui il programma è in grado di accedere al momento attuale.

RESindica la dimensione del residente, che è una rappresentazione accurata di quanta memoria fisica effettiva sta consumando un processo. (Ciò corrisponde anche direttamente alla colonna% MEM.) Questo sarà praticamente sempre inferiore alla dimensione VIRT, poiché la maggior parte dei programmi dipende dalla libreria C.

SHRindica quanta parte della dimensione VIRT è effettivamente condivisibile (memoria o librerie). Nel caso delle biblioteche, ciò non significa necessariamente che l'intera biblioteca sia residente. Ad esempio, se un programma utilizza solo alcune funzioni in una libreria, l'intera libreria viene mappata e verrà conteggiata in VIRT e SHR, ma solo le parti del file della libreria contenente le funzioni utilizzate verranno effettivamente caricate e conteggiate sotto RES.


Vorrei forse solo riformulare "VIRT rappresenta la quantità di memoria a cui il programma è in grado di accedere al momento attuale". a qualcosa come "VIRT rappresenta la dimensione dell'intero spazio indirizzabile del programma al momento attuale". OK, potrebbe ancora usare lo smalto. Ma il punto è che "quanta memoria" può ancora dare l'impressione che stiamo discutendo di RAM, quando VIRT non ha nulla a che fare con lo spazio RAM. In effetti, i programmi di grandi dimensioni avranno spesso una dimensione VIRT che è parecchi MULTIPLI della dimensione totale della RAM di sistema - perché VIRT è quasi interamente regioni di indirizzi supportate da file ("disco non RAM" di AKA).
FeRD

5

La colonna VIRT nell'output ps / top è quasi irrilevante per misurare l'utilizzo della memoria. Non ti preoccupare. Apache VIRT per carichi pesanti e memoria RES

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


Grazie, mi sono preoccupato e confuso, perché mentre l'utilizzo dello swap era dello 0%, la colonna di memoria virtuale è molto alta. E ho anche solo 1,7 GB della memoria fisica totale da 2,7 GB utilizzata, mentre la memoria virtuale è alta?
Kapso,

2

Linux supporta la memoria virtuale, ovvero l'utilizzo di un disco come estensione della RAM in modo che le dimensioni effettive della memoria utilizzabile crescano di conseguenza. Il kernel scriverà il contenuto di un blocco di memoria attualmente inutilizzato sul disco rigido in modo che la memoria possa essere utilizzata per un altro scopo. Quando i contenuti originali sono nuovamente necessari, vengono nuovamente letti in memoria. Tutto ciò è reso completamente trasparente per l'utente; i programmi in esecuzione su Linux vedono solo la maggiore quantità di memoria disponibile e non si accorgono che parti di essi risiedono di tanto in tanto sul disco. Naturalmente, leggere e scrivere sul disco rigido è più lento (nell'ordine di mille volte più lento) rispetto all'utilizzo della memoria reale, quindi i programmi non funzionano così velocemente. La parte del disco rigido utilizzata come memoria virtuale è denominata spazio di scambio.

Linux può usare un normale file nel filesystem o una partizione separata per lo spazio di swap. Una partizione di swap è più veloce, ma è più facile cambiare la dimensione di un file di swap (non è necessario ripartizionare l'intero disco rigido e installare tutto da zero). Quando sai di quanto spazio di swap hai bisogno, dovresti scegliere una partizione di swap, ma se non sei sicuro, puoi prima utilizzare un file di swap, utilizzare il sistema per un po 'in modo da poter avere un'idea di quanto swap tu necessario, quindi crea una partizione di swap quando sei sicuro delle sue dimensioni.

Dovresti anche sapere che Linux consente di utilizzare più partizioni di swap e / o file di swap contemporaneamente. Ciò significa che se solo occasionalmente è necessaria una quantità insolita di spazio di scambio, è possibile impostare un file di scambio aggiuntivo in tali momenti, invece di mantenere l'intero importo allocato in ogni momento.

Una nota sulla terminologia del sistema operativo: l'informatica di solito distingue tra scambio (scrivendo l'intero processo nello spazio di scambio) e paginazione (scrivendo solo parti di dimensioni fisse, di solito pochi kilobyte alla volta). Il paging di solito è più efficiente, ed è quello che fa Linux, ma la terminologia tradizionale di Linux parla comunque di scambio.

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


1
Questa risposta diffonde l'idea sbagliata che la memoria virtuale è la stessa dello scambio o del paging. L'uso del disco come estensione della RAM precede la memoria virtuale. E ci sono molti sistemi (come la maggior parte dei router SoHo) che hanno memoria virtuale ma non usano il disco come estensione della RAM. (E questa non è nemmeno la risposta alla domanda del PO, dato che non sta usando alcuno scambio.)
David Schwartz,

2

VIRtualcolonna della parte superiore, si riferisce al super-spazio (spazio di super consumo) del processo, che il processo potrebbe non effettivamente prendere in fase di esecuzione. Esiste un'altra colonna RESident, che si riferisce alla memoria fisica effettiva / spazio allocato dal processo, in fase di esecuzione.

La ragione della differenza, tra i due, può essere compresa nell'esempio: se il processo utilizza determinate librerie, anche le dimensioni della libreria contribuiranno a virtual-size. tuttavia, poiché solo una parte della libreria verrebbe utilizzata (ovvero alcuni metodi in uso), in modo che possa essere di aiuto resident-size.

Fare riferimento per ulteriori informazioni


0

"VIRT" si limita a indirizzare lo spazio, RES è la memoria "reale", ma la quantità "SHR" (= condivisa) di "RES" è la parte di RES condivisa con altri processi. Quindi, per la maggior parte dei processi, credo che sottraendo SHR da RES si ottiene la quantità di memoria che è realmente attribuibile a questo particolare processo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.